Что такое 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-ветках до их слияния.

Ответ 18+ 🔞

А, ну ты про сквош, да? Это когда ты наделал коммитов, как пьяный ёжик в тумане, а потом думаешь: "Бля, как же это всё в продакшн показывать?". Вот сквош — это как взять всю эту кучу мелких "пофиксил опечатку", "добавил коммент", "ещё одну опечатку" и спрессовать в один красивый, внятный коммит. Чтоб история не выглядела как дневник дебила.

Нахуя это вообще надо?

  • Чтоб не было стыдно: Вместо трёх строк "исправил хуйню", "ой, не то", "всё, теперь точно" — будет один коммит "Добавил ядерную кнопку". Красиво, ёпта.
  • Чтоб не сломать мозг: Одна фича — один коммит. Захотел откатить — откатил одним движением, а не выковыривай по зёрнышку.
  • Чтоб тебя не убили на ревью: Ты же не хочешь, чтобы коллега, просматривая твои 15 коммитов, думал: "Да иди ты нахуй со своими 'чуть-чуть подправил'"? Вот чтобы не думал.

Делается это так (через интерактивный ребейз):

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

    # Было (пиздец какой-то):
    pick a1b2c3d Добавил новую фичу
    pick e4f5g6h Исправил опечатку в слове 'привет'
    pick i7j8k9l Убрал лишнюю точку с запятой, блядь
    
    # Стало (красота):
    pick a1b2c3d Добавил новую фичу
    s e4f5g6h Исправил опечатку в слове 'привет'
    s i7j8k9l Убрал лишнюю точку с запятой, блядь
  3. Сохраняешь, закрываешь. Гит такой: "О, ясненько, ща всё смерджу". И предложит тебе написать одно общее, гениальное сообщение для нового, объединённого коммита.

ВАЖНО, БЛЯДЬ, КАПСОМ: ЭТИМ ПРИЁМОМ НИКОГДА НЕ ПОЛЬЗУЙСЯ В ОБЩИХ ВЕТКАХ, КОТОРЫЕ УЖЕ ЗАПУШИЛИ КУДА ПОДАЛЬШЕ! main, develop — это святое. Там уже другие люди могли от твоей истории отталкиваться. Переписывая её, ты устроишь пиздец и хаос. Сквошь ТОЛЬКО свои локальные или фиче-ветки, пока они ещё никому не мешают. Понял? А то потом будешь ходить и говорить: "Я был мудак, блядь...".