撤销Git合并操作

10

我对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个回答

6
所以,为了澄清,您需要的是这个,对吗?
feature       /---F1-----F2
             /                 
master -----M0-----M1-----M2
             \            
bugfix        \--B1-----B2

确保 HEADfeaturebugfix 分支仍然在分别的 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'的时候了。


是的,有点像,但“feature”、“master”和“bugfix”实际上并不是分支,我猜这就是让人困惑的原因。也就是说,三个人提交了他们自己对主分支的更改。其中一个人做了错误的合并并推送了上去。我拉下了错误的合并。现在我想要一种方法来排除错误的合并,同时仍然保留所有个人的更改... - aberrant80
“feature”和“bugfix”不是分支吗?毫无疑问,“feature”的作者在自己的存储库中有一个分支。你应该将主分支重置为M2,并要求“feature”的作者执行相同的操作(但确保他不会丢失“feature”分支),然后重新合并,这次正确地进行。如果您想自己完成此操作,请参阅我的更新。 - Gauthier
你真的有一个没有 master 分支的仓库吗? - Gauthier
我们确实有一个“master”分支。好的,现在我明白你的意思了,让另一个人重置这个分支。谢谢! - aberrant80

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接