Подтвердить что ты не робот

Git удалить фиксацию слияния из истории

Моя история Git выглядит так:

Git history

Я хотел бы раздавить фиолетовые коммиты в один. Я не хочу видеть их снова в моем журнале регистрации.

Я попытался сделать git rebase -i 1, но даже если 1 находится на синей ветке (cf. picture), я все еще вижу каждую фиксацию на моей фиолетовой ветке.

Как полностью удалить фиолетовую ветвь (из журнала фиксации)?

4b9b3361

Ответ 1

Do git rebase -i <sha before the branches diverged> это позволит вам удалить фиксацию слияния, и журнал будет одной отдельной строкой, как вы хотели. Вы также можете удалить любые коммиты, которые вам больше не нужны. Причина, по которой ваш rebase не работал, заключалась в том, что вы не возвращались достаточно далеко.

ПРЕДУПРЕЖДЕНИЕ: Вы переписываете историю, делая это. Выполнение этого с изменениями, которые были перенесены на удаленное репо, вызовет проблемы. Я рекомендую делать это только с локальными коммитами.

Ответ 2

Есть два способа решить эту проблему на основе того, что вы хотите:

Решение 1: удалить фиолетовые коммиты, сохранив историю (если вы хотите откат)

git revert -m 1 <SHA of merge>

-m 1 указывает, какую родительскую строку выбрать

Фиолетовые коммиты по-прежнему будут присутствовать в истории, но поскольку вы вернулись, вы не увидите код из этих коммитов.


Решение 2: Полностью удалите фиолетовые коммиты (разрушительное изменение, если репо разделяется)

git rebase -i <SHA before branching out>

и удалить (удалить строки), соответствующие фиолетовым фиксациям.

Это было бы менее сложно, если бы коммиты не были сделаны после слияния. Дополнительные коммиты увеличивают вероятность конфликтов во время revert/rebase.

Ответ 3

Начиная с репо в исходном состоянии

Оригинальная история репо

Чтобы удалить фиксацию слияния и выровнять ветвь в одну фиксацию в mainline

Скомбинированные коммиты, без коммита слияния

Используйте эти команды (заменяя 5 и 1 на SHA соответствующих коммитов):

git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master

Чтобы сохранить фиксацию слияния, но squash, ветвь совершает одно:

Сжатый коммит, сохранение слияния

Используйте эти команды (заменяя 5, 1 и C на SHA соответствующих коммитов):

git checkout -b tempbranch 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git checkout C
git merge --no-ff tempbranch
git rebase HEAD master

Чтобы удалить фиксацию слияния и заменить ее отдельными фиксациями из ветки

Ветвь перемещается в mainline, без комминирования

Просто выполните (заменив 5 на SHA соответствующей фиксации):

git rebase 5 master

И наконец, чтобы полностью удалить ветвь

Филиал удален полностью

Используйте эту команду (заменив C и D на SHA соответствующих коммитов):

git rebase --onto C D~ master