Git:如何“撤消”合并

时间:2010-12-14 00:21:25

标签: git git-branch git-merge

情况: 从主A开始,我分支并在B进行了一些更改,然后将该分支合并回(C)。在进行了一些更改后,我在D但发现我需要部署代码而不需要在分支中发生更改。如果我不合并它就可以了。

A_______C___D
 \     /
  \_B_/

首先,我想知道我应该从这里做什么来部署代码,好像合并从未发生过一样。注意:没有在分支中编辑的相同文件在主服务器中编辑过。

...其次

我没有时间找出解决此问题的最佳方法,因此我删除了分支添加的文件,并手动还原了分支中的一些编辑,然后提交了部署结果({{1 }})

F

我希望能够继续开发分支并将来自主服务器的任何更改合并到其中以使其保持最新,但如果我这样做,我创建的A_______C___D___F \ / \_B_/ 所做的事情将合并到导致删除文件并恢复编辑。解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:16)

您可以使用rebase一步完成:

git rebase --onto A C D

我刚测试了这个,并得到了适当的结果:

$ edit test.txt
$ git add .
$ git commit -mA
$ git checkout -b the_branch
$ edit test.txt
$ git commit -a -mB
$ git checkout master
$ git merge master the_branch --no-ff
$ edit test.txt
$ git commit -a -mD

从这里你可以了解你描述的情况。 然后:

$ git rebase --onto <SHA1-for-A> <SHA1-for-C> master

从C(不包括)到主人的提交,到A. 我需要解决一些冲突,因为我在B和D的相同位置进行了修改,但我认为你不会。

   _D'
  /
 /
A_______C___D
 \     /
  \_B_/

关于git rebase --onto的文档,这或多或少是您的情况: http://git-scm.com/docs/git-rebase


如果你有:

A_______C___D___F
 \     /
  \_B_/

,那么你现在有了:

   _D'___F'_(master)
  /
 /
A_______C___D___F
 \     /
  \_B_/(the_branch)

从这里开始,将master中的更改合并到分支中很容易。完全放弃提交F'

$ git checkout master # if you were not here already
$ git branch old_fix  # if you want to be able to return to F' later
$ git reset --hard <SHA1-to-D'>

在上面的命令之后你有:

     (master)
    /
   _D'___F'_(old_fix)
  /
 /
A_______C___D___F
 \     /
  \_B_/(the_branch)

将master的更新合并到the_branch:

$ git checkout the_branch
$ git merge master

...并修复冲突。

答案 1 :(得分:6)

显而易见的解决方案是重置为A,手动重新应用所有补丁并解决冲突(你不会有)。

或者您可以git revert修补B,但这会创建新的提交。

尽管Gauthier的答案更好。