Обидві команди переносять зміни з однієї гілки в іншу, але по-різному формують історію.
git merge main (у своїй гілці) створює коміт злиття з двома батьками. Історія показує, як було насправді: дві гілки розвивалися паралельно і зійшлися.
git rebase main переписує коміти гілки так, ніби вона почалася з останнього коміту main: кожен коміт застосовується заново й отримує новий хеш. Історія стає лінійною, без комітів злиття.
git switch feature
git rebase main # перебудувати feature поверх свіжого main
git switch main
git merge --ff-only feature # тепер злиття - просте перемотування
Що обирати:
- Rebase - для власної гілки, щоб підтягнути свіжий
mainі отримати чисту історію перед pull request. - Merge - для злиття спільних гілок і коли важливо зберегти, як саме йшла робота.
Головне правило rebase: не переписувати коміти, які вже опубліковані й використовуються іншими. Після rebase гілку доведеться відправляти з --force-with-lease, а в колег, що працювали поверх старих комітів, історія розійдеться.
Конфлікти бувають і там, і там. Але при rebase їх розв'язують по коміту: якщо гілка з 10 комітів зачіпає те саме місце, конфлікт може з'явитися кілька разів.