Modulo 12 — Fetch & Pull
Ripasso del clone: i remote tracking branches
Section titled “Ripasso del clone: i remote tracking branches”Dopo git clone, in locale convivono due riferimenti:
master— un branch normale, che muovi tu con i commit;origin/master— un remote tracking branch: un segnalibro che dice “alla tua ultima comunicazione con il remote, il branch master era qui”. Non lo muovi tu; Git lo aggiorna quando scarichi informazioni dal remote.
Github ──git clone──▶ Il tuo computer: master + origin/master
Al momento del clone, il branch locale e il suo remote tracking branch coincidono.
I remote tracking branch seguono il pattern <remote>/<branch>:
origin/master→ stato del branch master sul remoteorigin;upstream/logoRedesign→ stato del branch logoRedesign sul remoteupstream.
Comandi utili
Section titled “Comandi utili”git branch -r # elenca i branch remoti conosciutigit checkout origin/master # esplora lo stato noto del remote (→ detached HEAD, ok!)Dopo commit locali, il tuo master avanza mentre origin/master resta fermo; git status te lo dice:
On branch masterYour branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits)
I commit muovono solo il branch locale: il segnalibro del remoto non cambia da solo.
Branch remoti e workspace
Section titled “Branch remoti e workspace”Dopo il clone, hai tutti i dati del progetto al momento del clone, ma il workspace mostra solo il branch predefinito. Se il repo remoto ha un branch puppies, in locale git branch non lo mostra — ma git branch -r rivela origin/puppies.
Per lavorarci localmente con il tracking già configurato:
git switch puppiesCrea un branch locale puppies e lo collega al remote origin/puppies (come il tuo master traccia origin/master).
git fetch — scaricare SENZA applicare
Section titled “git fetch — scaricare SENZA applicare”Un collaboratore ha pushato su master, il tuo repo locale non lo sa. Come scoprirlo?
Il remote è avanzato: il tuo origin/master è un segnalibro ormai superato.
git fetch origin masterEffetti:
- aggiorna i remote tracking branch con le novità;
- non tocca il branch corrente né la working copy.
Il fetch aggiorna solo il segnalibro origin/master: il tuo master non si muove.
Per vedere le novità scaricate devi checkoutare origin/master (detached HEAD). Il tuo master è intatto — il fetch è sicuro in qualunque momento.
git pull — scaricare E applicare
Section titled “git pull — scaricare E applicare”git pull <remote> <branch>git pull origin masterA differenza del fetch, il pull aggiorna il branch corrente con le modifiche remote. In formula:
git pull = git fetch + git merge (aggiorna il remote (mergia le novità nel tracking branch) branch corrente)Dove lo esegui conta: le modifiche vengono mergiate nel branch corrente (come con git merge).
E sì: i pull possono generare merge conflicts, come ogni merge. Se in locale hai commit che non sono su GitHub, il pull li combina con i nuovi remoti.
La scorciatoia
Section titled “La scorciatoia”git pullSenza argomenti, Git assume:
- remote =
origin; - branch = quello tracciato dal branch corrente.
Così, sul branch master il pull pesca da origin/master; su puppies da origin/puppies. (Il comportamento si può configurare, ma quasi nessuno lo tocca.)
Fetch vs Pull a confronto
Section titled “Fetch vs Pull a confronto”| | git fetch | git pull |
| --- | --- |
| Scarica dal remote | ✅ | ✅ |
| Aggiorna i remote tracking branch | ✅ | ✅ |
| Mergia nel branch corrente | ❌ | ✅ |
| Conflitti | Mai | Possibili |
| Quando | Sempre sicuro | Sconsigliato con modifiche non committate |
Il quadro completo (ancora valido)
Section titled “Il quadro completo (ancora valido)”Workspace ──add──▶ Staging (index) ──commit──▶ Repository locale ──push──▶ Remote repository ◀────────────────────── pull / fetch ──────────────────────────Immagini: documentazione ufficiale di Git (git-scm.com, dal libro Pro Git di Scott Chacon), licenza CC BY-NC-SA 3.0.