Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

HEAD è il riferimento più importante in Git. Dice a Git da quale commit discenderà il tuo prossimo commit. La maggior parte del tempo HEAD punta a un branch, e quel branch punta a un commit; ma HEAD può anche puntare direttamente a un commit (detached HEAD).

Dove vive

HEAD è un singolo file in .git/HEAD. Ispezionalo:

cat .git/HEAD
# ref: refs/heads/main

Quella singola riga dice "HEAD attualmente punta al branch main". Quando fai commit, Git avanza main e HEAD segue.

Ispezionare HEAD

git rev-parse HEAD              # SHA del commit
git symbolic-ref HEAD           # nome del ref sottostante
git log -1 HEAD --oneline

Detached HEAD

Fare checkout di un commit, tag o branch di tracking remoto direttamente mette HEAD in stato detached:

git checkout v1.2.3
# You are in 'detached HEAD' state.

.git/HEAD ora contiene un SHA grezzo. I nuovi commit non vanno da nessuna parte tranne che nel reflog; torna a un branch reale (o creane uno) prima di perderli:

git switch -c experiment

Scorciatoie di HEAD

  • HEAD: il commit corrente.
  • HEAD^ o HEAD~1: parent.
  • HEAD~3: tre commit indietro tramite primo parent.
  • HEAD^2: secondo parent di un merge commit.
  • HEAD@{1}: posizione precedente dal reflog.
git log HEAD~5..HEAD --oneline
git diff HEAD^ HEAD

Altri HEAD speciali

  • ORIG_HEAD: HEAD precedente prima di un'operazione "pericolosa" (merge, reset).
  • MERGE_HEAD: punta del branch in fase di merge.
  • FETCH_HEAD: punta di qualsiasi cosa appena fetchata.
  • CHERRY_PICK_HEAD: commit in fase di cherry-pick.

HEAD negli script

Gli script spesso devono conoscere il nome del branch corrente. Usa plumbing piuttosto che parsare l'output porcelain:

branch=$(git symbolic-ref --short -q HEAD) || branch="(detached)"
sha=$(git rev-parse HEAD)
short=$(git rev-parse --short HEAD)

symbolic-ref --short -q HEAD esce con codice diverso da zero in stato detached, il che lo rende un perfetto detector. git branch --show-current (Git 2.22+) è un'alternativa più amichevole che stampa output vuoto quando detached. Entrambi sono stabili tra le versioni; l'output di git status non lo è.

HEAD e worktree

I worktree linkati hanno ognuno il proprio HEAD. Il .git/HEAD del repository principale è uno tra molti; ogni worktree ha il proprio sotto .git/worktrees/<name>/HEAD. Questo significa che due worktree dello stesso repository possono essere su branch diversi simultaneamente:

git worktree add ../wt-feature feature/login
git -C ../wt-feature rev-parse HEAD
git -C . rev-parse HEAD

I due HEAD sono indipendenti. Il checkout dei branch è esclusivo tra worktree: un branch può essere checkoutato solo in un worktree alla volta, prevenendo modifiche concorrenti accidentali allo stesso branch da due posizioni.

Errori comuni

Credere che HEAD sia un sinonimo di "branch corrente". Non lo è; è un puntatore che di solito punta a uno. Trattare HEAD~3 e HEAD^3 come equivalenti: differiscono sui merge commit. Modificare .git/HEAD a mano per cambiare branch; usa git switch o git checkout. E infine, ignorare gli avvisi di "detached HEAD" e committare nel vuoto; se ti ritrovi lì con nuovi commit, fai git switch -c <newbranch> immediatamente per ancorarli.