Как в git объединить старые коммиты в один?

У меня есть git репозиторий, в котором я хочу объединить некоторые старые коммиты в один.

Эти коммиты не последние, я знаю, что это изменит git историю.

Вот пример того, что я хочу сделать, есть эти коммиты:

коммиты

Я хочу их всех объединить в один общий коммит "Сделал лог os соединения", который будет содержать их суммарные изменения, т. е. по сути squash, только для старых коммитов.

Это был пример, на его основе я хочу сделать множество объединений.

Так как это сделать?


Ответы (3 шт):

Автор решения: Герман Борисов

Нужно сделать rebase всей истории от первого объединяемого коммита до последнего имеющегося включительно на тот же коммит, который является предком первого объединяемого.

В процессе rebase'а часть коммитов можно объединить, например, в интерактивном режиме.

Некоторые gui-обертки для git (например TortoiseGit) позволяют автоматизировать этот процесс, но всё равно это будет выполнено посредствам git rebase

→ Ссылка
Автор решения: Михаил Муругов

Имеем:

введите сюда описание изображения

Выполняем:

git rebase -i 5537cb77d8dcb72dd70a852efdec2108c99ad3fe

Где 5537cb77d8dcb72dd70a852efdec2108c99ad3fe - SHA коммита выше которого хотим что-то схлопнуть (в Вашем случае это SHA коммита с сообщением Merge remote...).

Меняем pick на squash у тех коммитов, которые хотим свернуть в самый верхний pick коммит:

введите сюда описание изображения

По необходимости меняем сообщения новых коммитов.

После этого имеем:

введите сюда описание изображения

Т.е. "склеили" commit2 и commit3, commit4 и commit5.

Запушить эти изменения на remote получится только с флагом -force.

→ Ссылка
Автор решения: Алексей Ковальчук

Нормального способа нет это сделать, если коммиты очень глубоко в истории. Rebase заставит вас заново решать все конфликты merge коммитов.

По этому я написал свою утилиту, которая позволяет это делать автоматически: https://github.com/lokha/git-recreator

→ Ссылка