22

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

git checkout master
git merge opengl
git push

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

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

谢谢你。

4

2 回答 2

19

cebewee提到的文档“如何恢复错误的合并”解释了为什么 git revert 在恢复合并时很棘手。

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

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

于 2012-11-16T09:13:39.563 回答
4

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


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

git branch erroneousMerge master

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

然后,重置master为引用合并前的最后一次提交;假设它是 commit 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

git rebase --onto master abc123 oldMaster

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

于 2011-03-21T21:10:58.467 回答