Іноді ми маємо вгору за течією, яка відновлює / перемотує гілку, від якої ми залежимо. Це може бути великою проблемою - спричиняючи для нас безладні конфлікти, якщо ми знаходимось нижче.
Магія є git pull --rebase
Звичайний потяг git - це, вільно, щось подібне (у всіх цих прикладах ми будемо використовувати віддалене походження, яке називається foo):
# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo
На перший погляд ви можете подумати, що git pull --rebase робить саме це:
git fetch origin
git rebase origin/foo
Але це не допоможе, якщо в реверсі за версією течії відбулося будь-яке "скорочення" (мається на увазі, що патчі ідентифікаторів комітетів змінилися, а не лише їх порядок).
Що означає git pull --rebase має зробити трохи більше, ніж це. Ось пояснення, що це робить і як.
Скажімо, ваш вихідний пункт такий:
a---b---c---d---e (origin/foo) (also your local "foo")
Час минає, і ви зробили деякі зобов’язання на додаток до свого "foo":
a---b---c---d---e---p---q---r (foo)
Тим часом, в розпалі антисоціальної люті, обслуговуючий вгору за течією не тільки переосмислив своє "foo", він навіть використав сквош-два. Зараз його ланцюг фіксацій виглядає приблизно так:
a---b+c---d+e---f (origin/foo)
Потяг кишки в цей момент призведе до хаосу. Навіть git fetch; git rebase origin / foo не вирізало б це, тому що виконує "b" і "c" з одного боку, а виконувати "b + c" з іншого, буде конфліктувати. (І аналогічно з d, e і d + e).
Що git pull --rebase
в цьому випадку означає:
git fetch origin
git rebase --onto origin/foo e foo
Це дає вам: