Parfois, nous avons un amont qui a rebasé / rembobiné une branche dont nous dépendons. Cela peut être un gros problème - provoquant des conflits désordonnés pour nous si nous sommes en aval.
La magie est git pull --rebase
Un git pull normal est, en gros, quelque chose comme ça (nous utiliserons une télécommande appelée origine et une branche appelée foo dans tous ces exemples):
# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo
À première vue, vous pourriez penser qu'un git pull --rebase fait exactement cela:
git fetch origin
git rebase origin/foo
Mais cela n'aidera pas si le rebase en amont impliquait un "écrasement" (ce qui signifie que les patch-id des commits ont changé, pas seulement leur ordre).
Ce qui signifie que git pull --rebase doit faire un peu plus que cela. Voici une explication de ce qu'il fait et comment.
Disons que votre point de départ est le suivant:
a---b---c---d---e (origin/foo) (also your local "foo")
Le temps passe et vous avez fait quelques commits en plus de votre propre "foo":
a---b---c---d---e---p---q---r (foo)
Pendant ce temps, dans une crise de rage antisociale, le mainteneur en amont a non seulement rebasé son "foo", il a même utilisé une ou deux courges. Sa chaîne de validation ressemble maintenant à ceci:
a---b+c---d+e---f (origin/foo)
Un git pull à ce stade entraînerait le chaos. Même un git fetch; git rebase origin / foo ne le couperait pas, car les commits "b" et "c" d'un côté, et le commit "b + c" de l'autre, seraient en conflit. (Et de même avec d, e et d + e).
Qu'est git pull --rebase
- ce que, dans ce cas, c'est:
git fetch origin
git rebase --onto origin/foo e foo
Cela vous donne: