Skip to content

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

Dopo il clone: master e origin/master allo stesso commit 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 remote origin;
  • upstream/logoRedesign → stato del branch logoRedesign sul remote upstream.
Terminal window
git branch -r # elenca i branch remoti conosciuti
git 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 master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)

Dopo commit locali: master avanza, origin/master resta indietro I commit muovono solo il branch locale: il segnalibro del remoto non cambia da solo.

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:

Terminal window
git switch puppies

Crea un branch locale puppies e lo collega al remote origin/puppies (come il tuo master traccia origin/master).

Un collaboratore ha pushato su master, il tuo repo locale non lo sa. Come scoprirlo?

Sul remote ci sono nuovi commit che tu non hai Il remote è avanzato: il tuo origin/master è un segnalibro ormai superato.

Terminal window
git fetch origin master

Effetti:

  • aggiorna i remote tracking branch con le novità;
  • non tocca il branch corrente né la working copy.

Dopo il fetch: origin/master aggiornato, master locale intatto 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.

Terminal window
git pull <remote> <branch>
git pull origin master

A 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.

Terminal window
git pull

Senza 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.)

| | 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 |

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.