web-dev-qa-db-fra.com

git rebase upstream / master vs git pull --rebase upstream master

Y a-t-il une différence entre git rebase upstream/master et git pull --rebase upstream master, et si oui, quoi? La télécommande peut être n'importe quelle télécommande, pas nécessairement en amont.

40
Dennis

Le git pull --rebase va récupérer (git fetch) d'abord, en mettant à jour upstream/master valide.

Si vous venez de rebaser sans mettre à jour d'abord upstream/master, vous n'obtiendrez pas le même résultat.

Je l'illustre dans la branche " master et 'Origin/master 'ont divergé, comment' dériver 'les branches'? "


SnakE mentionne dans les commentaires que git pull --rebase n'est pas exactement git fetch && git rebase Origin/master.
Voir " qu'est-ce que" git pull --rebase "faire? "

(Origin/master)
   |
A--B--C (master)
 \ 
  B'--D (actual Origin/master after changing B and force pushing)

Quoi git pull --rebase est, dans ce cas:

git fetch Origin
git rebase --onto Origin/master B master

Ici:

  • Origin/master est la nouvelle mise à jour Origin/master (B')
  • B est l'ancien Origin/master (avant une extraction mise à jour)
  • master est la branche à relire au-dessus de Origin/master

Cela diffère de git fetch + git rebase Origin/master en ce que le pull --rebase commande essaie de savoir quels commits sont vraiment vos commits locaux, et qui sont venus de l'amont lors d'une extraction précédente.

Pour ce faire, il regarde le reflog de la branche de suivi à distance (Origin/master, dans ce cas). Ce reflog représente les astuces de git fetch opérations sur Origin, dans l'ordre "le plus récent en premier".

Pour chaque entrée de reflog, (Origin/master@{1}, puis ...{2}, etc.), il vérifie si cette validation est un ancêtre de la tête de branche actuelle master. Dès qu'il en trouve un, il le choisit comme point de départ pour le rebase (B dans l'exemple ci-dessus).

41
VonC