Иногда у нас есть апстрим, который перебазирует / перематывает ветку, от которой мы зависим. Это может быть большой проблемой - вызывать беспорядки для нас, если мы находимся вниз по течению
Магия git pull --rebase
Обычное git pull - это, собственно говоря, что-то вроде этого (мы будем использовать пульт с именем origin и ветку 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)
Между тем, в порыве антисоциальной ярости, сопровождающий вверх по течению не только отказался от своего «фу», он даже использовал сквош или два. Его цепочка коммитов теперь выглядит так:
a---b+c---d+e---f (origin/foo)
Тяга в этой точке может привести к хаосу. Даже мерзкий выбор; 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
Это дает вам: