Як об'єднати кілька комітів в один (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".