Git удалить фиксацию слияния из истории
Моя история Git выглядит так:
![Git history]()
Я хотел бы раздавить фиолетовые коммиты в один. Я не хочу видеть их снова в моем журнале регистрации.
Я попытался сделать git rebase -i 1
, но даже если 1
находится на синей ветке (cf. picture), я все еще вижу каждую фиксацию на моей фиолетовой ветке.
Как полностью удалить фиолетовую ветвь (из журнала фиксации)?
Ответы
Ответ 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