2012-08-09 12 views
18

Questo è principalmente la natura di una curiosità mentre sto cercando di familiarizzare con Git. Ho esaminato la documentazione di 'git fetch' ma non vedo una spiegazione ovvia per il seguito. Grazie in anticipo, e scuse se questo è terribilmente ovvio.git fetch vs. git fetch origine master ha diversi effetti sul ramo di rilevamento

1) Da un repository centrale, ad esempio GitHub, ho clonato un repository denominato website su ciascuna delle due macchine, HostA e HostB.

2) su HostA, apporto una modifica a un file, ad esempio README.txt, e lo impegno.
A questo punto il HostA, i commit per rami master e origin/master sono, come prevedibile diversa poiché non ho ancora spinto

git show master 
git show origin/master 

rapporto hash diversi (dal master ha il cambiamento e origin/master non lo fa)

3) Una volta premuto, lo sono dopo lo stesso.


4) Ora, sopra su HostB, se faccio la seguente:

git fetch 
git merge FETCH_HEAD 

dopo, il HostB master e origin/master rapporto lo stesso hash quando interrogato con git show

MA

se invece l'avessi fatto, su HostB:

git fetch origin master 
git merge FETCH_HEAD 

a quel punto gli hash differiscono ancora.

git show origin 
git show origin/master 

rapporto diverso hash

il ramo di monitoraggio origin/master non viene aggiornato fino a quando faccio una pianura git fetch

perché è questo?

+0

Quasi duplicato: (il fatto che sia pull, non preleva, non fa alcuna differenza sostanziale) http://stackoverflow.com/questions/1741143/git-pull-origin-mybranch-leaves-local-mybranch-n- commits-ahead-of-origin-why –

risposta

20

Se il ramo ha associato un remote tracking branch che significa la sua configurazione è simile:

git config branch.[branch-name].remote [remote-name] 
git config branch.[branch-name].merge [remote-master] 

La parte fondamentale di git fetch che spiegano la differenza tra i due comandi è:

<refspec> 

Il formato di un parametro <refspec> è un valore facoltativo più +, seguito dall'origine ref <src>, seguito da due punti :, seguito dal riferimento di destinazione <dst>.
Viene recuperato il riferimento remoto corrispondente a <src> e se <dst> non è una stringa vuota, il riferimento locale corrispondente viene inoltrato rapidamente utilizzando <src>.

ripeto che:

se <dst> non è stringa vuota, l'arbitro locale che corrisponde è veloce-inoltrato utilizzando <src>.
Sapendo che:

  • git fetch è equivalente a git fetch origin master:master (dal valore di default della vostra configurazione ramo), in modo che aggiornerà il ramo di monitoraggio remoto: la destinazione del refspec è specificato per Si.

  • git fetch origin master è equivalente a "git fetch origin master:", non "git fetch origin master:master"; memorizza il valore inverosimile di 'master' ramo (di distanza 'origin ') in FETCH_HEAD, e non in' master' ramo o remoto-tracking 'remotes/origin/master' ramo (da Jakub Narębski s' answer)
    In altre parole, si didn 't specificare la destinazione del vostro refspec

+0

Hi VonC: Grazie mille, questo è esattamente quello che dovevo sapere. – Xoanon93

+0

@ Xoanon93 Prego. Torno sempre su http://stackoverflow.com/questions/1070496/having-a-hard-time-understanding-git-fetch in caso di dubbi sui rami di monitoraggio remoto. – VonC

+2

mi fa male il cervello. –

0

La risposta si trova nei messaggi che si torna da git fetch. Nel primo caso, quando si recupera senza fornire una refspec, vedrai che i rami di monitoraggio remoti vengono aggiornati:

remote: Counting objects: 5, done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From /depot 
    c67d1c8..1941673 master  -> origin/master 

Si noti come il messaggio dice che l'origine/master viene aggiornato con il maestro dall'origine.

Ora, nel secondo caso, in cui si specifica il refspec, si ottiene qualcosa di completamente diverso:

remote: Counting objects: 5, done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From /depot 
* branch   master  -> FETCH_HEAD 

Così, quando si specifica il refspec, il ramo di monitoraggio remoto (origine/master) non è aggiornato, solo FETCH_HEAD.

Il risultato finale è che sembrerà di essere più avanti dell'origine/master quando non lo sei davvero.Non riesco a immaginare perché questo comportamento sia desiderabile, ma è sicuramente un piccolo capriccio interessante del comando fetch.

0

Se si vuole avanzare rapidamente unire se stessi, o utilizzare git pull. Sembra che tu non capisca che lo scopo di git fetch NON è quello di aggiornare il tuo albero di lavoro. Fetch ha lo scopo di aggiornare i tuoi rami di monitoraggio.