Squash & Merge в Git или сохранение истории коммитов без промежуточных записей
Squash & Merge — это способ слияния изменений, при котором несколько коммитов объединяются (squash — "сжимать") в один перед вливанием в основную ветку. Этот метод позволяет сохранить чистую историю коммитов без лишних промежуточных записей.
Как работает Squash & Merge?
Допустим, в ветке feature/new-feature
есть несколько коммитов:
commit a1b2c3d - Fix bug in query handler
commit d4e5f6g - Add logging
commit h7i8j9k - Implement new feature
commit l0m1n2o - Fix typo in previous commit
При обычном merge
они просто добавятся в основную ветку (main
).
Но если использовать Squash & Merge, все эти коммиты объединяются в один:
commit p9q8r7s - Implement new feature and fixes
Таким образом, история остается чистой.
Когда использовать Squash & Merge?
✅ Когда нужно объединить "мусорные" коммиты (например, тестовые исправления, исправления опечаток).
✅ Когда код писался в несколько итераций, но результат — одно логическое изменение.
✅ При работе в feature-ветках, чтобы в main
попадали только готовые коммиты.
❌ Не подходит для веток, где важна детальная история коммитов (например, в develop
или release
).
Как выполнить Squash & Merge?
1. Вручную через git rebase -i
Переключаемся на нужную ветку:
git checkout feature/new-feature
Запускаем интерактивный rebase:
git rebase -i main
Git покажет список коммитов, например:
pick a1b2c3d Fix bug in query handler
pick d4e5f6g Add logging
pick h7i8j9k Implement new feature
pick l0m1n2o Fix typo in previous commit
Заменяем pick
на squash (s)
у всех коммитов, кроме первого:
pick a1b2c3d Fix bug in query handler
squash d4e5f6g Add logging
squash h7i8j9k Implement new feature
squash l0m1n2o Fix typo in previous commit
После сохранения Git предложит изменить сообщение коммита, оставляем итоговое.
Затем пушим изменения (если уже был push в удаленный репозиторий, потребуется --force
):
git push origin feature/new-feature --force
2. Через GitHub/GitLab UI
При слиянии Pull Request (Merge Request) можно выбрать опцию Squash & Merge:
- В GitHub:
Merge pull request -> Squash & Merge
- В GitLab:
Merge Request -> Squash commits
Вывод
Squash & Merge удобен для поддержания чистоты истории коммитов. Важно применять его осознанно: если детальная история не нужна, squash поможет убрать ненужные коммиты и оставить только финальные изменения.