Иногда у нас есть восходящий поток, который сворачивает/перематывает ветвь, в которой мы зависим. Это может быть большой проблемой - вызывать беспорядочные конфликты для нас, если мы отстаем.
Магия git pull --rebase
Нормальный git pull, говоря свободно, что-то вроде этого (мы будем использовать удаленный названный источник и ветвь, называемую 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)
A git pull в этой точке приведет к хаосу. Даже 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
Это дает вам: