W3docs

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.

git branch

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 main sempre 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.

git branch1

Opzioni comuni

ComandoCosa fa
git branchElenca i branch locali (equivalente a git branch --list); il branch corrente è contrassegnato con *.
git branch -vElenca 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 -aElenca tutti i branch — locali e di tracciamento remoto.
git branch -rElenca solo i branch di tracciamento remoto.
git branch --mergedElenca i branch già uniti nel branch corrente (sicuri da eliminare).
git branch --no-mergedElenca 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.

git branch2

Crea un branch al commit corrente:

git branch test_branch

Viene creato un nuovo puntatore al commit corrente; nient'altro si sposta:

git branch3

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_branch

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

Elencare e ispezionare i branch

Eseguire git branch senza argomenti mostra i branch locali e contrassegna quello corrente:

git branch
#   feature-login
# * main
#   test_branch

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

Per 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
# * main

Rinominare i branch

Usa -m (move) per rinominare. Per rinominare il branch su cui ti trovi, fornisci solo il nuovo nome:

git branch -m better-name

Per rinominare un branch diverso, fornisci sia il vecchio che il nuovo nome:

git branch -m old-name new-name

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

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

La sintassi con i due punti fa la stessa cosa — fa il push di "niente" nel branch remoto, eliminandolo:

git push origin :test_branch

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

Un 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

Esercitazione

Pratica
Quali sono le funzionalità e le caratteristiche del comando 'git branch'?
Quali sono le funzionalità e le caratteristiche del comando 'git branch'?
Was this page helpful?