git fetch
Il comando git fetch
scarica i commit, i file e i riferimenti da un repository remoto nel tuo repository locale. Il recupero è ciò che fai quando vuoi vedere a cosa stanno lavorando tutti gli altri. È simile a svn update
in quanto ti consente di vedere come è progredita la cronologia centrale, ma non ti obbliga a eseguire effettivamente il merge delle modifiche nel tuo repository. Git isola i contenuti recuperati dai contenuti locali esistenti; non ha assolutamente alcun effetto sul tuo lavoro di sviluppo locale. Il contenuto recuperato deve essere verificato in modo esplicito utilizzando il comando git checkout. Questo rende il recupero un modo sicuro per rivedere i commit prima di integrarli con il tuo repository locale.
Quando si scaricano contenuti da un repository remoto, i comandi git pull
e git fetch
sono disponibili per eseguire il task. Puoi considerare git fetch
la versione «sicura» dei due comandi. Scaricherà il contenuto remoto ma non aggiornerà lo stato di funzionamento del repository locale, lasciando intatte le tue opere attuali. git pull
è l'alternativa più aggressiva; scaricherà il contenuto remoto per il branch locale attivo ed eseguirà immediatamente git merge
per creare un commit di unione per il nuovo contenuto remoto. Se hai modifiche in sospeso, ciò causerà conflitti e darà il via al flusso di unione per la risoluzione dei conflitti.
Funzionamento di git fetch con i branch remoti
Per capire meglio come funziona git fetch
, parliamo di come Git organizza e archivia i commit. Dietro le quinte, nella directory ./.git/objects
del repository, Git memorizza tutti i commit, locali e remoti. Git mantiene i commit dei branch remoti e locali distintamente separati attraverso l'uso dei riferimenti dei branch. I riferimenti per i branch locali sono archiviati nel file ./.git/refs/heads/
. L'esecuzione del comando git branch genererà un elenco dei riferimenti dei branch locali. Di seguito è riportato un esempio di output di git branch
con alcuni nomi di branch demo.
git branch
main
feature1
debug2
Se esaminiamo i contenuti della directory /.git/refs/heads
, ci renderemo conto che emergerà un output simile.
ls ./.git/refs/heads/
main
feature1
debug2
materiale correlato
Registro Git avanzato
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
I branch remoti sono proprio come i branch locali, se non che sono mappati ai commit dal repository di qualcun altro. I branch remoti hanno il prefisso del telecomando a cui appartengono in modo da non confonderli con i branch locali. Come i branch locali, Git ha riferimenti anche per i branch remoti. I riferimenti dei branch remoti si trovano nella directory ./.git/refs/remotes/
. Il prossimo frammento di codice di esempio mostra i branch che potresti vedere dopo aver recuperato un repository remoto chiamato convenientemente remote-repo:
git branch -r
# origin/main
# origin/feature1
# origin/debug2
# remote-repo/main
# remote-repo/other-feature
Questo output mostra i branch locali che avevamo esaminato in precedenza, ma ora li mostra con il prefisso origin/
. Inoltre, ora vediamo i branch remoti con il prefisso remote-repo
. Puoi dare un'occhiata a un branch remoto proprio come quelli locali, ma questo ti metterà in uno stato HEAD
distaccato (proprio come il check-out di un vecchio commit). Puoi considerarli come branch di sola lettura. Per visualizzare i tuoi branch remoti, basta passare il flag -r
al comando git branch
.
Puoi ispezionare i branch remoti con i soliti comandi git checkout
e git log
. Se approvi le modifiche contenute in un branch remoto, puoi unirlo in un branch locale con un normale git merge
. Quindi, a differenza di SVN, la sincronizzazione del tuo repository locale con un repository remoto è in realtà un processo in due fasi: recupero e unione. Il comando git pull
è una comoda scorciatoia per questo processo.
Opzioni e comandi git fetch
git fetch <remote>
Recupera tutti i branch del repository. Questo comando consente inoltre di scaricare tutti i commit e i file richiesti dall'altro repository.
git fetch <remote> <branch>
Come il comando descritto sopra, a eccezione del fatto che recupera solo il branch specificato.
git fetch --all
Una mossa avanzata che consente di recuperare tutti i repository remoti registrati e i relativi branch:
git fetch --dry-run
L'opzione --dry-run
eseguirà un'esecuzione demo del comando. Produrrà esempi di azioni che intraprenderà durante il recupero ma non li applicherà.
Esempi di git fetch
Comando git fetch su un branch remoto
Il seguente esempio dimostrerà come recuperare un branch remoto e aggiornare il tuo stato di lavoro locale ai contenuti remoti. In questo esempio, supponiamo che ci sia un'origine centrale del repository da cui il repository locale è stato clonato utilizzando il comando git clone
. Supponiamo anche che esista un repository remoto aggiuntivo chiamato coworkers_repo che contiene un feature_branch che configureremo e recupereremo. Con questi presupposti, continuiamo con l'esempio.
Innanzitutto, dobbiamo configurare il repository remoto utilizzando il comando git remote .
git remote add coworkers_repo git@bitbucket.org:coworker/coworkers_repo.git
Qui abbiamo creato un riferimento al repository del collega utilizzando l'URL del repository. Ora passeremo quel nome remoto a git fetch
per scaricare i contenuti.
git fetch coworkers_repo coworkers/feature_branch
fetching coworkers/feature_branch
Ora che disponiamo localmente del contenuto di coworkers/feature_branch, avremo bisogno di integrarlo nella nostra copia di lavoro locale. Iniziamo questo processo utilizzando il comando git checkout per estrarre il branch remoto appena scaricato.
git checkout coworkers/feature_branch
Note: checking out coworkers/feature_branch'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
L'output di questa operazione di checkout indica che siamo in uno stato HEAD
distaccato. Si tratta di un comportamento previsto e significa che il nostro riferimento HEAD
indica un ulteriore riferimento che non è in sequenza con la nostra cronologia locale. Poiché HEAD
è puntato sul riferimento coworkers/feature_branch, possiamo creare un nuovo branch locale da quel riferimento. L'output «HEAD
distaccato» ci mostra come farlo usando il comando git checkout
:
git checkout -b local_feature_branch
Qui abbiamo creato un nuovo branch locale denominato local_feature_branch. Questa operazione fa in modo che gli aggiornamenti HEAD
puntino ai contenuti remoti più recenti e possiamo continuare a svilupparli da questo punto.
Sincronizzazione dell'origine con git fetch
Nell'esempio seguente viene illustrato il flusso di lavoro tipico per la sincronizzazione del repository locale con il branch master del repository centrale.
git fetch origin
Consente di visualizzare i branch scaricati:
a1e8fb5..45e66a4 main -> origin/main
a1e8fb5..9e8ab1c develop -> origin/develop
* [new branch] some-feature -> origin/some-feature
I commit di questi nuovi branch remoti sono mostrati come quadrati anziché cerchi nel diagramma seguente. Come puoi vedere, git fetch
ti dà accesso all'intera struttura dei branch di un altro repository.
Per vedere quali commit sono stati aggiunti al main upstream, puoi eseguire il comando git log
utilizzando l'origine/il master come filtro:
git log --oneline main..origin/main
Per approvare le modifiche e unirle nel branch main locale usa i comandi seguenti:
git checkout main
git log origin/main
Quindi, possiamo utilizzare git merge origin/main
:
git merge origin/main
L'origine/il main e i branch main adesso puntano allo stesso commit e hai effettuato la sincronizzazione con le attività di sviluppo upstream.
Riepilogo su git fetch
In fase di revisione, git fetch
è il comando principale utilizzato per scaricare contenuti da un repository remoto. git fetch
viene utilizzato insieme a git remote
, git branch
, git checkout
e git reset per aggiornare un repository locale allo stato di un remoto. Il comando git fetch
è un elemento fondamentale dei flussi di lavoro Git collaborativi. git fetch
ha un comportamento simile a git pull
, tuttavia, git fetch
può essere considerato una versione più sicura e non distruttiva.
Condividi l'articolo
Argomento successivo
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.