git branch
Informazioni utili sul comando git branch: come creare, elencare, rinominare ed eliminare branch, con esempi pratici.
Cosa fa git branch
Il comando git branch crea, elenca, rinomina ed elimina branch. È tutto ciò che fa — non sposta l'albero di lavoro su un branch e non unisce il lavoro. Questi compiti spettano a git checkout / git switch e a git merge. Pensa a git branch come allo strumento che gestisce le etichette, mentre gli altri comandi ti spostano tra di esse e le riportano insieme.
Questa pagina spiega cos'è un branch, come crearlo ed elencarlo, come rinominarlo ed eliminarlo (localmente e su un repository remoto), e i problemi comuni in cui si incorre.

Cos'è veramente un branch
Un branch in Git non è una copia dei tuoi file — è un puntatore leggero e mobile a un singolo commit. Ogni commit punta anche al suo genitore (o genitori), quindi seguire un puntatore di branch attraverso i suoi genitori ricostruisce l'intera cronologia di quella linea di lavoro.
Poiché un branch è solo un file di 41 byte contenente un hash di commit, crearne uno è istantaneo e non costa quasi nulla:
cat .git/refs/heads/main
# 9f1c2a7e8d... (the commit your branch currently points at)Un puntatore speciale chiamato HEAD traccia su quale branch ti trovi attualmente. Quando esegui un commit, il puntatore del branch corrente avanza al nuovo commit e HEAD lo segue. Ecco perché la creazione di branch è così economica in Git rispetto ai sistemi di controllo di versione più vecchi che duplicavano fisicamente i file.
Perché usare i branch
I branch ti offrono una linea di sviluppo isolata. Puoi sviluppare una funzionalità o correggere un bug nel suo branch senza toccare il branch stabile main, poi unirlo quando è pronto. Motivi comuni:
- Sviluppare due funzionalità in parallelo senza che le modifiche entrino in conflitto.
- Mantenere
mainsempre rilasciabile mentre il codice sperimentale vive altrove. - Pulire la cronologia prima di eseguire il merge, così il branch condiviso rimane ordinato.
- Aprire una pull request — la maggior parte delle piattaforme costruisce le PR attorno ai branch.

Opzioni comuni
| Comando | Cosa fa |
|---|---|
git branch | Elenca i branch locali (equivalente a git branch --list); il branch corrente è contrassegnato con *. |
git branch -v | Elenca i branch con l'hash e il messaggio dell'ultimo commit di ciascuno. |
git branch <branch> | Crea un nuovo branch chiamato <branch> ma non passa ad esso. |
git branch <branch> <start-point> | Crea <branch> che punta a un commit, tag o branch specifico. |
git branch -d <branch> | Elimina un branch solo se le sue modifiche sono già state unite. |
git branch -D <branch> | Elimina forzatamente un branch anche con modifiche non unite (-D = --delete --force). |
git branch -m <old> <new> | Rinomina un branch (usa -M per sovrascrivere un nome esistente). |
git branch -a | Elenca tutti i branch — locali e di tracciamento remoto. |
git branch -r | Elenca solo i branch di tracciamento remoto. |
git branch --merged | Elenca i branch già uniti nel branch corrente (sicuri da eliminare). |
git branch --no-merged | Elenca i branch non ancora uniti nel branch corrente. |
Creare branch
I branch sono semplicemente puntatori ai commit. Quando ne crei uno, Git aggiunge un nuovo puntatore al commit corrente — non modifica la cronologia.

Crea un branch al commit corrente:
git branch test_branchViene creato un nuovo puntatore al commit corrente; nient'altro si sposta:

Creare un branch non ti sposta su di esso — HEAD punta ancora al vecchio branch. Per iniziare a lavorare sul nuovo branch, passa ad esso e poi usa git add e git commit per registrare il lavoro:
git switch test_branch # modern; or: git checkout test_branchLa maggior parte delle volte vuoi creare e passare in un solo passaggio:
git switch -c test_branch # create + switch (modern)
git checkout -b test_branch # create + switch (older syntax, identical effect)Puoi anche creare un branch da un punto specifico invece di HEAD — un tag, un altro branch o un hash di commit:
git branch hotfix v1.0 # branch starting at the v1.0 tag
git branch experiment 9f1c2a7 # branch starting at an old commitElencare e ispezionare i branch
Eseguire git branch senza argomenti mostra i branch locali e contrassegna quello corrente:
git branch
# feature-login
# * main
# test_branchAggiungi -v per vedere a quale commit punta ogni branch:
git branch -v
# feature-login 1a2b3c4 Add login form
# * main 9f1c2a7 Update README
# test_branch 9f1c2a7 Update READMEPer trovare quali branch è sicuro pulire, elenca quelli già uniti nel branch corrente. Qualsiasi elemento qui può essere rimosso con -d:
git branch --merged
# feature-login
# * mainRinominare i branch
Usa -m (move) per rinominare. Per rinominare il branch su cui ti trovi, fornisci solo il nuovo nome:
git branch -m better-namePer rinominare un branch diverso, fornisci sia il vecchio che il nuovo nome:
git branch -m old-name new-nameSe esiste già un branch con il nome di destinazione, -m si rifiuta di sovrascriverlo; usa -M per forzare la rinomina. Tieni presente che rinominare un branch che esiste su un repository remoto non lo rinomina lì — devi fare il push del nuovo nome ed eliminare quello vecchio.
Eliminare i branch
Dopo che un branch è stato unito in main, elimina il puntatore locale per mantenere ordinato l'elenco dei branch:
git branch -d test_branch
# Deleted branch test_branch (was 9f1c2a7).Il flag -d è un controllo di sicurezza: si rifiuta di eliminare un branch i cui commit non sono ancora stati uniti nel branch corrente, per non perdere lavoro:
git branch -d test_branch
# error: The branch 'test_branch' is not fully merged.
# If you are sure you want to delete it, run 'git branch -D test_branch'.Se sei sicuro di voler eliminare il branch (e i suoi commit non uniti), usa -D maiuscolo per forzare l'eliminazione:
git branch -D test_branch-D scarta i commit che esistono solo su quel branch. Quei commit diventano irraggiungibili e vengono eventualmente eliminati dalla garbage collection. Se elimini per errore, di solito puoi recuperare l'hash da git reflog prima che ciò accada.
Eliminare un branch remoto
I comandi precedenti rimuovono solo la copia locale. Il branch può ancora esistere sul repository remoto (ad esempio su origin). Per eliminarlo lì:
git push origin --delete test_branchLa sintassi con i due punti fa la stessa cosa — fa il push di "niente" nel branch remoto, eliminandolo:
git push origin :test_branchPer creare un branch su un repository remoto, fai il push di un branch locale; il primo push lo stabilisce sul remoto e (con -u) imposta il tracciamento. Consulta git push e git remote per i dettagli:
git push -u origin test_branch
# pushes test_branch to origin and tracks itUn esempio completo
Ecco il ciclo tipico crea → lavora → unisci → pulisci dall'inizio alla fine:
git switch -c feature-x # create and switch to the branch
# ... edit files ...
git add .
git commit -m "Add feature X"
git switch main # back to main
git merge feature-x # bring the work in
git branch -d feature-x # delete the now-merged local branch
git push origin --delete feature-x # and remove it from the remote