git branch
Lister, créer ou supprimer des branches
La commande 'git branch' permet de créer, lister, renommer et supprimer des branches. Elle ne permet pas de changer de branche - utilisez 'git switch' ou 'git checkout' pour cela. Dans Git, les branches sont des pointeurs légers vers des commits, ce qui rend la création et le changement de branche extrêmement rapides. Sans argument, git branch liste les branches existantes en mettant en avant la branche courante. Avec un nom de branche, elle crée une nouvelle branche qui pointe sur le HEAD actuel. Les branches sont essentielles au développement en parallèle : plusieurs fonctionnalités ou correctifs peuvent avancer en même temps sans se gêner.
Synopsis
git branch [--list] [-a | -r] [-v [--abbrev=<n> | --no-abbrev]] [--merged | --no-merged] [<pattern>...]
git branch <branch-name> [<start-point>]
git branch (-d | -D) [-r] <branch-name>...
git branch (-m | -M) [<old-branch>] <new-branch>
git branch (-c | -C) [<old-branch>] <new-branch>
git branch [--set-upstream-to=<upstream> | -u <upstream>] [<branch-name>]Options
Choisir la bonne option
Voir les branches
Différentes façons de lister et d’inspecter les branches
| Commande | Montre les locales | Montre les distantes | Infos en plus | Cas d’usage |
|---|---|---|---|---|
git branch | Oui | No | Branche courante marquée * | Coup d’œil rapide aux branches locales |
git branch -r | No | Oui | Références de suivi distantes | Voir ce qu’il y a sur le serveur |
git branch -a | Oui | Oui | Toutes les références | Vue complète de toutes les branches |
git branch -v | Oui | No | Dernier commit de chaque branche | Voir l’activité des branches d’un coup d’œil |
git branch -vv | Oui | No | Upstream + avance/retard | Vérifier la synchronisation avec le dépôt distant |
git branch --show-current | Courante seulement | No | Juste le nom | Scripts, invites du shell |
Supprimer des branches
Suppression sûre ou forcée - connaissez la différence
| Commande | Exige une fusion | Peut perdre du travail | Quand l’utiliser |
|---|---|---|---|
-d (--delete) | Oui | No | Après la fusion d’une PR, nettoyage de routine |
-D (--delete --force) | No | Oui | Abandonner un travail expérimental |
Renommer et copier des branches
Des options pour réorganiser les noms de vos branches
| Commande | Écrase l’existante | Garde l’originale | Usage typique |
|---|---|---|---|
-m (--move) | Non (échoue) | No | Renommer : feature → feature-v2 |
-M (--move --force) | Oui | No | Remplacer un nom de branche existant |
-c (--copy) | Non (échoue) | Oui | Dupliquer une branche pour expérimenter |
-C (--copy --force) | Oui | Oui | Copier, écraser si elle existe |
Filtrer les branches selon leur fusion
Trouver les branches prêtes à supprimer ou encore en cours
| Commande | Montre | But | Suite habituelle |
|---|---|---|---|
--merged | Branches fusionnées dans HEAD | Trouver les candidates au nettoyage | git branch -d <branch> |
--merged main | Branches fusionnées dans main | Trouver les branches qu’on peut supprimer sans risque | Supprimer en masse les branches fusionnées |
--no-merged | Branches NON fusionnées | Trouver le travail en cours | Relire avant une release |
--contains <commit> | Branches contenant un commit | Savoir où est parti un correctif | Vérifier le déploiement d’un hotfix |
Suivi de l’upstream
Configurer la relation entre branches locales et distantes
| Commande | Action | Effet | Quand l’utiliser |
|---|---|---|---|
-u origin/main | Définir l’upstream | git push/pull fonctionnent sans arguments | Après avoir créé une branche locale |
--track origin/feature | Créer + définir l’upstream | Nouvelle branche locale qui suit une distante | Commencer à travailler sur une branche distante |
--unset-upstream | Retirer l’upstream | Se déconnecter du dépôt distant | Arrêter de suivre une branche distante supprimée |
Exemples de workflows
git branch feature-loginCréer une nouvelle branche pour la fonctionnalité
git switch feature-loginPasser sur la nouvelle branche
(make changes and commits)Travailler sur la fonctionnalité en plusieurs commits
git switch main && git merge feature-loginFusionner la fonctionnalité terminée dans main
git branch -d feature-loginSupprimer la branche de fonctionnalité après la fusion
git branch --mergedLister les branches déjà fusionnées
git branch -d branch-nameSupprimer sans risque les branches fusionnées une par une
git fetch --pruneRetirer les références de suivi distantes périmées
git branch -rVérifier que les branches distantes sont propres
git fetch originRécupérer les dernières infos sur les branches distantes
git branch -rLister les branches distantes disponibles
git branch --track feature origin/featureCréer une branche locale qui suit la distante
git switch featurePasser sur la nouvelle branche de suivi
git branch -m old-name new-nameRenommer la branche locale
git push origin -u new-namePousser le nouveau nom de branche vers le dépôt distant
git push origin --delete old-nameSupprimer l’ancien nom de branche du dépôt distant
git log --oneline -1Récupérer le hash du commit recherché
git branch --contains <commit-hash>Trouver les branches locales qui contiennent ce commit
git branch -r --contains <commit-hash>Trouver les branches distantes qui contiennent ce commit
Dépannage
Impossible de supprimer la branche - pas entièrement fusionnée
Cause : La branche a des commits non fusionnés dans son upstream (ou dans HEAD si elle n’a pas d’upstream)
Fusionnez d’abord la branche, ou utilisez -D pour forcer la suppression si vous êtes sûr de vouloir jeter ce travail
git branch -D branch-nameImpossible de supprimer la branche courante
Cause : Vous essayez de supprimer la branche sur laquelle vous êtes
Passez d’abord sur une autre branche, puis supprimez la branche visée
git switch main && git branch -d old-branchCe nom de branche existe déjà
Cause : Vous essayez de créer une branche avec un nom qui existe déjà
Choisissez un autre nom, supprimez d’abord la branche existante, ou utilisez -f pour la replacer sur un nouveau point de départ
git branch -f existing-name <start-point>Aucun upstream configuré pour le push
Cause : La branche locale n’a pas de relation de suivi avec une branche distante
Configurer la relation de suivi avec l’upstream
git push -u origin branch-nameLa branche distante n’apparaît pas dans git branch -r
Cause : Le dépôt local n’a pas les dernières infos sur les branches distantes
Faites un fetch depuis le dépôt distant pour mettre à jour vos branches de suivi distantes
git fetch originHEAD détaché après un checkout
Cause : Vous avez extrait un commit directement au lieu d’une branche
Créez une nouvelle branche sur le commit courant, ou revenez sur une branche existante
git switch -c new-branch-nameLa branche suit le mauvais dépôt distant
Cause : L’upstream est configuré pour suivre une mauvaise branche distante
Redéfinissez le suivi de l’upstream vers la bonne branche distante
git branch -u origin/correct-branchImpossible de voir toutes les branches
Cause : Seules les branches locales sont affichées par défaut
Utilisez l’option -a pour afficher à la fois les branches locales et de suivi distantes
git branch -aAstuces et pièges
Bonnes pratiques
- ✓Utilisez des noms de branche descriptifs qui indiquent leur but : feature/user-auth, bugfix/login-error, hotfix/security-patch
- ✓Supprimez les branches après la fusion pour garder le dépôt propre - utilisez 'git branch --merged' pour trouver celles qu’on peut supprimer sans risque
- ✓Créez toujours les branches de fonctionnalité depuis une branche main à jour pour limiter les conflits de fusion
- ✓Utilisez 'git branch -vv' pour voir les relations de suivi et l’avance/le retard
- ✓Configurez le suivi en créant les branches avec 'git push -u origin branch-name' pour simplifier push et pull
- ✓Évitez de travailler directement sur main/master - créez toujours une branche pour vos modifications
- ✓Utilisez 'git branch --no-merged' pour trouver les branches dont le travail est encore en cours
- ✓Synchronisez régulièrement les branches distantes avec 'git fetch --prune' pour retirer les références périmées
- ✓Pensez à utiliser 'git switch' plutôt que 'git checkout' pour une intention plus claire quand vous changez de branche
- ✓Utilisez '--sort=-committerdate' pour voir d’abord les branches les plus récemment actives
- ✓Avant de supprimer une branche avec -D, vérifiez que vous n’en avez plus besoin avec 'git log branch-name'
- ✓Écrivez les noms de branche en minuscules avec des tirets, pour la cohérence et la compatibilité
Erreurs fréquentes
- ✗S’attendre à ce que 'git branch <name>' bascule sur la nouvelle branche. Elle ne fait que la créer - utilisez 'git switch <name>' ou 'git checkout -b <name>' pour la créer et y basculer.
- ✗Essayer de supprimer la branche courante. Il faut d’abord passer sur une autre branche avant de supprimer celle où vous êtes.
- ✗Utiliser -d sur des branches non fusionnées et perdre du travail. L’option -d vous protège - si vous voulez vraiment supprimer du travail non fusionné, utilisez -D.
- ✗Oublier de pousser les nouvelles branches vers le dépôt distant. Les branches locales ne sont pas partagées tant que vous n’avez pas fait 'git push -u origin <branch>'.
- ✗Ne pas faire le ménage dans les anciennes branches. Utilisez régulièrement 'git branch --merged' pour trouver et supprimer les branches déjà fusionnées.
FAQ
'git branch <name>' crée seulement une nouvelle branche sans y basculer. 'git checkout -b <name>' crée une nouvelle branche ET y bascule en une seule commande. L’équivalent moderne est 'git switch -c <name>'.
Utilisez 'git branch -m old-name new-name' pour renommer une branche. Si vous êtes sur la branche à renommer, 'git branch -m new-name' suffit. Pour les branches distantes, il faut pousser le nouveau nom et supprimer l’ancien.
-d est une suppression sûre qui ne fonctionne que si la branche est entièrement fusionnée dans son upstream (ou dans HEAD si aucun upstream n’est défini). -D est une suppression forcée qui retire la branche quel que soit son état de fusion. N’utilisez -D que si vous êtes sûr de vouloir jeter des commits non fusionnés.
Utilisez 'git push origin --delete branch-name' ou la syntaxe plus courte 'git push origin :branch-name'. Cela retire la branche du dépôt distant.
Les branches de suivi distantes (comme origin/main) sont des références locales qui suivent l’état des branches des dépôts distants. Elles sont mises à jour lors d’un fetch ou d’un pull et montrent où pointent les branches distantes.
Utilisez 'git branch --show-current' pour avoir juste le nom, ou 'git branch' pour voir toutes les branches avec la courante marquée d’un *. 'git status' affiche aussi la branche courante.
Git ne permet pas de supprimer la branche sur laquelle vous êtes. Passez d’abord sur une autre branche avec 'git switch other-branch', puis supprimez la branche visée.
Utilisez 'git branch branch-name commit-hash' pour créer une branche à partir de n’importe quel commit. Le point de départ peut être un hash de commit, un tag ou un autre nom de branche.
La branche upstream (ou de suivi) est la branche distante vers laquelle votre branche locale pousse et depuis laquelle elle tire par défaut. Définissez-la avec 'git branch -u origin/branch-name' ou 'git push -u origin branch-name'.
Utilisez 'git branch --sort=-committerdate' pour lister d’abord les branches qui ont reçu les commits les plus récents. Ajoutez -v pour voir aussi le hash et le message du commit.