[英]Git: how to revert a branch merge without overwriting history?
我有两个分支: master
和opengl
。 我最近完成了opengl
分支的实现(或者至少是这样想的),并决定将其合并到master
:
git checkout master
git merge opengl
git push
完成此操作后,正在master
分支上工作的几个开发人员撤消了我的更改,结果发现我的实现与他们的某些代码冲突。 因此,我想还原master
分支上的合并操作,但不覆盖历史记录。
请注意,我希望最终能够将opengl
分支合并到master
(修复所有错误之后)。 因此,简单地检出较旧版本的master
并提交将不起作用-当我尝试合并它时,新创建的提交将取消对opengl
更改。
谢谢。
编辑:事实证明这不是 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
恢复它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.