Что такое squash коммитов в Git и когда его использовать

Ответ

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

Зачем это нужно?

  • Чистая история: Вместо множества мелких коммитов (например, "fix typo", "add comment", "refactor") в истории остается один осмысленный коммит, описывающий всю проделанную работу над фичей.
  • Атомарные изменения: Одна функциональность — один коммит. Это упрощает навигацию по истории и отмену изменений.
  • Удобство Code Review: Ревьюеру проще анализировать один цельный коммит, чем разбираться в цепочке промежуточных правок.

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

  1. Запустите интерактивный rebase для последних N коммитов:
    # Заменить 3 на нужное количество коммитов
    git rebase -i HEAD~3
  2. В открывшемся текстовом редакторе вы увидите список коммитов. Оставьте pick для первого (самого старого) коммита, а для всех остальных, которые хотите объединить с ним, замените pick на squash (или s).

    # Было:
    pick a1b2c3d Feature: add initial logic
    pick e4f5g6h Fix: typo in variable name
    pick i7j8k9l Refactor: improve performance
    
    # Стало:
    pick a1b2c3d Feature: add initial logic
    s e4f5g6h Fix: typo in variable name
    s i7j8k9l Refactor: improve performance
  3. Сохраните файл и закройте редактор. Git откроет новый редактор, где предложит вам создать новое сообщение для объединенного коммита.

Важно: Никогда не перезаписывайте историю (с помощью rebase, squash и т.д.) в общих ветках (main, develop), которые уже были отправлены (push) в удаленный репозиторий. Это следует делать только в локальных или feature-ветках до их слияния.