Что такое squash коммитов в Git?

«Что такое squash коммитов в Git?» — вопрос из категории DevOps, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Squash (сжатие коммитов) — это операция в Git, которая объединяет несколько последовательных коммитов в один новый коммит. Это делается для очистки истории перед слиянием ветки (например, feature-ветки в main).

Типичный сценарий использования:

  1. Вы завершили работу над фичей в отдельной ветке, сделав множество мелких коммитов ("WIP", "fix typo", "refactor").
  2. Перед пулл-реквестом вы хотите представить историю как один логичный коммит.

Как сделать squash (интерактивный rebase):

# Перебазируем последние 4 коммита текущей ветки
# HEAD~4 означает "4 коммита назад от текущего"
git rebase -i HEAD~4

В открывшемся редакторе для коммитов, которые нужно объединить, замените pick на squash (или s). Сохраните и закройте редактор. Git создаст один новый коммит с объединённым сообщением.

Плюсы:

  • Чистая история: Основная ветка (main, develop) не загромождается промежуточными коммитами.
  • Упрощение: Легче отслеживать изменения, откатывать или чери-пикать целые фичи.

Минусы и предостережения:

  • Потеря деталей: Исчезает история промежуточных изменений и итераций.
  • Force Push: После rebase требуется git push --force-with-lease (безопаснее, чем --force), что опасно для общих веток. Делайте squash только в своей локальной или feature-ветке.