git удалить коммит слияния из истории

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

Git история

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

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

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

5 ответов

Решение

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

ВНИМАНИЕ: Вы переписываете историю, делая это. Выполнение этого с изменениями, внесенными в удаленное хранилище, вызовет проблемы. Я рекомендую делать это только с коммитами, которые являются локальными.

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

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

Чтобы удалить коммит слияния и раздавить ветку в единый коммит в магистрали

Squashed фиксирует, не объединяет коммит

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

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

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

Squashed фиксирует, сохраняет коммит слияния

Используйте эти команды (заменив 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

Другие вопросы по тегам