2011-12-31 21 views
36

Secondo la documentazione, git pull esegue un git recuperare quindi una fusione git, ma in quel caso l'esecuzione git origine tirare maestro dovrebbe eseguire una git recuperare origine padrone giusto? Tuttavia, non sembra farlo. Ecco un esempio.git pull master di origine non aggiorna origine/master?

Supposed mio padrone origine remota (su GitHub nel mio caso) ha la seguente storia:

commit 1111111 : my first commit 
commit 2222222 : a commit from someone else 

e ho solo il mio primo impegno a livello locale come fanno seguenti spettacoli

git checkout master 
git log --pretty=format:'%h' -n 1 
1111111 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
1111111 

Da qui fare il mio tiro e guardare i risultati come segue:

git checkout master 
git pull origin master 

git log --pretty=format:'%h' -n 1 
2222222 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
1111111 

come si vede, il pu Ho infatti aggiornato il mio ramo master con i nuovi commit (s) dall'origine remota, ma il mio origine/master locale è ancora dove era. Mi costringe a fare il seguente

git fetch origin master 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
2222222 

È questo comportamento corretto per Git Pull o potrebbe essere configurato un messaggio mancante? Ho guardato attraverso la pagina man di git pull e non ho visto nulla che suggerisse questo, ma potrei averlo perso.

+0

vedere se questo aiuta a spiegare perché a voi. http://stackoverflow.com/questions/2452226/master-branch-and-origin-master-have-diverged-how-to-undiverge-branches o questo http://stackoverflow.com/questions/2883840/differenze -tra-git-pull-origin-master-git-pull-origin-master – carbonbasednerd

+1

possibile duplicato di ['git pull origin mybranch' lascia il mybranch locale N commette prima dell'origine. Perché] (http: // StackOverflow.it/questions/1741143/git-pull-origin-mybranch-leaves-local-mybranch-n-commits-ahead-of-origin-why) –

+0

Si potrebbe voler prendere in considerazione 'git fetch' seguito da' git merge'. In genere finirai con meno sorprese e avrai più controllo su come unire. –

risposta

28

È un po 'strano, ma se si utilizza git pull [remote] <refspec> in realtà non aggiorna i riferimenti remoti. Ha senso se ci pensi in un certo modo: dal momento che stai specificando uno specifico ref da recuperare, non deve cercare nulla sui tuoi branch remoti, quindi non sa di cosa sia il branch remoto dovrebbe aggiornare. Ovviamente potrebbe capirlo, e non sarei sorpreso se alla fine venisse risolto, ma questo è il comportamento esistente. (Potrebbero esserci messaggi sulla mailing list a riguardo - non lo so.)

Si può facilmente aggirare, però. Se si utilizza git pull origin/master, poiché si specifica cosa recuperare tramite un ramo remoto, è necessario aggiornare tale ramo remoto. E se sei sulla tua diramazione master (o su qualsiasi altra origine/master di tracciamento delle diramazioni), puoi semplicemente fare git pull e lasciare che riempia i valori predefiniti, e aggiornerà i rami remoti.

Questo è documentato nella pagina man git-pull, più concisamente sotto ESEMPI ma anche altrove. La parte rilevante:

confluire nel ramo corrente della filiale remota prossimo:

$ git pull origin next 

Questo lascia una copia del prossimo temporaneamente FETCH_HEAD, ma non aggiorna alcun filiali remote-tracking. Utilizzando filiali remote-tracking, lo stesso può essere fatto invocando prendere e si fondono:

$ git fetch origin 
$ git merge origin/next 
+0

È documentato ovunque nelle pagine di Git Man? –

+0

È sepolto da qualche parte nella pagina di manuale di 'git-pull', penso. Cercherò di dargli la caccia qualche volta dopo, se ricordo. – Cascabel

+0

@KennethBaltrinic: si trova nella sezione degli esempi e può essere dedotto anche dal resto della documentazione. – Cascabel

Problemi correlati