撤消git合并

时间:2011-01-19 11:33:04

标签: git merge

我对Git没有经验,现在我有一个很大的问题落到了我的腿上。

以下是我当前分支的样子:

feature       /---F1-----F2----\
             /                  \
master -----M0-----M1-----M2-----M3-----M4
             \                        /
bugfix        \--B1-----B2-----------/

情况:

有人做了一件非常糟糕的事情并推出了一个非常糟糕的合并(M3)。在我将B1和B2合并到M4之后,当我们的模型(不是源代码)无法加载时,我才注意到错误的合并。幸运的是,我还没有推过M4。

问题:

如何重新设置正确的东西?我想要M0,M1,M2,F1,F2,B1和B2。但我不想要M3和M4(因为M4显然已被打破)。如果我 放弃更改,那么可以牺牲F1和F2:)

我看了git revert,但我不相信我完全理解它是如何运作的。所以...我真的希望得到如何解决这个问题的帮助。

提前致谢。

2 个答案:

答案 0 :(得分:6)

所以要澄清一下,你想要的是这个,对吧?

feature       /---F1-----F2
             /                 
master -----M0-----M1-----M2
             \            
bugfix        \--B1-----B2

确保HEAD featurebugfix分别仍在F2B2

修改:如果featurebugfix没有分支,请将它们设为分支(如果未分配则隐藏您的工作):

git checkout F2
git branch feature
git checkout B2
git branch bugfix

修改结束

然后将主设备重置为M2:

git checkout master
git reset M2 --hard

(重置会让你失去你的本地更改,如果你不想这样,就会藏匿它们。)

M3M4不会立即被销毁,但最终会被销毁。它们不应出现在git log或gitk中。

然后是时候合并feature并制作一个正确的M3'

答案 1 :(得分:1)

如果您还没有推送(发布)合并提交,请使用git reset。例如。在主分支上,假设您的工作树是干净的,请执行git reset --hard。

更多信息: Undo a Git merge that hasn't been pushed yet

如果您确实发布了更改,则可能需要考虑进行还原提交。更多信息: http://progit.org/2010/03/02/undoing-merges.html