A volte abbiamo un upstream che ha rinnovato / riavvolto un ramo da cui dipendiamo. Questo può essere un grosso problema - causando conflitti disordinati per noi se siamo a valle.
La magia è git pull --rebase
Un normale git pull è, in termini vaghi, qualcosa del genere (useremo un telecomando chiamato origin e un ramo chiamato foo in tutti questi esempi):
# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo
A prima vista, potresti pensare che un git pull --rebase faccia proprio questo:
git fetch origin
git rebase origin/foo
Ma ciò non sarà d'aiuto se il rebase upstream implicasse qualche "schiacciamento" (il che significa che i patch-id degli commit sono cambiati, non solo il loro ordine).
Ciò significa che git pull --rebase deve fare un po 'di più. Ecco una spiegazione di cosa fa e come.
Diciamo che il tuo punto di partenza è questo:
a---b---c---d---e (origin/foo) (also your local "foo")
Il tempo passa e hai fatto alcuni commit in cima al tuo "pippo":
a---b---c---d---e---p---q---r (foo)
Nel frattempo, in un impeto di rabbia antisociale, il manutentore a monte non ha solo riformato il suo "foo", ma ha anche usato uno o due squash. La sua catena di commit ora appare così:
a---b+c---d+e---f (origin/foo)
A questo punto un tiro di sbalzo provocherebbe il caos. Perfino un git fetch; git rebase origin / foo non lo taglierebbe, perché commette "b" e "c" da un lato e commettere "b + c" dall'altro, sarebbe in conflitto. (E allo stesso modo con d, e, d + e).
Cosa git pull --rebase
significa, in questo caso,:
git fetch origin
git rebase --onto origin/foo e foo
Questo ti dà: