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

ili*_*ans 12 git

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

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

这是简化的事件链:

$ git checkout dev
$ git branch xyz
$ git checkout xyz
$ git add files/foo.xyz
$ git commit -m "blargh"
Run Code Online (Sandbox Code Playgroud)

在这里意外合并发生:

$ git checkout dev
$ git merged xyz
$ git push origin dev
Run Code Online (Sandbox Code Playgroud)

这是我试图挽救这一天:

$ git revert <SHA>
$ git push
Run Code Online (Sandbox Code Playgroud)

恢复提交到位,每个人都很开心

... more work happens ...
Run Code Online (Sandbox Code Playgroud)

那么,现在终于合并xyz了:

$ git checkout xyz
$ ls files/foo.xyz
files/foo.xyz
$ git checkout dev
$ git merge xyz
$ ls files/foo.xyz
File not found
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

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

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

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

Mar*_*air 15

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

如果您已经与可能已经提取该版本的其他开发人员共享了合并版本,那么您完全可以认为git revert合并提交是正确的.

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

这实际上是git中的经典问题.在Pro Git博客的这篇文章中提出了一个很好的(但非显而易见!)处理这个问题的方法(并且很好地解释了)- 简而言之,这个想法是在再次合并分支之前恢复还原提交.

更新:也有一个同样的问题的另一个讨论被Linux Torvalds的,可能也有帮助.

  • 第一个链接已损坏:_“已移动!之前在本网站博客部分找到的技术内容已集成到 Pro Git 书籍的第二版中。”_ (2认同)