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 seguito da 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 . Successivamente, viene eseguito il comando git pull inviato a . Questo comando esegue implicitamente un pull del branch della nuova funzione da . Una volta completato il download, verrà avviato un 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
Come effettuare una pull request
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.
Blog di Bitbucket
Scopri di più
Percorso di apprendimento DevOps
Scopri di più
Come Bitbucket Cloud funziona con Atlassian Open DevOps
Guarda ora
Iscriviti alla nostra newsletter DevOps
Indirizzo e-mail
Thank you for signing up