git удалить коммит слияния из истории
Моя история Git выглядит так:
Я бы хотел раздавить фиолетовые коммиты в один. Я не хочу больше видеть их в моем журнале коммитов.
Я пытался сделать git rebase -i 1
, но даже если 1
находится на синей ветви (см. рисунок), я все еще вижу каждый коммит на моей фиолетовой ветви.
Как я могу полностью удалить фиолетовую ветку (из журнала коммитов)?
5 ответов
Делать git rebase -i <sha before the branches diverged>
это позволит вам удалить коммит слияния, и журнал будет состоять из одной строки, как вы и хотели. Вы также можете удалить любые коммиты, которые вам больше не нужны. Причина, по которой ваш ребейс не работал, была в том, что вы не возвращались достаточно далеко.
ВНИМАНИЕ: Вы переписываете историю, делая это. Выполнение этого с изменениями, внесенными в удаленное хранилище, вызовет проблемы. Я рекомендую делать это только с коммитами, которые являются локальными.
Начиная с репо в исходном состоянии
Чтобы удалить коммит слияния и раздавить ветку в единый коммит в магистрали
Используйте эти команды (заменив 5 и 1 на SHA соответствующих коммитов):
git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master
Чтобы сохранить коммит слияния, но сквош, ветвь фиксирует в одном:
Используйте эти команды (заменив 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
Чтобы удалить коммит слияния и заменить его на отдельные коммиты из ветки
Просто сделайте (заменив 5 на SHA соответствующего коммита):
git rebase 5 master
И наконец, убрать ветку целиком
Используйте эту команду (заменив C и D на SHA соответствующих коммитов):
git rebase --onto C D~ master
Просто удалить коммит слияния
Если все, что вы хотите сделать, это удалить коммит слияния (2) так, как будто его никогда не было, команда выглядит следующим образом
git rebase --onto <sha of 1> <sha of 2> <blue branch>
И теперь фиолетовая ветвь вообще не занесена в журнал коммитов синего цвета, и у вас снова есть две отдельные ветки. Затем вы можете раздавить пурпур самостоятельно и делать любые другие манипуляции, которые вы хотите, без фиксации слияния.
Есть два способа решения этой проблемы в зависимости от того, что вы хотите:
Решение 1. Удалите фиолетовые коммиты, сохранив историю (если вы хотите откатиться)
git revert -m 1 <SHA of merge>
-m 1
указывает, какую родительскую строку выбрать
Фиолетовые коммиты останутся в истории, но так как вы вернулись, вы не увидите код этих коммитов.
Решение 2. Полностью удалите фиолетовые коммиты (разрушительные изменения, если репо является общим)
git rebase -i <SHA before branching out>
и удалить (удалить строки), соответствующие фиолетовым коммитам.
Это было бы менее сложно, если коммиты не были сделаны после слияния. Дополнительные коммиты увеличивают вероятность конфликтов во время revert/rebase
,
Для полного контроля над операцией и для сохранения любых коммитов слияния, которые вы хотите сохранить в процессе, современный подход заключается в использовании
git rebase -i -r