4

以下に説明する私のコミットツリー:

--(+A)--(+B)-+-(-B)--(+E)--(master: AE)
              \
               +--(+C)--(+D)--(branch: ABCD)

一部の変更はmasterで元に戻されました。ブランチからの変更をマスターにマージして、元に戻したコミットを元に戻す必要があります。

ワンステップウェイは存在しますか?それとも、ブランチをマージする前にマスターするチェリーピック(B)は 1 つだけですか?

PS 最終マスターは次のようになります: (ABCDE) - 順序は重要ではありません

4

6 に答える 6

4

私はこのようにします:

git checkout branch
git merge $minusB^    # only if -B is not right after the fork point
git merge -s ours $minusB
git merge master

つまり、B の反転の直前まですべてをマージしてから、B の反転をマージしますが、それによってもたらされる変更を無視し、最後にマスターの残りをマージします。

于 2016-12-06T11:55:39.090 に答える
1

コミットの順序として絶対に ABCDE が必要な場合は、cherry-pickC と D が必要になります。これは (A) - (+B) - (-B) - (E) - (C) - (D) になります。 )。次にgit rebase、(-B) を削除して、C と D を E の前に並べ替えることができます。

そうする場合、ブランチをマージしたくありません。 git cherry-pick同じ変更を含む新しいコミットを作成します。したがって、マージすると、いくつかの問題が発生する可能性があります。

http://git-scm.com/book/en/Git-Branching-Rebasing#The-Perils-of-Rebasing

リモート ブランチを扱っていて、これらのコミットがすべてプッシュされている場合。これを行うべきではありません。リモートで履歴を変更しているため、他の人が変更を取得する際に問題が発生する可能性があります。マスターへの分岐だけmergeで、競合を正しく解決すると、探している状態のコードになります。線形の git 履歴があるのは良いことですが、常に必要というわけではありません。ログに復帰コミットがあることは悪いことではありません。

于 2013-11-18T15:35:33.750 に答える
1

近い問題に直面しましたが、マスターからコミットを削除したり、並べ替えたりする必要はありません。そして、適切なコミット履歴を取得するために、ブランチ ABCD をリベースする必要がありました。また、B を再度適用することは避けたかったのです。それが私がこの状況を回避した方法です。

--(+A)--(+B)--(-B)-+-(+E)--(master: AE)
            |\
            | +-(+C)--(+D)--(branch: ABCD)
            |
             \+ cherrypick (-B) + revert(-B) + merge ABCD (+C') -(+D') + rebase AE (+E)  -- (branch: AB-BE--BC'D')

得られたブランチ AB-B--BEC'D' は、容易にマスターにマージしたり、さらなる開発に使用したりできます。

于 2016-12-06T10:45:00.320 に答える