2010-11-03 254 views
15

因此,我的一个同事偶然做了合并,实际上只保留树的一侧。于是他开始合并,删除了合并引入的所有更改,然后进行合并。你如何恢复错误的混帐合并提交

这是一个简单的测试用例,我在测试回购上做过。这个回购有三个分支。 idx是意外合并的主题分支,master是主线。 dev仅仅是对-m如何恢复的测试,所以你可以忽略它。

alt text

我想要做的是恢复故障合并。因此,从主我尝试运行git revert -m 1 <sha1sum of faulty merge>但随后的git与回应:

# On branch master        
nothing to commit (working directory clean) 

所以它实际上并没有创建一个还原提交该撤销合并。我相信会发生这种情况是因为合并实际上并未包含任何实际更改。

如果你想玩弄我的测试回购可以从here

下载这是一个git的bug,还是我失去了一些东西?

+0

我不知道你为什么说“它实际上不创建合并提交” - 它不应该。您应该期待它创建一个正常的提交,这将反转合并提交的效果。 – Cascabel 2010-11-03 15:40:52

+0

是的,对不起,这应该是说它实际上并没有创建一个恢复提交。 – 2010-11-03 23:51:44

回答

7

这里最好的经验法则是永远不会改变你的回购的公告后的历史。它真的把事情搞砸了。但我不认为这种情况可以避免它。

我认为这里有几个选择,但最简单的是做一个rebase。使用您的回购,这些都是我所使用的命令:

git rebase -i ead3646 

然后,当交互shell出现,请卸下出现故障的整个行提交。保存,你应该清盘一个新的历史这样的:

* f0ab6d5 more normal work on dev 
* ebb5103 idx commit 
* ead3646 master change 
* 582c38c dev commits 
* f4b8bc6 initial commit 

获取你们两个(及其他)回到同步是要采取一些分支,推,收发电子邮件和午餐买盘。

+0

恢复同步并不是那么复杂。因为我从来没有在其他地方看过食谱,所以我写了一篇文章发布在这里:http:// stackoverflow。com/questions/4084868 – 2010-11-03 07:09:48

+1

我没有机会仔细阅读关于合并提交主题的'git revert'文档,但'-m'选项专门用于允许它在合并提交上进行操作。很明显,应该有一种方法来解决问题,而问题在于为什么它在这种情况下不起作用。 – Cascabel 2010-11-03 15:40:25

6

git文档说这是关于恢复合并:http://code.google.com/p/git-core/source/browse/Documentation/howto/revert-a-faulty-merge.txt 虽然这主要是关于恢复导致不良更改的合并,而不是恢复正确执行的合并。

基本上,还原合并将撤消数据更改,但不会更改历史(图形)。因此,预计恢复错误的合并不会产生任何效果。

解决这个问题的方法之一是再次进行合并,然后将结果合并到master中。在你的例子中,这可能是这样的:

git checkout -b temp/merge-fixup ead364653b601f48159bca5cb59d6a204a426168 
git merge 2fce9bfe8f721c45ea1ed5f93176322cac60a1d9 
git checkout master 
git merge temp/merge-fixup 
git branch -d temp/merge-fixup 
+2

现在,文档似乎已经消失。 – kojiro 2011-12-05 22:56:20

+1

@kojiro:到目前为止,谷歌搜索“revert-a-faulty-merge.txt”可以产生大量的镜像。 – 2012-01-30 13:02:14