Ситуація: ви зробили коміт у main, а колега тим часом відправив свій. Тепер у вас є коміт, якого немає на сервері, а на сервері - коміт, якого немає у вас. Гілки розійшлися:
C (ваш)
/
A ── B
\
D (origin/main)
Сучасний Git при git pull у такому разі не обирає спосіб сам, а просить вирішити:
hint: You have divergent branches and need to specify how to reconcile them.
fatal: Need to specify how to reconcile divergent branches.
Три варіанти:
| Налаштування | Що відбувається | Результат |
|---|---|---|
pull.rebase false |
злиття | коміт злиття Merge branch 'main' of ... |
pull.rebase true |
rebase | ваш коміт C переноситься поверх D, історія лінійна |
pull.ff only |
лише fast-forward | при розбіжності pull відмовляється, і ви вирішуєте вручну |
git config --global pull.rebase true
# або разово
git pull --rebase
Що обрати для локальних комітів у спільній гілці - зазвичай rebase:
- ваші ще не відправлені коміти просто «перебудовуються» поверх свіжих змін;
- історія не засмічується безглуздими комітами
Merge branch 'main' of github.com:..., які нічого не означають, крім «ми з колегою працювали одночасно».
Коли rebase при pull не підходить:
- ваші локальні коміти - це злиття іншої гілки (rebase їх розгорне, якщо не вказати
--rebase=merges); - конфліктів дуже багато: rebase розв'язує їх коміт за комітом, злиття - один раз.
Корисно разом з rebase: git config --global rebase.autoStash true - незакомічені зміни автоматично ховаються в stash перед rebase й повертаються після.
Якщо щось пішло не так: git rebase --abort під час rebase, git reflog - після.