合并实际完成时,Git恢复合并提交会导致问题。

时间:2011-09-14 15:09:18

标签: git

我们意外地将分支XYZ合并到DEV中并将其推送到原始仓库。这是使用--no-ff完成的,以创建单独的合并提交。一旦我意识到错误的合并,我做了一个git revert来创建一个恢复提交并将其推出。一切都很好,有很多欢乐......

直到我们尝试将XYZ合并到dev中。最初的混淆是由于在合并的dev分支上找不到添加到XYZ的大量文件。然后我意识到DEV分支有恢复提交,删除了由于合并而添加到XYZ以及随后到DEV的所有文件。

以下是简化的事件链:

$ git checkout dev
$ git branch xyz
$ git checkout xyz
$ git add files/foo.xyz
$ git commit -m "blargh"

这里发生意外合并:

$ git checkout dev
$ git merged xyz
$ git push origin dev

这是我试图挽救这一天:

$ git revert <SHA>
$ git push

恢复提交到位,每个人都很高兴

... more work happens ...

然后,现在终于合并xyz了:

$ git checkout xyz
$ ls files/foo.xyz
files/foo.xyz
$ git checkout dev
$ git merge xyz
$ ls files/foo.xyz
File not found

所以我的问题是:

a)什么是回滚提交的好方法,特别是如果它们被推送到其他回购? git revert似乎是正确的做法,但在合并问题之后我不再那么肯定......

b)假设git revert是正确的方法,如何处理上述合并场景?

PS:如果这个问题已经得到解答我很抱歉,但我真的不知道该搜索什么。如果有答案,请指导我。谢谢。

1 个答案:

答案 0 :(得分:14)

  

a)什么是回滚提交的好方法,特别是如果它们被推送到其他回购? git revert似乎是正确的做法,但在合并问题之后我不再那么肯定......

如果您已经与可能已经撤消该版本的其他开发人员共享了合并版本,那么git revert合并提交是正确的做法是完全正确的。

  

b)假设git revert是正确的方法,如何处理上述合并场景?

这实际上是git中的经典问题。在this post from the Pro Git blog中建议(并且很好地解释)一个很好的(但非显而易见的!)处理这个问题的方法 - 简而言之,这个想法是在再次在分支中合并之前恢复恢复提交。

更新: Linux Torvalds还有一个another discussion of the same problem也可能会有所帮助。