In parole povere, se stavi per salire su un aereo senza alcuna connessione a Internet ... prima di partire, potresti semplicemente farlo git fetch origin <master>
. Recupererebbe tutte le modifiche nel tuo computer, ma le manterrà separate dallo sviluppo / area di lavoro locale.
Sull'aereo, è possibile apportare modifiche allo spazio di lavoro locale e quindi unirlo a ciò che è stato recuperato e risolvere potenziali conflitti di unione tutti senza una connessione a Internet. E a meno che qualcuno non abbia apportato nuove modifiche contrastanti al repository remoto, una volta arrivato a destinazione lo faresti git push origin <branch>
e andresti a prendere il tuo caffè.
Da questo fantastico tutorial di Atlassian :
Il git fetch
comando scarica commit, file e ref da un repository remoto nel repository locale.
Recuperare è ciò che fai quando vuoi vedere su cosa hanno lavorato tutti gli altri . È simile all'aggiornamento SVN in quanto ti consente di vedere come è progredita la cronologia centrale, ma non ti obbliga a unire effettivamente le modifiche nel tuo repository. Git isola il contenuto recuperato come contenuto locale esistente , non ha assolutamente
alcun effetto sul lavoro di sviluppo locale . Il contenuto recuperato deve essere verificato esplicitamente utilizzando il git checkout
comando. Questo rende il recupero un modo sicuro per rivedere i commit prima di integrarli con il tuo repository locale.
Al contenuto scaricato da un repository remoto, git pull
e git fetch
comandi sono disponibili per realizzare il compito. Puoi prendere in considerazione
git fetch
la versione "sicura" dei due comandi. Scaricherà il contenuto remoto, ma non aggiornerà lo stato di funzionamento del repository locale, lasciando intatto il lavoro corrente. git pull
è l'alternativa più aggressiva, scaricherà il contenuto remoto per il ramo locale attivo ed eseguirà immediatamente git merge
per creare un commit di unione per il nuovo contenuto remoto. Se sono in corso modifiche in corso, ciò causerà conflitti e darà il via al flusso di risoluzione dei conflitti di unione.
Con git pull
:
- Non ottieni alcun isolamento.
- Colpisce il tuo sviluppo locale.
- Non ha bisogno di essere verificato esplicitamente. Perché lo fa implicitamente a
git merge
.
- Fondamentalmente NON è sicuro. È aggressivo
- A differenza di
git fetch
dove influenza solo il tuo .git/refs/remotes
, git pull influenzerà sia il tuo che il tuo.git/refs/remotes
.git/refs/heads/
Hmmm ... quindi se non sto aggiornando la copia funzionante git fetch
, allora dove sto facendo le modifiche? Dove Git fetch memorizza i nuovi commit?
Ottima domanda Lo mette da qualche parte isolato dalla tua copia di lavoro. Ma di nuovo dove? Scopriamolo.
Nella directory del tuo progetto (ovvero, dove esegui i tuoi git
comandi) fai:
ls
. Questo mostrerà i file e le directory. Niente di speciale, lo so.
Adesso fallo ls -a
. Questo mostrerà dot file , vale a dire, i file che iniziano con .
Sarete quindi in grado di vedere una directory chiamata: .git
.
- Fare
cd .git
. Questo ovviamente cambierà la tua directory.
- Ora arriva la parte divertente; fare
ls
. Vedrai un elenco di directory. Stiamo cercando refs
. Fare cd refs
.
- È interessante vedere cosa c'è dentro tutte le directory, ma concentriamoci su due di esse.
heads
e remotes
. Utilizzare cd
per controllare anche al loro interno.
- Qualsiasi
git fetch
cosa tu faccia aggiornerà gli elementi nella /.git/refs/remotes
directory. Non aggiornerà nulla nella /.git/refs/heads
directory.
- Chiunque
git pull
eseguirà prima di tutto git fetch
, aggiornerà gli elementi nella /.git/refs/remotes
directory, quindi si unirà al proprio locale e quindi cambierà la testa all'interno della /.git/refs/heads
directory.
Una risposta correlata molto buona può anche essere trovata in Dove si posiziona 'git fetch'? .
Inoltre, cerca "Notazione barra" nel post delle convenzioni di denominazione del ramo Git . Ti aiuta a capire meglio come Git colloca le cose in diverse directory.
Per vedere la differenza reale
Basta fare:
git fetch origin master
git checkout master
Se il master remoto è stato aggiornato, riceverai un messaggio come questo:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Se non lo facessi fetch
e lo facessi, il git checkout master
tuo git locale non saprebbe che sono stati aggiunti 2 commit. E direbbe solo:
Already on 'master'
Your branch is up to date with 'origin/master'.
Ma è obsoleto e errato. È perché Git ti darà feedback esclusivamente sulla base di ciò che sa. È ignaro dei nuovi impegni che non ha ancora abbattuto ...
Esiste un modo per vedere le nuove modifiche apportate in remoto mentre si lavora sul ramo in locale?
Alcuni IDE (ad esempio Xcode) sono super intelligenti e utilizzano il risultato di a git fetch
e possono annotare le righe di codice che sono state modificate nel ramo remoto del ramo di lavoro corrente. Se quella linea è stata cambiata sia dalle modifiche locali sia dal ramo remoto, allora quella linea viene annotata in rosso. Questo non è un conflitto di unione. È un potenziale conflitto di unione. È un headsup che puoi usare per risolvere il futuro conflitto di unione prima di farlo git pull
dal ramo remoto.
Consiglio divertente:
Se hai recuperato un ramo remoto, ad esempio:
git fetch origin feature/123
Quindi questo andrebbe nella directory dei telecomandi. Non è ancora disponibile per la tua directory locale. Tuttavia, semplifica il checkout a quel ramo remoto tramite DWIM (fai ciò che intendo):
git checkout feature/123
non devi più fare:
git checkout -b feature/123 origin/feature/123
Per saperne di più leggi qui