您可以使用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(不包括)到主分支master的提交重新设置基础,然后合并到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)
从这里开始,将主分支的更改合并到分支非常容易。完全放弃提交
F'
。
$ git checkout master
$ git branch old_fix
$ git reset --hard <SHA1-to-D'>
执行以上命令后,您将拥有:
(master)
/
_D'___F'_(old_fix)
/
/
A_______C___D___F
\ /
\_B_/(the_branch)
将主分支的更新合并到 the_branch 分支中:
$ git checkout the_branch
$ git merge master
...并解决冲突。