Вы можете использовать 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
rebases фиксирует коммиты из 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 # 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)
Чтобы объединить обновления мастера в ветку:
$ git checkout the_branch
$ git merge master
... и исправить конфликты.