在主服务器上将旧的git提交与HEAD合并

时间:2012-08-10 16:09:10

标签: git revision-history git-cherry-pick

在合并同事的提交时我犯了一些错误。现在,我们已经发现了它,我们需要再次应用旧提交,手动选择文件中的更改。情况如下:

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

我需要git再次要求我将B与我合并,就像B从未在历史上那样。换句话说,我需要git让我为B和I提交的所有文件选择合并。做这种事的最佳方法是什么?我可以用樱桃酱来实现吗?怎么样?

4 个答案:

答案 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