Что вы хотите сделать, так это на самом деле переписать историю. Идентификаторы коммитов будут меняться, а в некоторых случаях набор изменений, передаваемый коммитами, будет меняться. Так что, если есть шанс, что кто-то может основывать работу на старой версии ветки, которую вы хотите изменить, лучше этого не делать. Но если вы не опубликовали эту ветку, не стесняйтесь.
Предположим, что ветвь, которую мы хотим изменить, называется «мастер», а точка, в которой мы хотим начать новую ветвь, называется «А» (в данном примере одно из имен, которые вы можете использовать, это «мастер ~ 6». «).
Сначала давайте создадим новую ветку из коммита 'A', назовем его 'fixes'
$ git checkout -b fixes A
Это также сделало бы ветки исправлениями. Поскольку есть только несколько коммитов, которые мы хотим отменить выбор вишни, мы можем выбрать их с помощью исправлений ветви:
$ git cherry-pick A1
$ git cherry-pick A2
Затем мы хотим удалить коммиты 'A1' и 'A2' из ветви 'master'. Поскольку мы хотим удалить только несколько коммитов и, возможно, многие другие, которые мы хотим сохранить, мы можем использовать для этого «git rebase --interactive»:
$ git rebase -i fixes master
Редактор будет запущен со всеми коммитами в 'master' после коммита 'A' (который является общим коммитом, т.е. объединяет базу ветки 'master' и ветки 'fixes'). Список будет выглядеть так:
pick deadbee B
pick fa1afe1 C
pick a98d4ba A1
...
Удалять строки с коммитами 'A1' и 'A2', сохранять изменения, закрывать редактор (или иным образом отправлять изменения в непривлекательную перебазировку) и git будет повторно применять все коммиты, кроме тех, которые вы удалили.
Затем вы можете завершить с
$ git merge fixes
(git-rebase оставил нас в переписанной ветке 'master').