Ответ
Squash (сжатие) в Git — это процесс объединения нескольких последовательных коммитов в один. Это делается для того, чтобы сделать историю изменений более чистой и читаемой.
Зачем это нужно?
- Чистая история: Вместо множества мелких коммитов (например, "fix typo", "add comment", "refactor") в истории остается один осмысленный коммит, описывающий всю проделанную работу над фичей.
- Атомарные изменения: Одна функциональность — один коммит. Это упрощает навигацию по истории и отмену изменений.
- Удобство Code Review: Ревьюеру проще анализировать один цельный коммит, чем разбираться в цепочке промежуточных правок.
Как это сделать (интерактивный rebase):
- Запустите интерактивный rebase для последних
Nкоммитов:# Заменить 3 на нужное количество коммитов git rebase -i HEAD~3 -
В открывшемся текстовом редакторе вы увидите список коммитов. Оставьте
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 - Сохраните файл и закройте редактор. Git откроет новый редактор, где предложит вам создать новое сообщение для объединенного коммита.
Важно: Никогда не перезаписывайте историю (с помощью rebase, squash и т.д.) в общих ветках (main, develop), которые уже были отправлены (push) в удаленный репозиторий. Это следует делать только в локальных или feature-ветках до их слияния.
Ответ 18+ 🔞
А, ну ты про сквош, да? Это когда ты наделал коммитов, как пьяный ёжик в тумане, а потом думаешь: "Бля, как же это всё в продакшн показывать?". Вот сквош — это как взять всю эту кучу мелких "пофиксил опечатку", "добавил коммент", "ещё одну опечатку" и спрессовать в один красивый, внятный коммит. Чтоб история не выглядела как дневник дебила.
Нахуя это вообще надо?
- Чтоб не было стыдно: Вместо трёх строк "исправил хуйню", "ой, не то", "всё, теперь точно" — будет один коммит "Добавил ядерную кнопку". Красиво, ёпта.
- Чтоб не сломать мозг: Одна фича — один коммит. Захотел откатить — откатил одним движением, а не выковыривай по зёрнышку.
- Чтоб тебя не убили на ревью: Ты же не хочешь, чтобы коллега, просматривая твои 15 коммитов, думал: "Да иди ты нахуй со своими 'чуть-чуть подправил'"? Вот чтобы не думал.
Делается это так (через интерактивный ребейз):
- Открываешь терминал и пишешь магическую хуйню. Скажем, последние 3 коммита схлопнуть:
# Цифру меняй в зависимости от масштаба своего позора git rebase -i HEAD~3 -
Вылезет редактор, а там твои коммиты. Первый (самый старый) оставляешь как есть (
pick), а напротив остальных, которые надо в него впихнуть, пишешьsquash(или простоs). Смотри:# Было (пиздец какой-то): pick a1b2c3d Добавил новую фичу pick e4f5g6h Исправил опечатку в слове 'привет' pick i7j8k9l Убрал лишнюю точку с запятой, блядь # Стало (красота): pick a1b2c3d Добавил новую фичу s e4f5g6h Исправил опечатку в слове 'привет' s i7j8k9l Убрал лишнюю точку с запятой, блядь - Сохраняешь, закрываешь. Гит такой: "О, ясненько, ща всё смерджу". И предложит тебе написать одно общее, гениальное сообщение для нового, объединённого коммита.
ВАЖНО, БЛЯДЬ, КАПСОМ: ЭТИМ ПРИЁМОМ НИКОГДА НЕ ПОЛЬЗУЙСЯ В ОБЩИХ ВЕТКАХ, КОТОРЫЕ УЖЕ ЗАПУШИЛИ КУДА ПОДАЛЬШЕ! main, develop — это святое. Там уже другие люди могли от твоей истории отталкиваться. Переписывая её, ты устроишь пиздец и хаос. Сквошь ТОЛЬКО свои локальные или фиче-ветки, пока они ещё никому не мешают. Понял? А то потом будешь ходить и говорить: "Я был мудак, блядь...".