Menu
CoddyTech

Git: объединение коммитов (Squash)

Последнее обновление

Squash объединяет несколько коммитов в один, так что беспорядочная череда коммитов "wip", "исправил опечатку", "вот теперь точно исправил" превращается в один чистый коммит. Обычный инструмент - интерактивный rebase - git rebase -i - где ты помечаешь коммиты для объединения. Поскольку squash переписывает историю, делай это до push или в ветке, над которой работаешь только ты.

Попробуй эти команды в терминальном playground - настоящая оболочка в твоём браузере, ничего устанавливать не нужно.

Squash складывает череду мелких коммитов в один аккуратный коммит через интерактивный rebase.

Синтаксис

CommandWhat it does
git rebase -i HEAD~3Интерактивный rebase последних 3 коммитов
git rebase -i mainRebase каждого коммита, начиная с main
git merge --squash featureОбъединяет коммиты ветки в один при слиянии
git reset --soft HEAD~3 && git commitОбъединяет последние 3 коммита без rebase

Команды интерактивного rebase

В открывшемся редакторе замени pick на одну из этих.

KeywordWhat it does
pickОставляет коммит без изменений
squash (s)Сливает с предыдущим коммитом, объединяет сообщения
fixup (f)Сливает, но отбрасывает сообщение этого коммита
reword (r)Оставляет коммит, но редактирует его сообщение

Разбор примера

Объедини последние три коммита в один перед push.

StepActionResult
1git rebase -i HEAD~3Открывает последние 3 коммита в редакторе
2Установи для коммитов 2 и 3 значение squashПомечает их для слияния с первым
3Сохрани и отредактируй объединённое сообщениеТри коммита становятся одним чистым коммитом

Часто задаваемые вопросы об объединении коммитов в Git

Что значит объединить (squash) коммиты?
Squash превращает несколько коммитов в один, который содержит все их изменения. Файлы в итоге остаются точно такими же, меняется только история: ревьюеры видят один коммит с одним сообщением вместо цепочки мелких исправлений.
Как объединить последние N коммитов в Git?
Выполни git rebase -i HEAD~N (например, HEAD~3 для последних трёх). В редакторе оставь первый коммит как pick, а остальные измени на squash (или fixup, чтобы отбросить их сообщения). Сохрани, отредактируй объединённое сообщение коммита, и коммиты сольются в один.
В чём разница между squash и fixup?
Оба сливают коммит с предыдущим. squash сохраняет сообщение коммита и позволяет объединить его с остальными в редакторе. fixup полностью отбрасывает сообщение коммита, оставляя только сообщение более раннего коммита - удобно для коммитов "упс, мелкая правка", которые не нужны в итоговом сообщении.
Как объединить всю ветку при слиянии?
Используй git merge --squash feature, затем git commit. Это применяет все изменения ветки как проиндексированные (staged) и позволяет записать их одним коммитом в целевой ветке, не перенося отдельные коммиты ветки. Кнопка "Squash and merge" в GitHub делает то же самое.
Можно ли объединить коммиты без интерактивного rebase?
Да. git reset --soft HEAD~N откатывает ветку на N коммитов назад, сохраняя все их изменения проиндексированными (staged), а затем один git commit записывает их как один. Это быстрый способ объединить самые свежие коммиты, не открывая редактор rebase.
Нужно ли объединять коммиты перед слиянием?
Многие команды так делают, чтобы каждая фича попадала в историю одним коммитом, который легко прочитать и легко откатить. Цена в том, что пропадает пошаговая история. В ветке, с которой работаете только вы, объединяйте свободно; в общей ветке сначала договоритесь, потому что переписанные коммиты заставят всех остальных сбрасывать свои копии.
Можно ли попрактиковаться в этом онлайн?
Да. Открой терминальный playground, чтобы запустить интерактивный rebase в настоящей оболочке в твоём браузере - ничего устанавливать не нужно. Бесплатный интерактивный курс Git от Coddy также разбирает rebase и очистку истории шаг за шагом.
Иллюстрация языков программирования Coddy

Изучайте Git с Coddy

НАЧАТЬ