Как в 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



