W3docs

git pull

Scopri il comando git pull, il suo utilizzo, le opzioni più comuni e consigli importanti per usarlo al meglio.

Cosa fa git pull

git pull scarica i nuovi commit da un repository remoto e li integra immediatamente nel branch locale corrente. È il comando da eseguire per aggiornare il proprio lavoro con ciò che i colleghi hanno inviato.

Internamente, git pull è una scorciatoia che racchiude due comandi eseguiti in sequenza:

git fetch <remote>          # download the new commits
git merge <remote>/<branch> # integrate them into the current branch

Quindi git pull equivale a git fetch seguito da git merge. Capire questa suddivisione è la chiave per comprendere l'intero comando: fetch aggiorna i branch di tracciamento remoto senza toccare il tuo lavoro, mentre merge (o rebase, vedi sotto) riapplica la nuova cronologia sul tuo branch.

gitpull

Quando usarlo

git pull fa parte del flusso di lavoro di sincronizzazione di Git, insieme a git push, git fetch e git remote. Usalo ogni volta che vuoi che il tuo branch locale rifletta lo stato remoto più recente, ad esempio:

  • Prima di iniziare un nuovo lavoro, così costruisci a partire dal codice più aggiornato.
  • Prima di eseguire git push, in modo che il push possa procedere con un fast-forward invece di essere rifiutato come "non-fast-forward".
  • Per acquisire i commit di un collega su un branch condiviso.

git fetch e git pull scaricano entrambi contenuto remoto, ma differiscono in un aspetto importante: git fetch aggiorna solo i branch di tracciamento remoto e lascia la copia di lavoro intatta, mentre git pull unisce anche le modifiche nel branch corrente. Se vuoi esaminare i commit in arrivo prima di integrarli, esegui prima fetch e poi merge manualmente.

Come funziona il merge durante un pull

Supponiamo che il tuo branch locale e quello remoto condividano la cronologia fino al commit E, poi divergano. Il remoto ha acquisito i commit A, B e C che non hai tu. Eseguendo git pull questi commit vengono scaricati.

gitpull1

Git crea quindi un nuovo commit di merge, H, che unisce il tuo lavoro locale con i commit scaricati A, B e C, combinando entrambe le linee di cronologia.

gitpull2

Se il tuo branch locale non ha divergito (non hai nuovi commit locali), Git sposta semplicemente il puntatore del branch in avanti verso i nuovi commit. Questa operazione si chiama fast-forward e non produce alcun commit di merge.

Con l'opzione --rebase, Git riapplica i tuoi commit locali sopra i commit scaricati invece di creare un commit di merge, mantenendo la cronologia lineare.

gitpull3

Opzioni comuni

ComandoDescrizione
git pull <remote>Scarica il contenuto remoto e lo unisce direttamente nella copia locale (equivalente a git fetch <remote> seguito da git merge <remote>/<current-branch>).
git pull --no-commit <remote>Scarica e unisce, ma si ferma prima di creare il commit di merge in modo da poter ispezionare il risultato.
git pull --rebase <remote>Riapplica i tuoi commit locali sopra i commit scaricati invece di unirli, mantenendo la cronologia lineare.
git pull --ff-onlyAggiorna solo se il merge può essere un fast-forward; altrimenti interrompe senza toccare il branch.
git pull --verboseFornisce output dettagliato, mostrando il contenuto scaricato e i dettagli del merge durante il pull.

Esempi

Pull dal branch upstream

Invocare git pull senza argomenti scarica e unisce le modifiche dal branch upstream configurato per il branch corrente:

git pull

Affinché funzioni, il branch corrente deve avere un upstream impostato (Git lo memorizza dopo il primo git push -u o git branch --set-upstream-to).

Pull da un remote e branch specifici

Puoi specificare esplicitamente il remote e il branch:

git pull <remote> <branch>

Questo scarica e unisce le modifiche dal branch specificato del remote indicato. Ad esempio, per fare pull del branch develop dal remote origin:

git pull origin develop

Pull con rebase

git pull --rebase

Invece di unire, questo riapplica i tuoi commit locali sopra i commit scaricati. Il risultato è una cronologia lineare senza commit di merge, che molti team preferiscono per i feature branch. Per impostarlo come comportamento predefinito per un branch, configura git config pull.rebase true. Consulta git rebase per i compromessi.

Pull senza committare il merge

git pull --no-commit

Questo scarica e unisce, ma si ferma appena prima di creare il commit di merge, lasciando il risultato in staging in modo da poterlo revisionare (e modificare) prima di committare con git commit.

Risolvere i conflitti dopo un pull

Se i commit remoti hanno modificato le stesse righe che hai modificato localmente, il merge non può completarsi automaticamente e Git segnala un conflitto:

Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.

Per risolverlo, apri ogni file in conflitto, modificalo per mantenere il contenuto corretto (rimuovendo i marcatori <<<<<<<, ======= e >>>>>>>), quindi metti in staging e committi:

git add app.js
git commit

Se preferisci non gestire il conflitto adesso, git merge --abort riporta il branch allo stato precedente al pull.

Nota

Fare pull su un branch con modifiche locali non committate può fallire perché Git si rifiuta di sovrascrivere il tuo lavoro. Committa o esegui git stash delle tue modifiche prima di fare pull, poi esegui l'unstash in seguito.

Esercitazione

Pratica
Quali delle seguenti affermazioni sul comando 'git pull' sono vere?
Quali delle seguenti affermazioni sul comando 'git pull' sono vere?
Was this page helpful?