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

asc*_*ied 5 git github

我在一个git仓库工作,我们维护一个主人和一个开发分支.在开发之前进行了更改并在发布之前合并为master.今天我不小心把大师合并到了开发中并推动了结果的发展.git log现在开发中的A 显示了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).

tor*_*rek 9

可以使用git revert恢复合并.请注意,当您这样做时,您将使未来"重新合并"变得更加困难.阅读您链接该消息密切它说了很多关于如何使未来的"重新合并"的工作,但要注意,它在谈论合并developmaster了,你说你却反其道而行之,合并masterdevelop:

A -- B -- C -- D -- E          <-- master
      \          \
       F - G - H - M           <-- develop
Run Code Online (Sandbox Code Playgroud)

在此情况下(已合并masterdevelop的,而不是周围的其他方法),你可以选择一些不同的选项,所有的优点和缺点...

最简单的方法,如果它是一个选项,我更喜欢

(0)什么都不做.如果合并C并且D没有破坏develop分支,那就这样离开.之后,有人会git checkout master并且git merge --no-ff develop得到这个(假设还有一个提交I被添加到develop第一个):

A -- B -- C -- D -- E -- M2    <-- master
      \          \      /
       F - G - H - M - I       <-- develop
Run Code Online (Sandbox Code Playgroud)

这里merge发现什么一直在做develop,因为它分离出来的master,这是在B.所以它把在F,GH,跳过的任何部分M是掉了master(可能是所有的话),终于在提出I并使得上合并提交M2(因为犯E;但如果E是不存在,那将是因为我使用--no-ff过) .

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

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

(2)停止使用旧名称develop,创建新的分支名称develop1或其他:

A -- B -- C -- D -- E          <-- master
     |           \
     |             M           <-- develop
      \          /
       F - G - H               <-- develop1
Run Code Online (Sandbox Code Playgroud)

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

还原及其缺点

(3)恢复合并.与在链接文章中一样,我们用它W来表示新的还原提交:

A -- B -- C -- D -- E          <-- master
      \          \
       F - G - H - M - W       <-- develop
Run Code Online (Sandbox Code Playgroud)

什么在W?无论如何"消除合并的效果".在这种情况下,这意味着,改变不做任何在C和中完成的事情D.到目前为止好,develop刚从变化F,GH,再次.如果/有人这样做,问题会在以后发生:

git checkout master
git merge develop
Run Code Online (Sandbox Code Playgroud)

第二个命令根源于找到哪里masterdevelop被拆分,即提交B,所以它从那时起拾取所有的更改.其中在这一点上包括那些W,这将取消待办事宜CD,不是在所有你想要的.它可以在之后修复,但是合并的人必须知道这个"删除CD"定时炸弹等待它们.

请注意,这与"不执行任何操作"选项(0)中的合并相同.这里的问题是内容W.在case(0)中,你想要 commit的内容I,但在这里你不需要的内容W.

还有一个选择

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

(4)创建一个包含您要保留的提交副本的全新分支,并命名develop.(或者将其命名为其他内容,但之后我们又回到了develop1上面的情况,你应该只使用那个.)无论你是保留old-develop分支,还是放弃它(通过不标记它),都取决于你,但我会把它画进来:

       F' - G' - H'            <-- develop
      /
A -- B -- C -- D -- E          <-- master
      \          \
       F - G - H - M           <-- old-develop
Run Code Online (Sandbox Code Playgroud)

这包含在您包含的链接中.它只适用于更复杂的情况.