Возврат старых файлов коммитов слияния без последующего коммита - PullRequest
2 голосов
/ 17 марта 2020

Мне нужно отменить очень старый коммит слияния из основной ветви.

Дело в том, что я не хочу, чтобы операция возврата влияла на другие изменения, которые были внесены с этого момента в основной ветвь.

Насколько я понимаю, если я использую:

git revert -m 1 [ha sh merge commit]

Он вернется в родительский коммит коммита слияния и удалит все изменения, которые были добавлены позже.

Фиксация слияния включает в себя несколько файлов.

Есть ли способ достичь этого с помощью встроенная команда в git, отличная от файла за файлом?

1 Ответ

1 голос
/ 20 марта 2020

Вы можете интерактивно выполнить перебазирование, начиная с коммита до коммита слияния, и удалять коммиты для этого коммита слияния.

Давайте возьмем эту историю из некоторой ветви 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 (это действительно новые коммиты). Это означает, что теги, которые существовали в нашей предыдущей истории, не указывают на эти новые коммиты. Они все еще существуют, поэтому ничего не сломается. Они просто указывают на историю, которая все еще содержит тот коммит слияния, который вы хотели удалить. Не могу судить, будет ли это проблемой для тебя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...