我对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
,但我不相信我完全理解它是如何运作的。所以...我真的希望得到如何解决这个问题的帮助。
提前致谢。
答案 0 :(得分:6)
所以要澄清一下,你想要的是这个,对吧?
feature /---F1-----F2
/
master -----M0-----M1-----M2
\
bugfix \--B1-----B2
确保HEAD
feature
和bugfix
分别仍在F2
和B2
。
修改:如果feature
和bugfix
没有分支,请将它们设为分支(如果未分配则隐藏您的工作):
git checkout F2
git branch feature
git checkout B2
git branch bugfix
修改结束
然后将主设备重置为M2:
git checkout master
git reset M2 --hard
(重置会让你失去你的本地更改,如果你不想这样,就会藏匿它们。)
M3
和M4
不会立即被销毁,但最终会被销毁。它们不应出现在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