Git:如何在不覆盖历史记录的情况下还原分支合并?

时间:2011-03-21 20:59:55

标签: git merge branch revert

我有两个分支:masteropengl。我最近完成了opengl分支的实现(或者至少我是这么认为),并决定将其合并到master中:

git checkout master
git merge opengl
git push

在我这样做之后,一些正在master分支上工作的开发人员撤消了我的更改,结果发现我的实现与他们的一些代码冲突了。因此,我想在master分支上恢复合并操作,但不覆盖历史记录。

请注意,我希望能够最终将opengl分支合并到master(在我修复所有错误之后)。因此,只需检查旧版master并提交它就行不通了 - 当我尝试合并时,新创建的提交将从opengl取消我的更改。

谢谢。

2 个答案:

答案 0 :(得分:18)

How to revert a faulty merge提到的文档“cebewee”解释了为什么在恢复合并时git revert很棘手。

  

所以合并仍然存在,它仍将被视为将两个分支连接在一起,未来的合并将看到合并为最后一个共享状态 - 以及还原合并的恢复所带来的根本不会影响到这一点   如果你认为“恢复”为“撤消”,那么你将永远错过这部分恢复   是的,它会撤消数据,但不会,它不会撤消历史记录。

git revert在这里是正确的解决方案,但是当您想要再次合并该分支时,将会产生影响。
然后,下一次合并将首先“恢复恢复”,然后合并分支。

答案 1 :(得分:4)

编辑:这就是是OP所要求的,但我会保留在这里以防万一有人应该找到一个解决方案< em>确实涉及重写历史。


首先,如果要在本地保留合并提交,请创建一个新分支,以便在移动master后提交不会“消失”:

git branch erroneousMerge master

如果其他开发人员在错误合并后也提交了提交,他们也必须这样做!

然后,重置master以引用合并前的最后一次提交;让我们说它是提交e498b2...

git checkout e498b2
git branch -f master

现在,您可以推送更正的master-f表示您希望服务器将其master分支重置为您指向的提交,即使此提交是它在存储库中指向的提交的祖先:

git push -f origin master

现在,其他开发人员可以更新他们的master以匹配服务器(-f表示他们接受分支已向后移动):

git fetch -f origin master:master

如果其他开发人员在错误合并后进行了更改(假设合并提交为abc123,则他们可以使用rebase将更改移至更正的master:< / p>

git rebase --onto master abc123 oldMaster

如果你在某个时候搞砸了并且因为没有任何分支指向它们而导致“丢失”提交,你可以使用git fsck --lost-found来恢复它们。