Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

git fetch scarica nuovi oggetti e aggiorna i ref di tracking remoto senza cambiare la tua working tree. git pull fa un fetch e poi integra il risultato nel tuo branch corrente. Conoscere la differenza è uno dei più grandi passi dal novizio all'utente Git sicuro di sé.

Fetching

git fetch                  # remote predefinito (di solito origin)
git fetch origin
git fetch --all
git fetch --prune          # cancella i ref per branch cancellati sul server
git fetch origin main      # solo un branch

Dopo un fetch, ispeziona cosa è cambiato:

git log HEAD..origin/main --oneline
git diff HEAD origin/main

Pulling

git pull è una scorciatoia per fetch seguito da merge o rebase. Scegli la strategia:

git pull                          # usa la config pull.rebase
git pull --rebase
git pull --ff-only                # rifiuta se non è fast-forward
git pull origin main

Configurare il comportamento predefinito

git config --global pull.rebase false   # merge (default classico)
git config --global pull.rebase true    # rebase
git config --global pull.ff only        # solo fast-forward
git config --global fetch.prune true

Da Git 2.27 un git pull nudo avvisa se nessuna strategia è configurata.

Fetch vs pull, quando usare quale

  • Usa fetch quando vuoi guardare prima di integrare.
  • Usa pull --ff-only quando vuoi semplicemente aggiornarti su un branch condiviso.
  • Usa pull --rebase quando lavori su un branch tematico che non hai ancora pushato.
  • Evita il pull nudo su branch condivisi di lunga vita; i merge commit si moltiplicano.

Ispezionare l'upstream

git status
# On branch main
# Your branch is behind 'origin/main' by 3 commits, and can be fast-forwarded.

Questo messaggio viene dal confronto di HEAD con il origin/main in cache; esegui prima git fetch per renderlo accurato.

Scaricare pull request

La maggior parte degli host Git espone i branch di pull o merge request come ref speciali che puoi scaricare nel tuo clone per revisione. Per GitHub, aggiungi un refspec:

git config --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*'
git fetch
git switch -c review/123 origin/pr/123

Per GitLab il path equivalente è refs/merge-requests/*/head. Con questo configurato, ogni git fetch scarica tutte le PR aperte localmente, pronte per l'ispezione senza lasciare il terminale.

Errori comuni

Eseguire git pull con modifiche non committate e ottenere un merge commit inaspettato sopra del lavoro sporco. Fai prima stash o commit. Dimenticare che il conteggio "behind" di git status è fresco solo quanto l'ultimo fetch; se nessuno ha fatto fetch da una settimana, quel conteggio mente. Usare git pull --rebase su un branch su cui altre persone hanno basato lavoro riscrive la loro base; rebase solo su branch privati. E infine, non usare mai git fetch <refspec> con un refspec personalizzato a meno che tu non lo capisca; un colon accidentale (main:main) sovrascrive il tuo main locale.