2016-05-20 3 views
5

Non sono mai stato in grado di ottenere una risposta chiara a questa domanda.Git: pull vs. fetch → pull

Per lungo tempo, e al advisement di un collega, ho fatto questo:

git fetch origin 
git pull origin <mybranch> 

Mi è stato detto (e ho visto) che git pull non si comporta allo stesso modo se non devi prima fare git fetch. Non si ottiene alcuna modifica remota.

Ma tutto quello che vedo online è che git pull è l'equivalente di git fetch seguito da git merge. Se ciò fosse vero, git fetch includerebbe git fetch e non avrei bisogno prima di un esplicito git fetch, giusto? Ma non sembra essere il caso.

Quindi quello che sto cercando è una documentazione esplicita che descrive il comportamento osservato di git pull. (Lo so io probabilmente anche ottenere un sacco di consigli per passare alla git fetchgit merge, questo è troppo fine, ma sono davvero interessato a git pull.)

+1

[documentazione ufficiale] (https://git-scm.com/docs/git-pull): incorpora le modifiche da un repository remoto nel ramo corrente. Nella sua modalità predefinita, 'git pull' è una scorciatoia per' git fetch' seguito da 'git unire FETCH_HEAD'. – PetSerAl

+0

Il recupero è utile per visualizzare le nuove modifiche prima che vengano applicate al repository locale. – SeinopSys

risposta

9

Probabilmente dovremmo chiudere questo come un duplicato, ma prima che ciò accada, fammi vedere se riesco a spremere questo.

Mentre git pull davvero ègit fetch seguito da git merge (o git rebase), la differenza preciso sta nel comegit pull piste git fetch.

particolare:

$ git pull

o:

$ git pull remote-name branch-name

(o diverse varianti simili) compatibile, non semplice git fetch, non git fetch remote-name, ma git fetch remote-name branch-name.

Questo ha meno differenza, dal momento che Git version 1.8.4, quello che faceva prima che la versione:

  • git fetch origin master differenza git fetch origin o git fetch non ha aggiornato refs/remotes/origin/master; questa era una decisione iniziale del progetto , ma in pratica si scopre che le persone lo trovano più conveniente aggiornarle opportunisticamente ogni volta che abbiamo una possibilità , e le abbiamo aggiornate quando abbiamo eseguire git push quale già rompe la "prevedibilità" originale comunque.

In altre parole, se git pull decide di correre git fetch origin master, questo aggiornerà origin/master nel repository, ma solo se non si esegue antiche versioni di Git, come quelli inclusi in alcune distribuzioni Linux senza nome.

Se si esegue git fetch origin, si otterrà tutti remote-tracking rami aggiornati (a patto di avere una configurazione ragionevole, che è il default anche in detto antiche versioni di Git). Se esegui git fetch origin master, ricevi solo origin/master aggiornato, e di nuovo solo se il tuo Git non è troppo ridicolmente obsoleto. Dal momento che git pull esegue la variante di quattro parole, aggiorna solo uno, o addirittura nessun, rami di localizzazione remota.

+0

Questo potrebbe essere. Non ho ancora avuto lo spazio mentale per fare un test approfondito, ma è la prima risposta che riconosce una qualche differenza. –

0

git pull è una prima fetch seguita da una fusione git. (oppure puoi rebase con l'opzione --rebase). Quindi no, non c'è bisogno di fare 'git fetch' prima di un 'git pull'

tipo 'git aiutare recuperare' e 'git help pull' per le descrizioni

git fetch va al repository chiamato, ottiene l'oggetto a cui viene fatto riferimento (in genere un commit), ottiene esso e tutti gli oggetti dipendenti e lo memorizza nel ramo di monitoraggio remoto denominato. Potresti quindi unire o rebase da lì. 'Git merge origin/master' o si può solo vederlo con 'git checkout origin/master'

2

Mi è stato detto (e visto) che git pull non si comporta allo stesso modo se non lo fai prima fai git fetch. Non si ottiene alcuna modifica remota.

Di solito, questo non è vero, e git pull tira lo stato dal telecomando.

Ma tutto quello che vedo online è che git pull è l'equivalente di git fetch seguito da git merge. Se fosse vero,

è!

Citando la pagina di manuale di git-pull:

sia dotato di cambiamenti da un repository remoto nel ramo corrente. Nella sua modalità predefinita, git pull è una scorciatoia per git fetch seguito da git merge FETCH_HEAD.

Penso che lo accetti.

Quindi quello che sto cercando è una documentazione esplicita

$ git help pull 
+0

Sì, guarda, ma si comporta diversamente. Posso duplicarlo tutto il giorno. Questo è ciò di cui sono confuso. –

+0

come si comporta in modo diverso? – Gregg

+0

@JohnAlexander Come è la tua impostazione di monitoraggio? 'git branch -avv' ti mostrerà. Forse i tuoi rapporti di monitoraggio non sembrano quelli che le persone qui si aspettano. –