Git·19 вопросов

Как объединить несколько коммитов в один (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~

Измените: pick a1b2c3d feat: add form squash d4e5f6g fix: validation squash h7i8j9k typo squash l0m1n2o style: button

После сохранения впишите новое сообщение: "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".

Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем