我在合并同事的提交时犯了一些错误。现在,我们已经发现了它,我们需要再次应用旧提交,以手动选择文件中的更改。情况如下所示:
A-- /--F--
C--D--E H--I
B--/^ --G--/ ^
| |
WRONG MERGE MASTER
我需要 git 再次要求我将 B 与 I 合并,就像 B 在历史上从未出现过一样。换句话说,我需要 git 要求我为所有在 B 中不同的文件选择合并,并且我提交。做这样的事情的最佳方法是什么?我可以通过樱桃采摘来实现这一点吗?如何?
您可以使用提交复制技巧:
# 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
......使用新提交重新创建主题分支,以便可以成功重新合并
好吧,我终于解决了这个问题。我从B
创建了差异(针对 master,在我的示例中I
),并在 meld difftool 中手动应用所有更改:
[master]$ yes | git difftool <B hash> -t meld
然后,添加所有更改的文件并提交。
git revert -m 1 <commit>
还原有问题的合并提交,然后再次使用git merge <B_branch>
。这会将还原提交添加到您的历史记录中。否则,您可以使用git rebase -i
从历史记录中删除 B 的提交。后者对协作工作的破坏性更大,因为所有 WIP 和所有协作者现在都必须重置其master
分支。
如果您不介意还原提交,我强烈建议您这样做。这是获得所需内容的最简单方法。但是,如果 D、E、F、G、H 或 I 基于 B 的更改集,则还原可能会变得复杂。
假设主控已签出
git branch temp <sha1 of B>
创建对旧提交的引用。
git rebase --preserve-merges -i <sha1 of A>
然后取出应该是合并提交的第一行。
现在,您所需要的只是取回您的 B
git merge temp