我有两个分支:master
和opengl
。我最近完成了opengl
分支的实现(至少我是这么认为的),并决定将其合并到master
中
git checkout master
git merge opengl
git push
在我这样做之后,几个在master
分支工作的开发人员取消了我的更改,结果发现我的实现与他们的一些代码发生了冲突。因此,我想恢复master
分支上的合并操作,但不覆盖历史记录。
请注意,我希望最终能够将opengl
分支合并到master
中(在我修复所有错误之后)。因此,简单地签出旧版本的master
并提交它是行不通的-新创建的提交会在我尝试合并它时从opengl
中取消我的更改。
谢谢。
发布于 2012-11-16 17:13:40
cebewee提到的文档"How to revert a faulty merge“解释了为什么在恢复合并时git恢复是棘手的。
因此,合并将仍然存在,并且它仍将被视为将两个分支连接在一起,并且未来的合并将看到该合并作为最后的共享状态-而恢复合并带来的恢复将根本不会影响到这一点。
如果你认为“还原”就是“撤销”,那么你将永远错过还原的这一部分。
是的,它撤消数据,但不,它不撤消历史记录。
git revert
在这里是正确的解决方案,但当您想要再次合并该分支时,它将在未来产生后果。
下一次合并必须首先“还原还原”,然后合并分支。
发布于 2011-03-22 05:10:58
编辑:事实证明这并不是OP所要求的,但我会将它保留在这里,以防有人碰巧在寻找涉及重写历史的解决方案。
首先,如果希望在本地保留合并提交,请创建一个新分支,这样在移动master
之后,提交就不会“消失”
git branch erroneousMerge master
如果其他开发人员在错误的合并后也提交了提交,他们也必须这样做!
然后,重置master
以引用合并之前的最后一次提交;假设它是提交e498b2...
git checkout e498b2
git branch -f master
现在,您可以推送修正后的master
(-f
指示您希望让服务器将其master
分支重置为您使其指向的提交,即使此提交是它在存储库中指向的提交的祖先):
git push -f origin master
现在,其他开发人员可以更新他们的master
以匹配服务器的master
(-f
表示他们接受分支已经向后移动):
git fetch -f origin master:master
如果其他开发人员在错误的合并之后进行了更改(假设合并提交为abc123
,他们可以使用rebase
将更改移动到更正后的master
git rebase --onto master abc123 oldMaster
如果您在某个时刻搞砸了,并且因为不再有任何分支指向提交而导致“丢失”提交,那么您可以使用git fsck --lost-found
来恢复它们。
https://stackoverflow.com/questions/5383659
复制相似问题