8

同僚のコミットをマージするときにいくつかの間違いを犯しました。今、それを発見したので、古いコミットを再度適用して、ファイルの変更を手動で選択する必要があります。状況は次のようになります。

A--\       /--F--\
    C--D--E       H--I
B--/^      \--G--/   ^
    |                |
WRONG MERGE       MASTER

Bが歴史に一度もなかったように、BをIとマージするようにもう一度尋ねるためにgitが必要です。つまり、B で異なるすべてのファイルのマージを選択するように git に依頼し、コミットする必要があります。そのようなことをするための最良のアプローチは何ですか?チェリーピックでこれを達成できますか? どのように?

4

4 に答える 4

7

コミット複製のトリックを使用できます:

# make a branch named B started on the commit B
git checkout -b B <sha1 id of the commit B> 
# it creates a branch which starts at a commit
# right before B and has exact copy of commit as B,
# but with a different sha1 id.
git rebase --no-ff HEAD~1

# now we do simple merge
git checkout master
git merge B

また、さまざまなコミットを使用してトリックを作成し、日付、作成者、コミット メッセージなどを保持することもできます。

実際、あなたのシナリオはドキュメントに記載されています:

--no-ff... 新しいコミットでトピック ブランチを再作成して、正常に再マージできるようにします

于 2012-08-10T19:27:47.983 に答える
2

さて、私は最終的にこの方法で解決しました。B(この例ではマスターに対して)差分を作成Iし、meld difftool のすべての変更を手動で適用しました。

[master]$ yes | git difftool <B hash> -t meld

次に、変更されたすべてのファイルを追加してコミットしました。

于 2012-08-11T09:59:29.617 に答える
1

問題のあるマージコミットを元に戻してから、もう一度git revert -m 1 <commit>使用することができgit merge <B_branch>ます。これにより、履歴に復帰コミットが追加されます。git rebase -iそれ以外の場合は、履歴から B のコミットを消去するために使用できます。後者は、すべての WIP とすべての共同作業者がmasterブランチをリセットする必要があるため、共同作業にとってより破壊的です。

revert commit を気にしないのであれば、強くお勧めします。欲しいものを手に入れる最も簡単な方法です。ただし、D、E、F、G、H、または I が B の変更セットに基づいている場合、復帰は複雑になる可能性があります。

于 2012-08-10T16:17:49.480 に答える
1

マスターがチェックアウトされていると仮定

git branch temp <sha1 of B>

古いコミットへの参照を作成します。

git rebase --preserve-merges -i <sha1 of A>

次に、マージコミットである必要がある最初の行を取り出します。

Bを取り戻すために必要なのは、

git merge temp
于 2012-08-10T23:45:11.290 に答える