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
fetchquando vuoi guardare prima di integrare. - Usa
pull --ff-onlyquando vuoi semplicemente aggiornarti su un branch condiviso. - Usa
pull --rebasequando lavori su un branch tematico che non hai ancora pushato. - Evita il
pullnudo 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.