如何取消合并(稍后合并)

时间:2016-03-20 04:03:11

标签: git merge

使用Git恢复提交很简单。

但是如果我想从合并中恢复提交以取消它并稍后合并呢?

master--\--------------/------revert-merge------/------------------
         \            /                        /  merge nothing                 
          \--branch--/----no-modification-----/------    

如果我在第一次合并后再次合并,Git不会接受我的更改,因为我之前已经合并了,而某人(我或其他人)还原了这些行,Git不知道为什么。

Git看到我已经进行了合并然后还原它,所以当我进行第二次合并时,它不知道恢复的原因,Git认为没有更多的变化。

因此,当我想要取消提交时,我应该做一个简单的还原。取消/推迟合并的正确操作是什么?

这可以帮助很多https://www.git-scm.com/blog/2010/03/02/undoing-merges.html

2 个答案:

答案 0 :(得分:2)

Linus(他写过Git)有一篇关于这个场景here的精彩文章。

总结一下,归结为两个选项:

选项1 进行错误合并,恢复合并,然后再进行,再次合并分支之前,还原恢复。恢复还原意味着您会收到不良更改,然后通过再次合并您的分支来修复它们。正如你所提到的,这种方法的缺点是你必须找到恢复并记住在再次合并你的分支之前还原它。

---o---o---o---M---x---x---W---x---Y---*
              /                       /
      ---A---B-------------------C---D

A和B是糟糕的提交,M是合并,W恢复M,Y恢复W。

选项2 进行错误合并,还原合并,然后创建一个全新的分支(通过重做或可能挑选更改)。此选项的缺点是您必须创建另一个单独的分支。但好处是你不必记得恢复还原。

---o---o---o---M---x---x---W---x---x
          /                 \
  ---A---B                   A'--B'--C'

A和B是糟糕的提交,M是合并,W还原M。

当然,最好的选择可能是避免将东西合并到未准备好合并为master的master中。因为清理它的选项都不是很好。

答案 1 :(得分:0)

  

使用Git恢复提交很简单。但是,如果我想从合并中恢复提交以取消它以便稍后合并,该怎么办?

几个选项:

git reflog

首先你可以使用git reflog - 在这里阅读所有相关内容:
How to move HEAD back to a previous location? (Detached head)

git revert

合并是多次提交的组合 每个提交都命名为parent,因此合并的父母很少(2个或更多) 让我们假设你只有2个父母的轻松流动。

为了还原它,您可以做的只是使用revert命令恢复所需的父级

# Add the -m to the revert to indicate that you are reverting a merge
# (-m 1) - The number is the id of the parent (1-N)
# SHA-1 - optional SHA-1 to revert
git revert -m 1 SHA-1