首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Git:如何在不覆盖历史的情况下恢复分支合并?

Git:如何在不覆盖历史的情况下恢复分支合并?
EN

Stack Overflow用户
提问于 2011-03-22 04:59:55
回答 2查看 56.5K关注 0票数 22

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

代码语言:javascript
复制
git checkout master
git merge opengl
git push

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

请注意,我希望最终能够将opengl分支合并到master中(在我修复所有错误之后)。因此,简单地签出旧版本的master并提交它是行不通的-新创建的提交会在我尝试合并它时从opengl中取消我的更改。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-16 17:13:40

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

因此,合并将仍然存在,并且它仍将被视为将两个分支连接在一起,并且未来的合并将看到该合并作为最后的共享状态-而恢复合并带来的恢复将根本不会影响到这一点。

如果你认为“还原”就是“撤销”,那么你将永远错过还原的这一部分。

是的,它撤消数据,但不,它不撤消历史记录。

git revert在这里是正确的解决方案,但当您想要再次合并该分支时,它将在未来产生后果。

下一次合并必须首先“还原还原”,然后合并分支。

票数 19
EN

Stack Overflow用户

发布于 2011-03-22 05:10:58

编辑:事实证明这并不是OP所要求的,但我会将它保留在这里,以防有人碰巧在寻找涉及重写历史的解决方案。

首先,如果希望在本地保留合并提交,请创建一个新分支,这样在移动master之后,提交就不会“消失”

代码语言:javascript
复制
git branch erroneousMerge master

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

然后,重置master以引用合并之前的最后一次提交;假设它是提交e498b2...

代码语言:javascript
复制
git checkout e498b2
git branch -f master

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

代码语言:javascript
复制
git push -f origin master

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

代码语言:javascript
复制
git fetch -f origin master:master

如果其他开发人员在错误的合并之后进行了更改(假设合并提交为abc123,他们可以使用rebase将更改移动到更正后的master

代码语言:javascript
复制
git rebase --onto master abc123 oldMaster

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5383659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档