C'è una differenza tra git rebase upstream/master
e git pull --rebase upstream master
e, in caso affermativo, che cosa? Il telecomando potrebbe essere qualsiasi remoto, non necessariamente a monte.git rebase upstream/master vs git pull --rebase master upstream
risposta
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 vecchioorigin/master
(prima di una operazione di recupero aggiornati esso)master
è il ramo per riprodurre in cimaorigin/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 operazionigit fetch
suorigin
, 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 diramazionemaster
. Non appena ne trova uno, lo preleva come punto di partenza per il rebase (B
nell'esempio sopra).
Quindi 'git pull --rebase upstream master' è analogo a' git fetch upstream && git rebase upstream/master'? – Dennis
@Dennis praticamente, si. – VonC
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