Introduction
Les branches sont la façon dont Git supporte des lignes de travail parallèles. Créer une branche est essentiellement gratuit : c'est juste un fichier de 41 octets contenant un hachage de commit. Utilisez-les généreusement pour les fonctionnalités, les expériences et les corrections de bugs.
Commandes modernes
Depuis Git 2.23, il y a deux commandes dédiées : git switch pour les branches et git restore pour les fichiers. Utilisez-les ; elles sont plus claires que le comportement surchargé de git checkout.
git switch main # passer à une branche existante
git switch -c feature/login # créer et passer
git switch -c hotfix v1.2.3 # créer depuis un tag
git switch - # branche précédente (comme cd -)
Lister les branches
git branch # locales
git branch -r # tracking distant
git branch -a # toutes
git branch -vv # avec upstream et avance/retard
git branch --merged # mergées dans la courante
git branch --no-merged # pas encore mergées
Renommer et supprimer
git branch -m old new # renommer
git branch -m new # renommer la branche courante
git branch -d feature/login # supprimer une branche mergée
git branch -D feature/abandoned # forcer la suppression d'une non mergée
-d refuse si la branche a des commits non mergés, protégeant le travail.
Suivre des branches distantes
git switch feature/login # crée auto une locale depuis origin/feature/login
git switch -c mine origin/feature/login # explicite
git branch -u origin/main # définit l'upstream de la branche courante
La syntaxe classique
Les anciens tutoriels utilisent git checkout. Cela fonctionne toujours :
git checkout main
git checkout -b feature/login
git checkout v1.2.3
L'inconvénient est que la même commande restaure aussi des fichiers, ce qui crée de la confusion. Préférez switch et restore dans les nouveaux scripts.
Conventions de nommage des branches
Des noms cohérents facilitent l'outillage. Motifs courants :
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
Les options autoSetup garantissent que les nouvelles branches suivent automatiquement leur point de départ, ce qui rend la ligne avance/retard de git status significative dès le premier jour.
Renommer sur le remote
Renommer une branche distante est deux opérations : renommer localement et créer la nouvelle ref sur le serveur, puis supprimer l'ancienne :
git branch -m old new
git push -u origin new
git push origin --delete old
Erreurs fréquentes
Changer de branche avec des changements non commités qui entrent en conflit avec la cible ; Git refuse, et la solution est de commiter, stasher, ou utiliser git switch --discard-changes si vous ne les voulez vraiment pas. Créer des dizaines de branches de longue durée et ne jamais supprimer les mergées ; git branch --merged | xargs git branch -d nettoie. Nommer des branches avec des caractères qui troublent les shells (espaces, caractères glob) ; tenez-vous-en aux lettres, chiffres, slashes et tirets. Enfin, supprimer une branche avec -D et paniquer en réalisant qu'elle avait du travail non mergé ; le reflog l'a encore pendant 90 jours : git reflog, trouvez le SHA, git switch -c rescued <sha>.