Différence entre git pull et git pull -- rebase

j'ai commencé à utiliser git il y a quelque temps et ne comprends pas pleinement les complexités. Ma question de base est ici de découvrir la différence entre un git pull et git pull --rebase , puisque l'ajout de l'option --rebase ne semble pas faire quelque chose de très différent : fait juste une traction.

Aidez-moi à comprendre la différence.

246
demandé sur Nakilon 2013-09-21 12:24:21

5 réponses

git pull = git fetch + git merge contre le traçage de la branche amont

git pull --rebase = git fetch + git rebase contre le traçage de la branche amont

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

262
répondu mvp 2017-05-23 11:47:19

parfois, nous avons un amont qui rebasé/rebound une branche dont nous dépendons. Cela peut être un gros problème -- causer des conflits confus pour nous si nous sommes en aval.

la magie est git pull --rebase

une traction normale de gitan est, grosso modo, quelque chose comme ceci (nous utiliserons 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 on pourrait penser qu'un git pull --rebase fait justement ceci:

git fetch origin
git rebase origin/foo

mais cela n'aidera pas si le rebase en amont impliquait un" squash " (ce qui signifie que les patch-ids des commits ont changé, pas seulement leur ordre).

ce qui veut dire git pull --rebase doit faire un peu plus que ça. 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 un accès de rage antisociale, le mainteneur amont n'a pas seulement rebasé son "foo", il a même utilisé un squash ou deux. Sa chaîne de commit ressemble maintenant à ceci:

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

un coup de git à ce point aboutirait au chaos. Même un git fetch; git rebase origin / foo ne le couperait pas, car il engage "b" et " c " d'un côté, et commettre "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 avoir des conflits, mais ils seront de véritables conflits (entre p/q/R et a/b+c/d+e/F), et non des conflits causés par B/C en conflit avec b+C, etc.

Réponse tirée de (et légèrement modifiée):

http://gitolite.com/git-pull--rebase

209
répondu Mauri Lopez 2017-03-28 06:13:19

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 pas de point de fusion."

A---B---C---F---D'---E'   master, origin/master
35
répondu Deqing 2016-07-01 07:46:22

dans le cas le plus simple d'absence de collision

  • 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, git pull court git fetch avec le donné les paramètres et les appelle la fusion git pour fusionner les têtes de branche récupérées dans le courant direction. Avec -- rebase, il exécute 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

9
répondu drahnr 2017-05-23 10:31:16

pour cela est important de comprendre la différence entre la fusion et Rebase.

Rebases sont comment les changements doivent passer par le haut de la hiérarchie vers le bas et les fusions sont comment ils reviennent vers le haut.

pour plus de détails, voir - http://www.derekgourlay.com/archives/428

7
répondu Sagar Mody 2015-01-21 09:27:37