无意中合并了大师进入开发和推动

时间:2013-10-01 01:31:31

标签: git github

我在一个git仓库工作,我们维护一个主人和一个开发分支。在开发之前进行更改并在发布之前合并到master中。今天我不小心把大师合并到了开发中并推动了结果的发展。现在开发中的git log显示merge develop into master提交。我需要以某种方式解决这个问题。我使用git reflog找到了最近的好提交。恢复它的正确方法是什么?

由于我已经推,我想避免重写历史。但是,我不确定我是否可以使用git revert。我不相信“恢复错误的合并”howto和其他SO问题适用,因为我想要恢复的提交是自己合并(https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt)。

4 个答案:

答案 0 :(得分:9)

可以使用git revert还原合并。请注意,当您这样做时,您将使未来“重新合并”变得更加困难。阅读你密切关注的那条消息 - 它说了很多关于如何使未来“重新合并”的工作 - 但要注意它正在谈论将develop合并到master,你说你做了相反,将master合并到develop

A -- B -- C -- D -- E          <-- master
      \          \
       F - G - H - M           <-- develop

在这种情况下(将master合并到develop而不是相反),您可以选择多种不同的选项,这些选项都有优点和缺点......

最简单的方法,如果它是一个选项

我更喜欢

(0)什么也不做。如果在CD中合并不会破坏develop分支,那么就这样离开。之后,有人会git checkout mastergit merge --no-ff develop并获得此信息(假设首先将I再次添加到develop):

A -- B -- C -- D -- E -- M2    <-- master
      \          \      /
       F - G - H - M - I       <-- develop

此处merge找到develop中已完成的内容,因为它与master分开,B。因此它放入FGH,跳过M master(可能全部)I的任何部分,最后放入在M2中并进行合并提交E(因为提交E;但如果--no-ff不在那里,那将是因为我也使用了M

一些有明显缺点的简单方法

(1)只需“重写历史记录”:从分支develop中删除提交M。警告使用该分支即将发生的所有其他人:提交develop正在消失,他们应该采取必要的措施来处理这个问题。

(2)停止使用旧名称develop1,创建新的分支名称A -- B -- C -- D -- E <-- master | \ | M <-- develop \ / F - G - H <-- develop1 或其他:

M

这与选项(1)相同,只是提交H仍然存在,连同其上的分支标签,并且您有一个新的/不同的分支标签指向提交develop 。您仍需要提醒所有人,但这可能会使他们的工作更轻松。您可以稍后删除W,当每个人都对此感到满意时。

还原及其缺点

(3)恢复合并。与链接文章一样,我们使用A -- B -- C -- D -- E <-- master \ \ F - G - H - M - W <-- develop 来表示新的还原提交:

W

C中的内容是什么?无论如何“消除合并的效果”。在这种情况下,这意味着,在Ddevelop中执行的操作不会执行任何操作。到目前为止,F只有GHgit checkout master git merge develop 的变化。如果/当有人这样做时,以后会出现问题:

master

第二个命令根深蒂固地找到developB被拆分的位置,即提交W,因此它会从那时起获取所有更改。此时此处包含C中的内容, un -do DC,而不是您想要的内容。它可以在以后修复,但是合并的人必须知道这个“删除DW”定时炸弹等待它们。

请注意,这与“不执行任何操作”选项(0)中的合并相同。这里的问题是I内容。在情况(0)中,您想要提交W的内容,但在这里想要develop的内容。

还有一个选项

考虑到上面所示,这可以说是最糟糕的选择,但无论如何我都会列出它:

(4)使用您要保留的提交的副本创建一个全新的分支,并将其命名为develop1。 (或者将其命名为其他内容,但之后我们又回到old-develop - 类似上面的情况,您应该只使用那个。)是否保留 F' - G' - H' <-- develop / A -- B -- C -- D -- E <-- master \ \ F - G - H - M <-- old-develop 分支,或者只是放弃它(不加标签),取决于你,但我会把它画进去:

{{1}}

您在此处包含的链接中对此进行了描述。它只适用于更复杂的情况。

答案 1 :(得分:2)

您可以通过将本地分支重置为上一次良好提交,然后推送它来解决此问题:

git checkout develop
git reset --hard lastgoodcommit
git push origin develop

请注意,默认情况下,您的上游存储库可能会禁止非快进合并。如果是这样,您需要在上游修改该选项,执行上述操作,然后恢复原始设置。

答案 2 :(得分:0)

我使用GIT Extensions。有一个功能可以右键单击UI中的修订并恢复为它。

答案 3 :(得分:0)

是的,您可以恢复合并,但您需要指定哪条父线是主线。既然你将开发合并为master,那么这应该可以解决问题:

git revert --mainline 1 HEAD

为了确保你拥有你想要的东西,你应该用$ lastgoodcommit做差异,但是,$ lastgoodcommit应该是HEAD ^。这当然是,如果你没有在合并之上进行提交,如果你有,那么你需要用合并提交替换HEAD。

最后,您还可以通过检查当前提交之上的代码来手动还原:

git checkout $lastgoodcommit -- .

' - 。'有没有区别于正常结账,其中HEAD切换到指定的提交,在此处的命令中,工作目录中的所有文件和暂存区域将与$ lastgoodcommit中的完全相同。如果你用$ lastgoodcommit做差异,你应该再次看到没有变化。基本上它是一个回复。

您还可以尝试'git checkout --patch'来有选择地还原代码块。