J'ai commencé à utiliser git il y a quelque temps et je ne comprenais pas bien les subtilités. Ma question fondamentale ici est de trouver la différence entre un git pull
et un git pull --rebase
, car l’ajout de l’option --rebase
ne semble pas faire quelque chose de très différent: ne fait que tirer.
S'il vous plaît aidez-moi à comprendre la différence.
git pull
= git fetch
+ git merge
contre le suivi de la branche en amont
git pull --rebase
= git fetch
+ git rebase
contre le suivi de la branche en amont
Si vous voulez savoir en quoi _git merge
_ et _git rebase
_ diffèrent, lisez ceci .
Parfois, nous avons un processus en amont qui rebase/rembobine une branche sur laquelle nous comptons. Cela peut être un gros problème - causer des conflits en désordre pour nous si nous sommes en aval.
La magie c'est
git pull --rebase
Un git pull normal est, en gros, quelque chose comme ceci (nous allons utiliser une télécommande appelée Origin 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 tir git --rebase ne fait que ceci:
git fetch Origin git rebase Origin/foo
Mais cela n’aidera pas si la base amont impliquait un "écrasement" (ce qui signifie que les patch-ids 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 que cela 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 commis des commits en plus de votre propre "foo":
a---b---c---d---e---p---q---r (foo)
Pendant ce temps, dans un accès de rage anti-sociale, le responsable en amont n'a pas seulement rebasonné son "foo", il a même utilisé une courge ou deux. Sa chaîne de commit ressemble maintenant à ceci:
a---b+c---d+e---f (Origin/foo)
Un coup de bâton à ce stade entraînerait le chaos. Même un git chercher; git rebase Origine/foo ne l'aurait pas coupé, car commet "b" et "c" d'un côté et commet "b + c" de l'autre serait en conflit. (Et pareillement avec d, e et d + e).
Dans ce cas,
git pull --rebase
: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 avoir des conflits, mais il s'agira de véritables conflits (entre p/q/r et a/b + c/d + e/f), et non de conflits causés par un conflit entre b/c et b + c, etc.
Réponse prise de (et légèrement modifiée):
http://gitolite.com/git-pull--rebase
Supposons que vous ayez deux commits dans la branche locale:
D---E master
/
A---B---C---F Origin/master
Après "git pull", sera:
D--------E
/ \
A---B---C---F----G master, Origin/master
Après "git pull --rebase", il n'y aura plus de point de fusion G. Notez que D et E deviennent des commits différents:
A---B---C---F---D'---E' master, Origin/master
Dans le cas le plus simple d'absence de collision
Voir également:
man git-pull
Plus précisément, git pull exécute git fetch avec les paramètres donnés et appelle git fusionner pour fusionner les têtes de branches extraites dans la branche actuelle. Avec --rebase, il exécute git rebase au lieu de git merge.
Voir également:
Quand devrais-je utiliser git pull --rebase?
http://git-scm.com/book/en/Git-Branching-Rebasing
Car il est important de comprendre la différence entre Merge et Rebase.
Les bases sont la façon dont les modifications doivent passer du haut de la hiérarchie vers le bas et les fusions sont la manière dont elles sont renvoyées vers le haut.
Pour plus de détails, consultez - http://www.derekgourlay.com/archives/428