Domanda Qual è la differenza tra "git pull" e "git fetch"?


Nota del moderatore:  Dato che questa domanda ha già avuto sessantaquattro risposte  pubblicato su di esso, considera se lo sei o no contribuire a qualcosa di nuovo  prima di pubblicarne un altro

Quali sono le differenze tra git pull e git fetch?


10122
2017-11-15 09:51


origine


risposte:


Nei termini più semplici, git pull fa a git fetch seguito da a git merge.

Puoi fare un git fetch in qualsiasi momento per aggiornare i tuoi rami di monitoraggio remoto sotto refs/remotes/<remote>/.

Questa operazione non cambia mai nessuna delle tue filiali locali sotto refs/headsed è sicuro di fare senza cambiare la tua copia di lavoro. Ho persino sentito parlare di gente che corre git fetch periodicamente in un cron job in background (sebbene non consiglierei di farlo).

UN git pull è ciò che vorresti fare per aggiornare un ramo locale con la sua versione remota, mentre aggiorna anche gli altri rami di monitoraggio remoto.

Documentazione Git: tira fuori


8453
2017-11-15 09:52



  • Quando usi pull, Git prova a fare automaticamente il tuo lavoro per te. È sensibile al contesto quindi Git unirà qualsiasi commit tirato nel ramo in cui stai attualmente lavorando. pull  unisce automaticamente i commit senza che tu possa prima controllarli . Se non gestisci da vicino le tue filiali, potresti incontrare frequenti conflitti.

  • Quando tu fetch, Git raccoglie qualsiasi commit dal ramo di destinazione che non esiste nel tuo ramo attuale e li memorizza nel tuo repository locale . Però, non li fonde con il tuo attuale ramo . Ciò è particolarmente utile se è necessario mantenere aggiornato il repository, ma sta lavorando su qualcosa che potrebbe interrompersi se si aggiornano i file. Per integrare i commit nel tuo ramo master, usi merge.


1849
2017-08-18 08:53



È importante confrontare la filosofia del design di git con la filosofia di uno strumento di controllo del codice sorgente più tradizionale come SVN.

Subversion è stato progettato e realizzato con un modello client / server. Esiste un unico repository che è il server, e diversi client possono recuperare il codice dal server, lavorarci sopra, quindi reinserirlo nel server. Il presupposto è che il client possa sempre contattare il server quando è necessario eseguire un'operazione.

Git è stato progettato per supportare un modello più distribuito senza la necessità di un repository centrale (sebbene tu possa sicuramente usarne uno se lo desideri). Anche git è stato progettato in modo che il client e il "server" non debbano essere online allo stesso tempo. Git è stato progettato in modo che le persone su un link inaffidabile possano scambiare il codice via email, anche. È possibile lavorare completamente disconnesso e masterizzare un CD per lo scambio di codice tramite git.

Per supportare questo modello git gestisce un repository locale con il proprio codice e anche un repository locale aggiuntivo che rispecchia lo stato del repository remoto. Mantenendo una copia del repository remoto localmente, git può capire le modifiche necessarie anche quando il repository remoto non è raggiungibile. Successivamente, quando è necessario inviare le modifiche a qualcun altro, git può trasferirle come un insieme di modifiche da un punto nel tempo noto al repository remoto.

  • git fetchè il comando che dice "aggiorna la mia copia locale del repository remoto".

  • git pull dice "porta i cambiamenti nel repository remoto dove tengo il mio codice".

Normalmente git pull lo fa facendo a git fetch per aggiornare la copia locale dell'archivio remoto e quindi unire le modifiche nel proprio repository di codice e possibilmente nella propria copia di lavoro.

Il take away è da tenere a mente che ci sono spesso almeno tre copie  di un progetto sulla tua workstation. Una copia è il tuo repository con la tua cronologia di commit. La seconda copia è la tua copia di lavoro in cui stai modificando e costruendo. La terza copia è la tua copia "cache" locale di un repository remoto.


1007
2018-03-31 18:43



Qui è L'immagine di Oliver Steele di come tutto si combina perfettamente :

enter image description here

Se c'è un interesse sufficiente, suppongo di poter aggiornare l'immagine da aggiungere git clone e git merge...


660
2018-06-09 13:30



Un caso d'uso di git fetch è che quanto segue ti dirà eventuali cambiamenti nel ramo remoto dal tuo ultimo tiro ... in modo da poter controllare prima di fare un tiro reale, che potrebbe cambiare i file nel tuo ramo corrente e copia di lavoro.

git fetch
git diff ...origin

426
2018-05-07 19:23



Mi è costato un po 'capire qual era la differenza, ma questa è una spiegazione semplice. master nel tuo localhost è un ramo.

Quando si clona un repository, si recupera l'intero repository sull'host locale. Ciò significa che in quel momento hai un puntatore origine / master su HEAD e maestro che punta allo stesso HEAD.

quando inizi a lavorare e ti impegni, fai avanzare il puntatore del master su HEAD + i tuoi impegni. Ma il puntatore origine / master punta ancora a quello che era quando hai clonato.

Quindi la differenza sarà:

  • Se fai un git fetch scaricherà solo tutte le modifiche nel repository remoto ( GitHub ) e spostare il puntatore origine / master su HEAD. Nel frattempo il tuo supervisore di ramo locale continuerà a indicare dove si trova.
  • Se fai un git pull, in pratica eseguirà il recupero (come spiegato in precedenza) e unirà tutte le nuove modifiche al ramo master e sposterà il puntatore su HEAD.

341
2018-05-11 18:37



A volte una rappresentazione visiva aiuta.

enter image description here


179
2018-01-25 17:28



Brevemente

git fetch è simile a pull ma non si fonde. ad esempio recupera aggiornamenti remoti ( refs e objects) ma il tuo locale rimane lo stesso (ad es. origin/master viene aggiornato ma master resta lo stesso) .

git pull tira giù da un telecomando e si fonde all'istante.

Di Più

git clone clona un repo.

git rebase salva materiale dal ramo corrente che non si trova nel ramo upstream in un'area temporanea. Il tuo ramo è ora lo stesso di prima di iniziare le modifiche. Così, git pull -rebase tirerà giù le modifiche remote, riavvolgerà il tuo ramo locale, riprodurrà le tue modifiche sulla parte superiore del tuo ramo corrente una alla volta fino a quando non sarai aggiornato.

Anche, git branch -a ti mostrerà esattamente cosa sta succedendo con tutte le tue filiali - locali e remote.

Questo post del blog è stato utile:

La differenza tra git pull, git fetch e git clone (e git rebase) - Mike Pearce

e copre git pull, git fetch, git clone e git rebase.

====

AGGIORNARE

Ho pensato di aggiornarlo per mostrare come lo utilizzeresti in pratica.

  1. Aggiorna il repository locale dal telecomando (ma non unire):

    git fetch

  2. Dopo aver scaricato gli aggiornamenti, vediamo le differenze:

    git diff master origin / master

  3. Se sei soddisfatto di questi aggiornamenti, quindi unisci:

    tira fuori

Gli appunti:

Al punto 2: per maggiori informazioni sulle differenze tra locale e telecomandi, vedere: confrontare il ramo git locale con il ramo remoto?

Al punto 3: Probabilmente è più preciso (ad esempio su un repository che cambia rapidamente) per fare a git rebase origin Qui. Vedi il commento di @Justin Ohms in un'altra risposta.

Guarda anche: http://longair.net/blog/2009/04/16/git-fetch-and-merge/  


165
2018-04-13 17:31



git-pull - Recupera e fonde con un altro repository o un ramo locale
SINOSSI

git pull ...
DESCRIZIONE

Esegue git-fetch con i parametri specificati e chiama git-merge per unire il file
testa (e) recuperata nel ramo attuale. Con --rebase, chiama git-rebase
invece di git-merge.

Nota che puoi usare. (directory corrente) come <repository> da estrarre
dal repository locale - questo è utile quando si uniscono i rami locali
nel ramo attuale.

Nota anche che le opzioni sono pensate per git-pull e per git-merge sottostanti
deve essere dato prima delle opzioni pensate per git-fetch.
 

Tireremmo se volete che le storie si uniscano, voi otterreste se solo "volete il codez" dato che qualcuno ha etichettato alcuni articoli qui intorno.


155
2017-11-15 09:52



È possibile recuperare da un repository remoto, vedere le differenze e quindi tirare o unire.

Questo è un esempio per un repository remoto chiamato origin e un ramo chiamato master rintracciare il ramo remoto origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git rebase origin master

143
2018-03-21 11:07



La risposta breve e facile è quella git pull è semplicemente git fetch seguito da git merge.

È molto importante notare questo git pull volere Unisci automaticamente se ti piace o no . Ciò potrebbe, naturalmente, causare conflitti di fusione. Diciamo che il tuo telecomando è origin e il tuo ramo è master. Se tu git diff origin/master prima di tirare, dovresti avere qualche idea di potenziali conflitti di fusione e potresti preparare la tua filiale locale di conseguenza.

Oltre a tirare e spingere, alcuni flussi di lavoro  coinvolgere git rebase, come questo, che ho parafrasato dall'articolo collegato:

git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch

Se ti trovi in ​​una situazione del genere, potresti essere tentato di farlo git pull --rebase. A meno che tu non sappia davvero cosa stai facendo, ti sconsiglio di farlo. Questo avviso proviene dal man pagina per git-pull, versione 2.3.5:

Questa è una modalità di funzionamento potenzialmente pericolosa. Riscrive   storia, che non promette nulla di buono quando hai pubblicato quella storia   già. Non usare questa opzione se non hai letto git-rebase (1)   accuratamente.


132
2018-05-15 20:53