我有两个分支:master
和opengl
。我最近完成了opengl
分支的实现(或者至少我是这么认为),并决定将其合并到master
中:
git checkout master
git merge opengl
git push
在我这样做之后,一些正在master
分支上工作的开发人员撤消了我的更改,结果发现我的实现与他们的一些代码冲突了。因此,我想在master
分支上恢复合并操作,但不覆盖历史记录。
请注意,我希望能够最终将opengl
分支合并到master
(在我修复所有错误之后)。因此,只需检查旧版master
并提交它就行不通了 - 当我尝试合并时,新创建的提交将从opengl
取消我的更改。
谢谢。
答案 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
来恢复它们。