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