Вы не можете получить именно то, что вы хотите, поскольку в коммитах будут различия, но содержимое файлов будет таким, как вы хотите, если вы это сделаете:
$ git checkout master
$ git reset --hard sha1-of-B # set master back to B
$ git cherry-pick sha1-of-D # set master to R-A-B-D'
$ git checkout -b new-branch sha1-of-B # set new-branch to B
$ git cherry-pick sha1-of-C # set new-branch to R-A-B-C'
Обратите внимание, что вам не нужно выбирать вишню, чтобы установить new-branch, и вы можете сделать это так же просто:
$ git reset sha1-of-C
пока вы проверяли новую ветку Это на самом деле даст вам R-A-B-C вместо R-A-B-C '. Обратите внимание, что единственная разница между C и C '- это время фиксации.
После того, как вы выполните сброс, вам может быть трудно найти хэши sha1 различных коммитов (они доступны в reflog), поэтому вы можете захотеть поместить теги во все перед началом или сохранить где-нибудь историю .