Git:如何"撤消"合并

Jak*_*ake 16 git git-merge git-branch

情况:从A我分支的硕士开始并做了一些改变,B然后合并了那个分支(C).做一些更多的变化,我在后,D却发现我需要而没有分支发生的变化将代码部署.如果我不合并它本来没问题.

A_______C___D
 \     /
  \_B_/
Run Code Online (Sandbox Code Playgroud)

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

其次...

我没有时间找出处理这个问题的最佳方法,所以我删除了分支添加的文件,并手动还原了分支中的一些编辑然后提交了部署结果(F)

A_______C___D___F
 \     /
  \_B_/
Run Code Online (Sandbox Code Playgroud)

我希望能够继续开发分支并F将来自主服务器的任何更改合并到其中以使其保持最新,但如果我这样做,我创建的内容将被合并并导致文件被删除并且编辑被还原.处理这个问题的最佳方法是什么?

Gau*_*ier 16

您可以使用rebase一步完成:

git rebase --onto A C D
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ git rebase --onto <SHA1-for-A> <SHA1-for-C> master
Run Code Online (Sandbox Code Playgroud)

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

   _D'
  /
 /
A_______C___D
 \     /
  \_B_/
Run Code Online (Sandbox Code Playgroud)

Doc git rebase --onto,或多或少是您的情况:http: //git-scm.com/docs/git-rebase


如果你有:

A_______C___D___F
 \     /
  \_B_/
Run Code Online (Sandbox Code Playgroud)

,那你现在有:

   _D'___F'_(master)
  /
 /
A_______C___D___F
 \     /
  \_B_/(the_branch)
Run Code Online (Sandbox Code Playgroud)

从这里开始,将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'>
Run Code Online (Sandbox Code Playgroud)

在上面的命令之后你有:

     (master)
    /
   _D'___F'_(old_fix)
  /
 /
A_______C___D___F
 \     /
  \_B_/(the_branch)
Run Code Online (Sandbox Code Playgroud)

要将master的更新合并到the_branch中:

$ git checkout the_branch
$ git merge master
Run Code Online (Sandbox Code Playgroud)

......并解决冲突.


ter*_*nus 6

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

或者你可以git revert修补,B但这将创建一个新的提交.

虽然Gauthier的答案更好.