Aller au contenu
Aback Tools Logo

Erreur Git 'is not a valid branch name' : Règles, Corrections et Conventions

L'erreur Git "is not a valid branch name" expliquée : la liste complète des règles de refname, causes courantes avec corrections en une ligne, renommer une branche invalide en toute sécurité, règles spécifiques GitHub/GitLab/Windows et conventions de nommage d'équipe.

DH
Tutorials & How-Tos11 min de lecture2,600 mots

L'erreur Git "is not a valid branch name" est précise : le nom que vous avez fourni viole une ou plusieurs règles de refname de Git. La correction est presque toujours un changement d'une ligne une fois que vous savez quel caractère ou motif l'a déclenché. Ce guide couvre l'ensemble des restrictions de nommage de Git, les causes les plus courantes avec corrections exactes, comment renommer une branche existante et comment imposer un nommage valide dans toute votre équipe avant même que quelqu'un ne rencontre l'erreur.

14+Motifs interditsselon la spécification refname de Git
1 cmdPour renommer une branchegit branch -m old new
0Limite stricte de longueurmais 50-72 caractères recommandés

Ce que signifie l'erreur

Quand Git signale `fatal: 'some-name' is not a valid branch name`, cela signifie que la chaîne passée comme nom de branche viole la spécification refname de Git : l'ensemble des règles régissant ce qui constitue un nom de référence valide dans un dépôt Git. Git applique les mêmes règles aux noms de branches, de tags et de noms de suivi distant, car tous sont stockés comme références dans le répertoire `.git/refs/`.

La validation a lieu avant toute écriture d'objet. Git passe votre nom proposé par `check_refname_format()` en interne et abandonne avec l'erreur si le nom échoue. Cela signifie que vous voyez l'erreur immédiatement lors de l'exécution de `git checkout -b`, `git branch` ou `git switch -c` - il n'y a aucun état partiel à nettoyer.

Où l'apparition de l'erreur

  • `git checkout -b branch-name` - créer une nouvelle branche et basculer dessus
  • `git branch branch-name` - créer une nouvelle branche sans basculer
  • `git switch -c branch-name` - l'équivalent moderne de checkout -b
  • `git push origin branch-name` - pousser vers un dépôt distant avec un nom local invalide
  • Scripts CI/CD - lorsqu'un nom de branche est construit programmatiquement à partir d'un ID de ticket ou d'un message de commit

Note

Le message d'erreur complet de Git cite le nom exact qui a échoué : `fatal: 'my feature branch' is not a valid branch name`. La valeur entre guillemets est la chaîne littérale reçue par Git - y compris les espaces, caractères spéciaux ou valeurs développées par le shell. Cela facilite l'identification exacte du caractère qui a posé problème.

Règles de nommage des branches Git

La spécification refname de Git (définie dans la page man de `git-check-ref-format`) décrit un ensemble précis de caractères et de motifs interdits. Apprendre les règles une fois prévient toutes les erreurs de nommage futures - il n'y a aucun cas ambigu une fois la liste complète connue.

Caractères et séquences explicitement interdits

  • Espace (ASCII 0x20) - l'erreur la plus courante ; utilisez `-` ou `_` à la place.
  • Tilde `~` - utilisée dans la notation du reflog (`branch~2` signifie deux commits avant la pointe).
  • Circonflexe `^` - utilisé dans la notation de révision (`branch^` désigne le commit parent).
  • Deux-points `:` - utilisés dans la notation refspec de fetch (`refs/heads/main:refs/heads/main`).
  • Point d'interrogation `?` - caractère joker glob dans les motifs de refs.
  • Astérisque `*` - caractère joker glob dans les motifs de refs.
  • Crochet ouvrant `[` - ouverture d'ensemble de caractères glob.
  • Antislash `\\` - séparateur de chemin sous Windows ; interdit pour éviter les problèmes multiplateformes.
  • Double point `..` - utilisé dans la notation de plage (`main..feature`).
  • Séquence @{ - notation abrégée du reflog (`branch@{1}` est une entrée de reflog).

Règles positionnelles et structurelles

  • Ne peut pas commencer par un point (`.`) - convention des fichiers cachés ; `.hidden` n'est pas un début valide.
  • Ne peut pas se terminer par un point (`.`) - ambigu avec l'extension `.lock` et la notation d'extension de fichier.
  • Ne peut pas se terminer par `.lock` - Git utilise le suffixe `.lock` pour les fichiers de verrouillage ; tout composant de chemin se terminant par `.lock` est interdit.
  • Ne peut pas commencer par un tiret (`-`) - entre en conflit avec l'analyse des options de ligne de commande.
  • Ne peut pas contenir de points consécutifs (`..`) - conflit avec la notation de plage (voir ci-dessus).
  • Ne peut pas être le seul caractère `@` - abréviation de `HEAD`.
  • Ne peut pas contenir de caractères de contrôle - les caractères ASCII inférieurs à 0x20 et DEL (0x7F) sont interdits.
  • Ne peut pas être vide - une chaîne vide n'est pas un nom valide.
valid and invalid examples
bash
# ✓ Valid branch names
git checkout -b feature/add-login
git checkout -b fix/null-pointer-123
git checkout -b release/v2.1.0
git checkout -b chore_update-deps
git checkout -b users/alice/experiment

# ✗ Invalid - contains a space
git checkout -b "my feature"
# fatal: 'my feature' is not a valid branch name

# ✗ Invalid - double dot
git checkout -b feature..login
# fatal: 'feature..login' is not a valid branch name

# ✗ Invalid - ends with .lock
git checkout -b release.lock
# fatal: 'release.lock' is not a valid branch name

# ✗ Invalid - starts with hyphen
git checkout -b -hotfix
# fatal: '-hotfix' is not a valid branch name

Tip

Exécutez `git check-ref-format --branch votre-nom-proposé` pour tester un nom avant de créer la branche. Il se termine par le code 0 si le nom est valide et par 1 sinon - utile dans les scripts et les hooks de pre-commit. Pour une vérification dans le navigateur avec prise en charge des conventions d'équipe, utilisez le [Validateur de Convention de Noms de Branche](/tools/data/validators/branch-name-convention-validator).

Causes courantes et corrections

La plupart des occurrences de cette erreur proviennent d'un petit nombre de motifs répétitifs. Chacun a une cause spécifique et une correction spécifique en une ligne.

Espaces issus de titres de tickets copiés-collés

Le déclencheur le plus courant est de copier un titre de ticket ou de story directement dans le nom de branche. « Add user login form » devient `git checkout -b Add user login form`, que Git interprète comme trois arguments séparés et rejette le nom de branche `Add`. Correction : remplacez chaque espace par un tiret. Beaucoup d'équipes automatisent cela avec un alias ou un script `branch-from-ticket` qui transforme le titre avant de le passer à Git. Le Générateur de Slugs convertit n'importe quel texte en slug propre séparé par des tirets, adapté aux noms de branches.

Caractères spéciaux dans l'interpolation de variables CI/CD

Les pipelines CI construisent souvent des noms de branches à partir de variables d'environnement - titres de PR, messages de commit ou IDs de tickets Jira. Si l'une de ces valeurs contient un caractère spécial (deux-points dans un ID Jira comme `PROJECT:123`, ou une barre oblique dans un tag semver comme `v1.0.0/rc.1`), le nom de branche interpolé échouera. Correction : assainissez l'entrée avant de l'utiliser comme nom de branche. Remplacez les caractères non alphanumériques par des tirets et supprimez les tirets et points en tête et en fin.

Point final ou suffixe .lock

Un nom de branche qui se termine par un point (`feature.`) ou par `.lock` (`release.lock`) échoue car Git réserve ces motifs aux fichiers de verrouillage. Cette erreur apparaît typiquement quand un développeur tape un nom se terminant par un point par accident, ou quand un script ajoute `.lock` dans un nom généré. Correction : retirez le point final, ou remplacez `.lock` par un suffixe valide comme `-locked` ou `-pending`.

Motif invalideExempleCorrection
Espacefeature/add loginfeature/add-login
Double pointfeat..loginfeat/login
Tildehotfix~v2hotfix-v2
Deux-pointsPROJECT:123PROJECT-123
Point finalrelease.release
Se termine par .lockfix.lockfix-pending
Commence par un tiret-bugfixbugfix
@ suivi de {user@{branch}user-branch
Antislashfeature\\loginfeature/login

Validateur de Convention de Noms de Branche

Validez les noms de branches Git contre la spécification refname complète et la convention de votre équipe - local au navigateur, retour instantané, sans configuration.

Open tool

Comment renommer une branche invalide

Dans de rares cas - notamment avec d'anciennes versions de Git ou des branches créées via des outils tiers - vous pouvez vous retrouver avec un nom de branche invalide déjà présent dans votre dépôt. Le Git moderne l'empêche à la création, mais si vous héritez d'un dépôt avec un nom de branche problématique, voici comment le corriger.

1

Renommez la branche locale

Exécutez `git branch -m old-name new-name` pour renommer la branche dans votre dépôt local. L'option `-m` déplace (renomme) la référence de branche sans toucher à l'historique des commits. Si l'ancien nom contient des caractères qui compliquent le guillemetage dans votre shell, utilisez des guillemets simples : `git branch -m 'old name with spaces' new-valid-name`.

2

Poussez le nouveau nom vers le dépôt distant

Après le renommage local, poussez la nouvelle branche vers le dépôt distant : `git push origin new-valid-name`. Cela crée la nouvelle branche sur le distant. Si l'ancienne branche avait déjà été poussée, vos coéquipiers doivent mettre à jour leur référence de suivi locale avec `git fetch --prune` après que vous avez supprimé l'ancienne branche distante.

3

Supprimez l'ancienne branche distante

Supprimez l'ancienne branche distante : `git push origin --delete old-name`. Sur GitHub, GitLab et Bitbucket, vous pouvez aussi renommer les branches via l'interface web dans la liste des branches - c'est l'option la plus sûre quand l'ancien nom contient des caractères difficiles à passer en CLI sans échappement.

4

Mettez à jour les pull requests ouverts

Si la branche renommée avait des pull requests ouverts, la plupart des plateformes (GitHub, GitLab) mettent automatiquement à jour la référence de la branche de base du PR quand vous renommez via l'interface web. Si vous avez renommé en CLI, vérifiez vos PR ouverts et mettez à jour manuellement la référence de la branche head si nécessaire. Les exécutions CI visant l'ancien nom de branche devront aussi être relancées sur le nouveau nom.

Warning

Ne renommez pas une branche qui est actuellement la branche par défaut (`main` ou `master`) sans avoir d'abord mis à jour les paramètres de votre dépôt. Renommer la branche par défaut sans mettre à jour le pointeur HEAD distant fera que `git clone` extraira la mauvaise branche par défaut pour tous les clones suivants.

Règles de nommage spécifiques aux plateformes

Les règles refname de Git proprement dites constituent la base. Les plateformes d'hébergement distant ajoutent des restrictions supplémentaires : un nom qui passe la validation locale de Git peut quand même échouer lors du push vers GitHub ou GitLab. Comprendre les règles spécifiques aux plateformes évite la frustration d'un nom qui fonctionne localement mais échoue à distance.

Restrictions supplémentaires de GitHub

GitHub rejette les noms de branches se terminant par `.lock` sur n'importe quel composant de chemin (pas seulement le dernier segment), les noms contenant des points consécutifs à n'importe quelle position, et les noms contenant un octet nul. GitHub impose aussi une longueur maximale de nom de branche de 255 octets. L'interface web de GitHub supprime en outre les espaces en début et fin de fin des noms créés via l'interface.

Restrictions supplémentaires de GitLab

GitLab ajoute des restrictions pour les motifs de branches protégées : les noms contenant des jokers `*` sont réservés aux règles de branches protégées et ne peuvent pas servir de noms de branche littéraux. GitLab réserve aussi les noms correspondant à son namespacing interne comme `protected` et `refs`. Les noms de branches de plus de 255 caractères sont rejetés. La validation des noms dans le pipeline GitLab CI est distincte de la validation refname de Git : les erreurs d'interpolation de variables CI apparaissent comme des échecs de pipeline plutôt que comme des erreurs Git.

Considérations sur le système de fichiers Windows

Sous Windows, le répertoire `.git/refs/heads/` stocke chaque branche comme un fichier. Cela signifie que toutes les restrictions de noms de fichiers Windows s'appliquent : les noms ne peuvent pas contenir `<`, `>`, `"`, `|`, `?` ni `*` ; les noms ne peuvent pas se terminer par un espace ou un point ; et les noms sont insensibles à la casse sur NTFS. L'insensibilité à la casse est particulièrement importante dans les équipes mixtes - `Feature/Login` et `feature/login` sont la même branche sous Windows mais des branches différentes sur Linux et macOS.


RègleNoyau GitGitHubGitLabSystème de fichiers Windows
Pas d'espaces✓✓✓✓
Pas de suffixe .lock✓✓ tout composant✓✓
Pas de doubles points✓✓✓✓
Pas de tiret initial✓✓✓✓
Maximum 255 octets✗ (aucune limite)✓✓Limite de chemin de l'OS
Insensible à la casse✗✗✗✓ (NTFS)
Pas de * comme nom littéral✓✓✓ réservéN/A

Conventions de nommage des branches par équipe

Valide est le plancher, pas le plafond. Un nom de branche peut être valide selon les règles de Git tout en restant peu clair, incohérent ou inutilisable dans le flux de travail de votre équipe. Les conventions établies ajoutent de la prévisibilité par-dessus la validité technique - chaque membre de l'équipe peut lire un nom de branche et comprendre immédiatement son but, sa portée et son cycle de vie.

Convention Gitflow

Gitflow utilise cinq types de branches : `main` (production), `develop` (intégration), `feature/description`, `release/version` et `hotfix/description`. Les noms de branches utilisent la catégorie comme préfixe suivie d'une barre oblique et d'une description séparée par des tirets. Les branches de release incluent le numéro de version (`release/1.4.0`). Cette convention est bien prise en charge par la plupart des clients GUI Git et des outils CI, qui reconnaissent les préfixes comme catégories de branche.

GitHub Flow et conventions trunk-based

GitHub Flow utilise une structure plus simple : `main` plus des branches de fonctionnalités à courte durée de vie nommées de façon descriptive (`add-oauth-login`, `fix-pagination-bug`). Le développement trunk-based utilise de même `main` plus des branches très éphémères fusionnées en quelques heures. Les deux approches préfèrent des noms courts, en minuscules et séparés par des tirets sans préfixes de catégorie - l'hypothèse étant que les noms de branches sont temporaires et que le titre et la description du PR portent le contexte.

Conventions avec référence de ticket

Beaucoup d'équipes préfixent les noms de branches par une référence de ticket : `JIRA-1234-fix-login-bug` ou `feat/GH-456-add-dark-mode`. L'ID de ticket assure la traçabilité entre la branche et l'élément de travail d'origine. En construisant ces noms programmatiquement, assainissez toujours la partie description du ticket - les titres de tickets contiennent fréquemment des deux-points, des barres obliques et d'autres caractères qui cassent les règles de nommage Git.

Les noms de branches, comme les messages de commit, sont de la documentation. Une convention de nommage cohérente transforme votre liste de branches en un journal lisible des travaux en cours.

- Communauté Conventional Commits

Prévenir les noms de branches invalides

Corriger les erreurs une par une est réactif. La meilleure approche est d'empêcher la création de noms invalides dès le départ - via des outils de validation, des intégrations d'éditeur et des contrôles CI qui attrapent les problèmes avant qu'ils ne perturbent l'équipe.

Hooks Git de pre-push

Un script `.git/hooks/pre-push` s'exécute avant tout `git push` et peut valider le nom de la branche courante contre la convention de votre équipe. Si le nom échoue, le hook se termine avec un code non nul et interrompt le push avec un message explicatif. Utilisez le framework `pre-commit` pour distribuer les hooks de façon cohérente dans l'équipe - les fichiers `.git/hooks/` individuels ne sont pas committés dans le dépôt, mais un `.pre-commit-config.yaml` l'est.

Validation des noms dans le pipeline CI

Ajoutez une étape de validation de nom de branche au début de votre pipeline CI. Pour GitHub Actions, utilisez une étape de job précoce qui vérifie le nom de branche contre un motif regex et fait échouer le workflow en cas de non-correspondance. Cela attrape les noms techniquement valides selon Git mais violant la convention de l'équipe - noms sans préfixe de type, trop longs ou sans référence de ticket. Le Validateur de Convention de Noms de Branche applique cette même logique localement dans votre navigateur, utile pour vérifier un nom avant de créer la branche.

  • Validez localement avant de créer : utilisez le Validateur de Convention de Noms de Branche pour vérifier les noms contre les règles Git et les conventions d'équipe.
  • Utilisez un script de création de branche : une petite fonction shell qui prend un ID de ticket et une description et produit un nom de branche correctement formaté élimine entièrement les erreurs de nommage manuelles.
  • Ajoutez un hook de pre-push : valide le nom de branche à chaque push - la dernière ligne de défense avant qu'un nom invalide n'atteigne le distant.
  • Lintez en CI : une étape GitHub Actions ou GitLab CI qui valide le nom de branche à chaque PR empêche que les violations de convention ne soient fusionnées.
  • Documentez la convention dans CONTRIBUTING.md : les membres d'équipe qui connaissent les règles font moins d'erreurs que ceux qui devinent à partir d'exemples.

Tip

En construisant des noms de branches à partir de données externes (titres de tickets, messages de commit ou réponses d'API), assainissez toujours avant d'utiliser. Un motif fiable : mettez la chaîne en minuscules, remplacez toute séquence de caractères non alphanumériques par un tiret unique, supprimez les tirets en tête et en fin, et tronquez à 72 caractères. Le résultat est toujours un nom de branche Git valide et suit les conventions d'équipe les plus courantes.

Key takeaways

  • Git valide les noms de branches selon sa spécification refname et rejette immédiatement les noms contenant des espaces, `..`, `~`, `^`, `:`, `?`, `*`, `[`, `\\`, `@{`, ou les noms commençant/se terminant par un point ou commençant par un tiret.
  • La cause la plus courante est de coller un titre de ticket avec des espaces directement dans une commande `git checkout -b` - remplacez les espaces par des tirets avant d'utiliser un titre comme nom de branche.
  • Utilisez `git check-ref-format --branch name` en ligne de commande pour tester un nom, ou le Validateur de Convention de Noms de Branche dans le navigateur.
  • Pour renommer une branche existante : `git branch -m old-name new-name` localement, puis poussez le nouveau nom et supprimez l'ancienne branche distante avec `git push origin --delete old-name`.
  • Les règles des plateformes étendent la base Git : GitHub et GitLab rejettent `.lock` sur tout composant de chemin, et Windows NTFS rend les noms de branches insensibles à la casse - utilisez toujours des minuscules pour éviter les collisions multiplateformes.
  • Prévenez les erreurs de manière systématique avec un hook Git de pre-push, une étape de validation dans le pipeline CI et une convention de nommage documentée dans votre dépôt.
  • La convention multiplateforme la plus sûre : `type/minuscules-avec-tirets` (par ex. `feat/add-login-form`, `fix/null-pointer-auth`).

Questions fréquentes

Git validates branch names against its refname specification and rejects any name containing forbidden characters or patterns. The most common triggers are spaces in the branch name, double dots (..), a tilde (~), a caret (^), a colon (:), a question mark (?), an asterisk (*), a backslash (\), or a name that starts or ends with a dot or slash. The error also fires if the name ends with .lock - a suffix Git reserves for lock files.

No. Spaces are explicitly forbidden in Git branch names. Git uses spaces as delimiters in many command outputs and cannot reliably disambiguate a branch name containing a space from two separate arguments. The standard replacement is a hyphen - `feature/user-profile` instead of `feature/user profile`. Underscores also work but hyphens are more widely adopted in open-source conventions. If your CI or CD platform has additional restrictions, check its documentation alongside Git's own refname rules.

Git allows letters (a-z, A-Z), digits (0-9), hyphens (-), underscores (_), forward slashes (/) for hierarchical namespaces (e.g. feature/login), and dots (.) within the name but not at the start or end. Most other characters are either forbidden or context-dependent. The safest convention is `lowercase-with-hyphens` or `type/lowercase-with-hyphens` (e.g. `feat/add-login-form`). Validate any unconventional branch name with the Branch Name Convention Validator before creating it.

Use `git branch -m old-name new-name` to rename a local branch. If the branch is already pushed to a remote, rename locally first, then push the new name with `git push origin new-name` and delete the old remote branch with `git push origin --delete old-name`. On GitHub, GitLab, and Bitbucket, you can also rename branches through the web UI - useful if the remote branch name itself contains characters that make CLI deletion awkward.

Older Git versions (before 2.x) had less strict local name validation and would sometimes allow creating a branch locally that was then rejected by the remote. Modern Git validates refnames at creation time, but edge cases can occur when names are constructed programmatically or passed through shell interpolation. Remote hosts like GitHub also apply additional restrictions (no consecutive dots, no names ending in .lock at any path component) that the local Git client does not enforce.

The combination @{ is forbidden in Git branch names because it is the syntax for the reflog shorthand - `branch@{n}` refers to the nth entry in a branch's reflog. Allowing @{ in a branch name would create an ambiguity between the branch itself and a reflog reference. This restriction is often encountered when developers try to use ticket IDs or timestamps that include the @ symbol followed by a brace in a branch name. Replace @ with a hyphen or remove it entirely.

Git itself is case-sensitive on Linux and macOS but case-insensitive on Windows filesystems, which means `Feature/Login` and `feature/login` are the same branch on Windows but different branches on Linux. Using lowercase throughout prevents confusing case-collision bugs when teams work across different operating systems. Most popular conventions (Gitflow, GitHub Flow, Trunk-Based Development) specify lowercase branch names, and most CI systems enforce it as a linting rule.

Git does not impose a hard character limit on branch names from the specification side, but practical limits exist. The underlying filesystem has path length constraints - on Windows, the default maximum path length is 260 characters, which includes the .git directory path and the refs/heads/ prefix. Long branch names also become impractical to type and read. Most teams enforce a soft limit of 50-72 characters as a convention. The Branch Name Convention Validator checks your name against both Git rules and configurable length limits.

ShareXLinkedIn