Вы можете интерактивно выполнить перебазирование, начиная с коммита до коммита слияния, и удалять коммиты для этого коммита слияния.
Давайте возьмем эту историю из некоторой ветви feature/rebase-test
:
* 1ff3147 - (tag: v0.4.3, origin/master, origin/HEAD, master) Add test to show URLs with port work
* a686fbf - (tag: v0.4.2) Enable setting custom RequestHandler
* f682d20 - Add php 7.4 to Travis
* 0973364 - Make code coverage script CLI runnable
* cb106fc - Add composer.phar to gitignore
* 1d89b5e - (tag: v0.4.1) Merge pull request #62 from mvdbos/fix/event-dispatcher
|\
| * 3376b9c - Revert to the legacy EventDispatcher
|/
* f761a2c - Update README badges
* b8447e6 - (tag: v0.4) Merge pull request #60 from mvdbos/feature/cleanup
|\
| * e278cde - Simplify build and clean up use statements
|/
* ac6af67 - Merge pull request #59 from mvdbos/feature/update-scrutinizer
Теперь предположим, что я хочу удалить b8447e6
(и, следовательно, e278cde
, который является частью этого коммита слияния).
Я мог бы сделать git rebase --rebase-merges --onto ac6af67 f761a2c feature/rebase-test
). Это взяло бы все, начиная с f761a2c
и заканчивая кончиком feature/rebase-test
, и перебазировало бы его в ac6af67
, который является коммитом непосредственно перед слиянием, от которого мы хотим избавиться.
В моем случае, который привел к нескольким конфликтам, и после их решения моя история выглядит следующим образом:
* d7e5919 - (HEAD -> feature/rebase-test) Add test to show URLs with port work
* 0d8e15f - Enable setting custom RequestHandler
* ce365b0 - Add php 7.4 to Travis
* 42d6f59 - Make code coverage script CLI runnable
* ad0c861 - Add composer.phar to gitignore
* 3292f4c - Merge pull request #62 from mvdbos/fix/event-dispatcher
|\
| * 3e2ceef - Revert to the legacy EventDispatcher
|/
* ac6af67 - Merge pull request #59 from mvdbos/feature/update-scrutinizer
Обратите внимание, что коммит слияния пропал и структура следующего коммиты сохраняются как есть, включая коммиты слияния. Это связано с флагом --rebase-merges
команды rebase.
Одно предостережение: как вы могли заметить, все коммиты после ac6af67
имеют новый га sh (это действительно новые коммиты). Это означает, что теги, которые существовали в нашей предыдущей истории, не указывают на эти новые коммиты. Они все еще существуют, поэтому ничего не сломается. Они просто указывают на историю, которая все еще содержит тот коммит слияния, который вы хотели удалить. Не могу судить, будет ли это проблемой для тебя.