Как объединить несколько коммитов в один (squash)?
Squash — объединение нескольких коммитов в один. Это полезно, когда вы сделали много мелких коммитов в feature-ветке ("wip", "fix typo", "fix again") и хотите представить их как один чистый коммит в истории.
Через interactive rebase: git rebase -i HEAD~4, где 4 — количество коммитов для объединения. Откроется редактор со списком коммитов. Каждый коммит помечен словом pick. Измените pick на squash (или просто s) для коммитов, которые хотите объединить с предыдущим. Первый коммит оставьте pick — он будет базовым. Сохраните и закройте редактор. Откроется второй редактор для редактирования сообщения объединённого коммита — впишите чистое описание всех изменений.
Пример: у вас 4 коммита — "feat: add form", "fix: validation", "typo", "style: button". Выполните git rebase -i HEAD~
После сохранения впишите новое сообщение: "feat: add registration form with validation and styling". Получится один коммит вместо четырёх.
Через git merge --squash: при слиянии feature-ветки в main выполните git merge --squash feature-branch. Git объединит все изменения, но не создаст merge-коммит. Затем git commit -m "feat: add registration form" — один коммит со всеми изменениями. Это проще, но теряется история feature-ветки.
Через git reset --soft: для объединения последних N коммитов выполните git reset --soft HEAD~N. Все изменения из N коммитов соберутся в индексе. Затем git commit -m "новое сообщение" — один коммит вместо N. Быстро, но не даёт выбрать, какие коммиты объединять.
После squash на уже запушенной ветке: git push --force-with-lease. История переписана, поэтому нужен force-push. Предупредите команду, если ветка общая.
Хорошая практика: делайте squash перед merge feature-ветки в main. Это даёт чистую историю main, где каждый коммит — одна завершённая функция, а не серия "wip" и "fix typo".