2

次のシナリオを検討してください。

  1. マスターからブランチをチェックアウトしました
  2. 私はいくつかのコミットをしました
  3. 更新されたマスターをマージしました
  4. さらにいくつかのコミットを行いました
  5. ここで、ポイント 2 からのコミットが影響を受けないように、ポイント 4 からのリベース コミットが必要です。

したがって、最初に持っている場合:

     (1)         (2)
x--x--x--x--x--x--x         master
       \     \
        y--y--Y--y--y       dev
          (2)(3)   (4)

私は手に入れたい:

     (1)         (2)
x--x--x--x--x--x--x             master
       \           \
        y--y--------Y'--y'--y'  dev
          (2)      (5)     (5)

私がやるgit rebase masterと、2と4の両方からコミットがリベースされ、3からマージが削除されます。それは私が望むものではありません。

git merge masterまた、3 からのマージ コミットの前に実行し、3 からのマージ後に最後のマージを移動し、それgit rebase -i -pを 3 からのマージに修正/スカッシュするオプションもあります。更新: それほど簡単には機能しません。Git は 2 つのマージを押しつぶすことを拒否します。この問題: git rebase interactive: squash merge commits together

4

3 に答える 3

3

私とVonCの回答を使用すると、より自動化可能なソリューションが作成されました。

git checkout -b tmp Y
git merge master 
git reset --soft HEAD^^ 
git rev-parse master > .git/MERGE_HEAD 
git commit -C Y
git checkout -
git rebase --onto tmp Y
git branch -d tmp

Y - 延長されるマージ コミットです。

そして、それは次のように機能します:

x--x--x--x--x--x--x         master
       \     \
        y--y--Y--y--y       dev

x--x--x--x--x--x--x         master
      |      \
       \      Y             tmp
        \    / \
         y--y   y--y        dev

x--x--x--x--x--x--x         master
      |      \     \
       \      Y-----Y'      tmp
        \    / \
         y--y   y--y        dev

x--x--x--x--x--x--x         master
      |            \
      |      -------Y'      tmp
       \    /
        y--y--Y--y--y       dev

x--x--x--x--x--x--x         master
      |            \
      |      -------Y'      tmp
       \    /        \
        y--y          y--y  dev

x--x--x--x--x--x--x           master
       \           \
        y--y--------Y'--y--y  dev
于 2013-09-25T23:17:34.100 に答える
2

あなたはから始めます:

     (1)
x--x--x--x--x--x--x         master
       \     \
        y--y--Y--y--y       dev
          (2)(3)   (4)

次のことを行いますgit rebase --onto

git branch dev1 Y^
git rebase --onto master Y^ dev

Y^マージ コミットの最初の親を参照しますY: ここでは ' y' であり、' ' ではありませんx
祖先の参照」を参照してください。

最初の親はマージしたときにいたブランチで、2 つ目はマージしたブランチのコミットです。

最終的には次のようになります。

     (1)
x--x--x--x--x--x--x             master
       \           \
        y--y        Y'--y'--y'  dev
          (2)      (5)
        (dev1)

これにより、最初のブランチが 2 つに分割さdevれ、最後のdevコミットのみが の上に適用されますがmaster、最初のdevコミットは変更されず、ブランチによって参照されるようになりdev1ます。

あなたは試すことができます:

git rebase -p --onto master `Y^` dev

y(つまりY^) と新しくリベースされた の間の関係が保持されているかどうかを確認しY'ます。しかし、私はそれが可能であることを疑います。

-pです--preserve-merge

于 2013-09-24T10:34:42.403 に答える
1

私は次のことをすることになります:

git rebase -i -p Y^

ファイルで、次の行をマージして次の行に追加します (おそらく最初の行の後)。

exec sh -c "git merge master; git reset --soft HEAD^^; git rev-parse master > .git/MERGE_HEAD; git commit -C `git rev-parse HEAD`"
于 2013-09-25T22:56:54.173 に答える