361 votes

La différence entre la commande git pull et git pull --rebase

J'ai commencé à utiliser git parfois en arrière et de ne pas bien comprendre les subtilités. Ma question de base ici est de savoir la différence entre un git pull et git pull --rebase , depuis l'ajout de l' --rebase option ne semble pas faire quelque chose de très différent : il suffit de ne un pull.

Merci de m'aider à comprendre la différence.

371voto

mvp Points 29360

git pull = git fetch + git merge contre suivi en amont de la branche.

git pull --rebase = git fetch + git rebase contre suivi en amont de la branche.

Si vous voulez savoir comment git merge et git rebase diffèrent, lisez ceci.

260voto

Mauri Lopez Points 362

Parfois, nous avons un amont qui relocalisée/remonter une branche nous sommes des selon les. Cela peut être un gros problème, causant un désordre conflits pour nous si nous sommes en aval.

La magie de commande est - git pull --rebase

Normal git pull est, grosso modo, quelque chose comme ceci (nous allons utiliser une distance 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 juste cela:

git fetch origin
git rebase origin/foo

Mais cela ne l'aidera pas si, en amont, rebase impliqués "écraser" (ce qui signifie que le patch id de la commet changé, et pas seulement leur ordre).

Ce qui signifie git pull --rebase a faire un peu plus que cela. Voici une explication de ce qu'il fait et comment.

Disons-votre point de départ est ceci:

a---b---c---d---e  (origin/foo) (also your local "foo")
Time passes, and you have made some commits on top of your own "foo":

a---b---c---d---e---p---q---r (foo)

Pendant ce temps, dans un ajustement de l'anti-social de la rage, de la responsable amont n'a pas seulement relocalisée son "toto", il a même utilisé un squash ou deux. Son commit de la chaîne d'ressemble maintenant à ceci:

a---b+c---d+e---f  (origin/foo)

Un git pull à ce stade, le résultat serait le chaos. Même un git fetch; git rebase origine/foo ne serait pas le couper, parce que s'engage "b" et "c" sur une face, et de s'engager "b+c" sur l'autre, serait en conflit. (Et de même avec d, e et d+e).

Ce que git pull --rebase fait, dans ce cas, est:

git fetch origin
git rebase --onto origin/foo e foo

Cela vous donne:

a---b+c---d+e---f---p'---q'---r' (foo)

Vous pouvez toujours obtenir les conflits, mais ils seront de véritables conflits (entre p/q/r et a/b+c/d+e/f), et pas de conflits causés par les b/c en conflit avec b+c, etc.

10voto

drahnr Points 3628

Dans la plupart des cas simple de pas de collisions

  • avec rebase: rebases votre local s'engage ontop de distance de la TÊTE et de ne pas créer une fusion/fusion de commettre
  • sans/normal: fusionne et crée une fusion de commettre

Voir aussi:

man git-pull

Plus précisément, la commande git pull fonctionne git fetch avec les paramètres donnés et appels git merge pour fusionner l'extrait chefs de direction dans le courant de de la branche. --Rebase, il exécute la commande git rebase au lieu de git merge.

Voir aussi:
Quand dois-je utiliser git pull --rebase?
http://git-scm.com/book/en/Git-Branching-Rebasing

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X