Introduzione
I branch sono come Git supporta linee di lavoro parallele. Creare un branch è essenzialmente gratuito: è solo un file di 41 byte contenente un hash di commit. Usali generosamente per feature, esperimenti e bug fix.
Comandi moderni
Da Git 2.23 ci sono due comandi appositi: git switch per i branch e git restore per i file. Usali; sono più chiari del comportamento sovraccarico di git checkout.
git switch main # passa a un branch esistente
git switch -c feature/login # crea e passa
git switch -c hotfix v1.2.3 # crea da un tag
git switch - # branch precedente (come cd -)
Elencare i branch
git branch # locali
git branch -r # tracking remoto
git branch -a # tutti
git branch -vv # con upstream e ahead/behind
git branch --merged # mergiati nel corrente
git branch --no-merged # non ancora mergiati
Rinominare e cancellare
git branch -m old new # rinomina
git branch -m new # rinomina il branch corrente
git branch -d feature/login # cancella un branch mergiato
git branch -D feature/abandoned # forza cancellazione di non mergiati
-d rifiuta se il branch ha commit non mergiati, proteggendo il lavoro.
Tracciare branch remoti
git switch feature/login # crea automaticamente il locale da origin/feature/login
git switch -c mine origin/feature/login # esplicito
git branch -u origin/main # imposta l'upstream del branch corrente
La sintassi classica
I tutorial più vecchi usano git checkout. Funziona ancora:
git checkout main
git checkout -b feature/login
git checkout v1.2.3
Lo svantaggio è che lo stesso comando ripristina anche i file, il che causa confusione. Preferisci switch e restore nei nuovi script.
Convenzioni di naming dei branch
Nomi coerenti rendono il tooling più facile. Pattern comuni:
feature/<ticket>-short-descbugfix/<ticket>-short-deschotfix/<version>release/<version>
git switch -c feature/PROJ-123-add-search
git config --global branch.autoSetupMerge always
git config --global branch.autoSetupRebase always
Le opzioni autoSetup assicurano che i nuovi branch traccino automaticamente il loro punto di partenza, il che rende la riga ahead/behind di git status significativa dal primo giorno.
Rinominare sul remote
Rinominare un branch remoto sono due operazioni: rinomina localmente e crea il nuovo ref sul server, poi cancella il vecchio:
git branch -m old new
git push -u origin new
git push origin --delete old
Errori comuni
Cambiare branch con modifiche non committate che entrano in conflitto con il target; Git rifiuta, e la soluzione è committare, fare stash o usare git switch --discard-changes se davvero non le vuoi. Creare dozzine di branch di lunga vita e non cancellare mai quelli mergiati; git branch --merged | xargs git branch -d mette in ordine. Nominare i branch con caratteri che confondono le shell (spazi, caratteri glob); attieniti a lettere, cifre, slash e trattino. Infine, cancellare un branch con -D e farsi prendere dal panico quando ti rendi conto che aveva lavoro non mergiato; il reflog ce l'ha ancora per 90 giorni: git reflog, trova lo SHA, git switch -c rescued <sha>.