Às vezes, temos um upstream que reformulou / rebobinou um ramo em que estamos dependendo. Isso pode ser um grande problema - causando conflitos confusos para nós, se estivermos no downstream.
A mágica é git pull --rebase
Um pull normal do git é, de maneira geral, algo assim (usaremos um remoto chamado origin e um branch chamado foo em todos esses exemplos):
# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo
À primeira vista, você pode pensar que um git pull --rebase faz exatamente isso:
git fetch origin
git rebase origin/foo
Mas isso não ajudará se a reorganização upstream envolver qualquer "esmagamento" (o que significa que os IDs de patch dos commits mudaram, não apenas a ordem deles).
O que significa que o git pull --rebase precisa fazer um pouco mais do que isso. Aqui está uma explicação do que ele faz e como.
Digamos que seu ponto de partida é este:
a---b---c---d---e (origin/foo) (also your local "foo")
O tempo passa e você fez alguns commit em cima do seu próprio "foo":
a---b---c---d---e---p---q---r (foo)
Enquanto isso, em um ataque de raiva anti-social, o mantenedor do montante não apenas rebateu seu "foo", mas também usou uma ou duas abóboras. Sua cadeia de commit agora se parece com isso:
a---b+c---d+e---f (origin/foo)
Um puxão do git nesse ponto resultaria em caos. Até um git buscado; O git rebase origin / foo não o eliminaria, pois confirma "b" e "c" de um lado e confirma "b + c" do outro. (E da mesma forma com d, e, e d + e).
O git pull --rebase
que, neste caso, é:
git fetch origin
git rebase --onto origin/foo e foo
Isso lhe dá: