git pull
Il comando git pull
viene utilizzato per recuperare e scaricare contenuti da un repository remoto e per aggiornare immediatamente il repository locale in modo che corrisponda a quel contenuto. Il merge delle modifiche upstream remote nel repository locale è un task comune dei flussi di lavoro di collaborazione basati su Git. Il comando git pull
è in realtà una combinazione di altri due comandi, git fetch seguito da git merge. Nella prima fase dell'operazione, git pull
eseguirà un git fetch
con ambito sul branch locale a cui punta HEAD
. Una volta scaricato il contenuto, git pull
attiverà un flusso di lavoro di merge. Verrà creato un nuovo commit di merge e HEAD
sarà aggiornato in modo da puntare al nuovo commit.
Uso di git pull
Come funziona
Il comando git pull
esegue prima git fetch
per scaricare il contenuto dal repository remoto specificato. Quindi viene eseguito il comando git merge
per eseguire il merge di refs e heads dei contenuti remoti in un nuovo commit di merge locale. Per dimostrare meglio il processo di pull e merge, analizziamo il seguente esempio. Supponiamo di avere un repository con un branch principale e un'origine remota.
In questo scenario, git pull
scaricherà tutte le modifiche dal punto in cui il branch locale e quello principale si sono discostati. In questo esempio, questo è il punto E. git pull
recupererà i commit remoti divergenti (A-B-C). Il processo di pull creerà quindi un nuovo commit di merge locale con il contenuto dei nuovi commit remoti divergenti.
materiale correlato
Registro Git avanzato
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
Nel diagramma riportato sopra, possiamo vedere il nuovo commit H. Questo commit è un nuovo commit di merge che comprende il contenuto dei commit A-B-C remoti e un messaggio di log combinato. Questo esempio illustra una delle poche strategie di merge di git pull
. Un'opzione --rebase
può essere inviata a git pull
per applicare una strategia di merge di riassegnazione al posto di un commit di merge. Il prossimo esempio mostra il funzionamento di un pull di riassegnazione. Supponiamo di essere al punto di partenza del primo diagramma e di aver eseguito git pull --rebase
.
In questo diagramma, possiamo ora vedere che un pull di riassegnazione non crea il nuovo commit H. Invece, la riassegnazione ha copiato i commit remoti A--B--C e ha riscritto i commit locali E--F--G in modo che compaiano dopo di essi nella cronologia del commit del branch di origine/principale locale.
Opzioni comuni
git pull <remote>
Recupera la copia remota specificata del branch corrente e ne esegue immediatamente il merge nella copia locale. È lo stesso procedimento di git fetch
git merge origin/
git pull --no-commit <remote>
Analogamente alla chiamata predefinita, recupera il contenuto remoto, ma non crea un nuovo commit di merge.
git pull --rebase <remote>
Uguale alla procedura di pull precedente. Invece di usare git merge
per integrare il branch remoto con quello locale, usa git rebase
.
git pull --verbose
Fornisce un output dettagliato durante un pull in cui viene visualizzato il contenuto scaricato e i dettagli del merge.
Approfondimento su git pull
Puoi pensare a git pull
come alla versione Git di svn update
. È un modo semplice per sincronizzare il repository locale con le modifiche upstream. Il seguente diagramma illustra ciascuna fase del processo di pull.
Inizialmente puoi pensare che il repository sia sincronizzato, ma poi git fetch
rivela che la versione di origine del branch principale è progredita dall'ultima volta che l'hai controllata. Quindi, git merge
integra immediatamente il branch principale remoto in quello locale.
Git pull e sincronizzazione
git pull
è uno dei tanti comandi che rivendicano la responsabilità di "sincronizzare" i contenuti remoti. Il comando git remote
viene utilizzato per specificare su quali endpoint remoti opereranno i comandi di sincronizzazione. Il comando git push
viene utilizzato per caricare i contenuti in un repository remoto.
Il comando git fetch
può essere confuso con git pull
. Entrambi sono utilizzati per scaricare i contenuti remoti. È possibile fare un'importante distinzione di sicurezza tra git pull
e git fetch
. git fetch
può essere considerata l'opzione "sicura", mentre git pull
quella pericolosa. git fetch
scarica i contenuti remoti senza alterare lo stato del repository locale. Invece, git pull
scarica i contenuti remoti e tenta immediatamente di modificare lo stato del repository locale per adeguarlo a tali contenuti. Ciò potrebbe causare un involontario stato di conflitto nel repository locale.
Esecuzione del pull tramite l'opzione di riassegnazione
L'opzione --rebase
può essere utilizzata per garantire una cronologia lineare evitando commit di merge non necessari. Molti sviluppatori preferiscono la riassegnazione al merge, dal momento che è come affermare di voler dare la priorità alle proprie modifiche rispetto a quelle di tutti gli altri. In questo senso, l'uso di git pull
con il flag --rebase
è ancora più simile a svn update
che al semplice comando git pull
.
Tra l'altro, l'esecuzione di un pull con l'opzione --rebase
è un flusso di lavoro così comune che esiste un'opzione di configurazione dedicata:
git config --global branch.autosetuprebase always
Dopo aver eseguito tale comando, tutti i comandi git pull
si integreranno tramite git rebase
invece che tramite git merge
.
Esempi di git pull
I seguenti esempi dimostrano come utilizzare git pull
negli scenari comuni:
Comportamento predefinito
git pull
L'esecuzione della chiamata predefinita di git pull
equivale a git fetch origin HEAD
e a git merge HEAD
, dove HEAD
è un riferimento che punta al branch corrente.
Git pull sui repository remoti
git checkout new_feature
git pull <remote repo>
In questo esempio viene prima eseguita un'estrazione e quindi si passa al branch git pull
inviato a git merge
.
Git pull rebase al posto del merge
L'esempio seguente mostra come effettuare la sincronizzazione con il branch principale del repository centrale tramite la riassegnazione:
git checkout main
git pull --rebase origin
Questa operazione sposta semplicemente le modifiche locali al di sopra di quelle degli altri membri del team.
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.