2013-03-24 30 views

risposta

32

innanzitutto, l'aggiornamento di upstream/master viene eseguito.

Se hai appena rebase senza aggiornare prima upstream/master, non sarà possibile ottenere lo stesso risultato.

ho illustrano in "master branch and 'origin/master' have diverged, how to 'undiverge' branches'?"


SnakE menzioni in the comments che git pull --rebase non è esattamente git fetch && git rebase origin/master.
Vedere "what does "git pull --rebase" do?"

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

Cosa git pull --rebase fa, in questo caso, è:

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

Qui:

  • origin/master è il nuovo aggiornato origin/master (B')
  • B è il vecchio origin/master (prima di una operazione di recupero aggiornati esso)
  • master è il ramo per riprodurre in cima origin/master

Questo differisce da git fetch + git rebase origin/master a che il comando pull --rebase cerca di scoprire che impegna sono davvero tuo locale quelli, che provenivano da monte in una raccolta precedente.

Per fare ciò, guarda il reflog del ramo di localizzazione remota (origin/master, in questo caso). Questo riferimento rappresenta i suggerimenti delle successive operazioni git fetch su origin, nell'ordine "più recente prima".

Per ciascuna voce di prospetto, (origin/[email protected]{1}, quindi ...{2} e così via) viene verificato se tale commit è un antenato dell'attuale capo di diramazione master. Non appena ne trova uno, lo preleva come punto di partenza per il rebase (B nell'esempio sopra).

+10

Quindi 'git pull --rebase upstream master' è analogo a' git fetch upstream && git rebase upstream/master'? – Dennis

+0

@Dennis praticamente, si. – VonC

+2

In realtà no. Immagina di aver tirato la storia 'A-B' e di aver apportato una modifica in cima,' A-B-C'. Poi qualcun altro ha modificato 'B' in' B'' e foce-ha spinto le loro modifiche in modo che l'origine sia ora 'A-B'-D'. Ora se esegui 'git fetch && git rebase origin/master' il rebase fallirà con i conflitti. Comunque 'git pull --rebase' lo capirà e finirà con' A-B'-D-C'. Una certa magia sta sicuramente accadendo sotto il tappeto in 'pull --rebase'. Modifica: [prooflink] (http://gitolite.com/git-pull--rebase.html) – SnakE