您可以使用 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
...并解决冲突。