Close

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.

Finestra della console
materiale correlato

Registro Git avanzato

Logo di Bitbucket
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.

Da git repository centrale a git repository locale

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.

git 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

Letture consigliate

Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.

Le persone collaborano utilizzando una parete piena di strumenti

Blog di Bitbucket

Illustrazione su Devops

Percorso di apprendimento DevOps

Funzione Demo Den per demo con esperti Atlassian

Come Bitbucket Cloud funziona con Atlassian Open DevOps

Iscriviti alla nostra newsletter DevOps

Thank you for signing up