Как ответить
Суть различия: git merge создаёт новый коммит слияния (merge commit), который объединяет две ветки, сохраняя полную историю. git rebase переписывает историю — переносит коммиты текущей ветки поверх целевой, делая историю линейной. Выбор зависит от того, нужна ли вам явная точка слияния и хронология или чистая линейная история.
Как работает merge: Команда git merge feature-branch (находясь в main) создаёт merge commit, у которого два родителя — последний коммит main и последний коммит feature-branch. История остаётся полной, легко понять, когда и какие ветки сливались.
git checkout main
git merge feature-branchКак работает rebase: Команда git checkout feature-branch && git rebase main берёт коммиты из feature-branch, «отрезает» их от текущего места и прикрепляет поверх последнего коммита main. Коммиты пересоздаются с новыми хешами. После rebase вы можете сделать fast-forward merge на main.
git checkout feature-branch
git rebase main
git checkout main
git merge feature-branch # теперь будет fast-forwardКогда что использовать:
- Merge — публичные ветки (main, release), когда история должна быть неизменна и нужна информация, кто, когда и откуда сливал. Коммит слияния — явная отметка.
- Rebase — личные feature-ветки перед отправкой в main. Позволяет держать историю чистой, без лишних merge-коммитов (история линейна). Никогда не делайте rebase публичных веток — вы перепишете историю, у других возникнут конфликты.
Важные детали: При rebase каждый коммит применяется заново, поэтому может возникнуть конфликт на каждом коммите. При merge конфликт решается один раз в merge commit. Rebase требует принудительного пуша (git push --force-with-lease), merge — обычного push.
Есть ещё git merge --squash, который «схлопывает» все коммиты в один, но это отдельный инструмент.