Pular para o conteúdo
Aback Tools Logo

Erro do Git 'is not a valid branch name': Regras, Correções e Convenções

O erro do Git "is not a valid branch name" explicado: a lista completa de regras de refname, causas comuns com correções de uma linha, renomear branches inválidas com segurança, regras específicas de GitHub/GitLab/Windows e convenções de nomes de equipe.

DH
Tutorials & How-Tos11 min de leitura2,600 palavras

O erro do Git "is not a valid branch name" é preciso: o nome que você forneceu viola uma ou mais regras de refname do Git. A correção quase sempre é uma mudança de uma linha depois que você descobre qual caractere ou padrão a desencadeou. Este guia cobre o conjunto completo de restrições de nomenclatura do Git, as causas mais comuns com correções exatas, como renomear uma branch que já existe e como impor nomenclatura válida em toda a sua equipe antes de alguém se deparar com o erro.

14+Padrões proibidosconforme a especificação de refname do Git
1 cmdPara renomear uma branchgit branch -m old new
0Limite rígido de tamanhomas 50-72 caracteres são recomendados

O que o erro significa

Quando o Git reporta `fatal: 'some-name' is not a valid branch name`, significa que a string que você passou como nome de branch viola a especificação de refname do Git: o conjunto de regras que governa o que constitui um nome de referência válido em um repositório Git. O Git usa as mesmas regras para nomes de branches, tags e nomes de rastreamento remoto, porque todos são armazenados como referências no diretório `.git/refs/`.

A validação acontece antes de qualquer objeto ser escrito. O Git passa o nome proposto por `check_refname_format()` internamente e aborta com o erro se o nome falhar. Isso significa que você vê o erro imediatamente ao executar `git checkout -b`, `git branch` ou `git switch -c` - não há estado parcial para limpar.

Onde o erro aparece

  • `git checkout -b branch-name` - criar uma nova branch e alternar para ela
  • `git branch branch-name` - criar uma nova branch sem alternar
  • `git switch -c branch-name` - o equivalente moderno de checkout -b
  • `git push origin branch-name` - fazer push para um remoto com um nome local inválido
  • Scripts de CI/CD - quando um nome de branch é construído programaticamente a partir de um ID de ticket ou mensagem de commit

Note

A mensagem completa do erro do Git cita o nome exato que falhou: `fatal: 'my feature branch' is not a valid branch name`. O valor entre aspas é a string literal que o Git recebeu - incluindo espaços, caracteres especiais ou valores expandidos pelo shell. Isso facilita identificar exatamente qual caractere causou o problema.

Regras de nomenclatura de branches no Git

A especificação de refname do Git (definida na página man de `git-check-ref-format`) descreve um conjunto preciso de caracteres e padrões proibidos. Aprender as regras uma vez previne todos os futuros erros de nomenclatura - não há casos ambíguos depois que você conhece a lista completa.

Caracteres e sequências explicitamente proibidos

  • Espaço (ASCII 0x20) - o erro mais comum; use `-` ou `_` no lugar.
  • Til `~` - usado na notação de reflog (`branch~2` significa dois commits antes da ponta).
  • Acento circunflexo `^` - usado na notação de revisão (`branch^` significa o commit pai).
  • Dois-pontos `:` - usados na notação de refspec de fetch (`refs/heads/main:refs/heads/main`).
  • Interrogação `?` - caractere curinga glob em padrões de refs.
  • Asterisco `*` - caractere curinga glob em padrões de refs.
  • Colchete de abertura `[` - abertura de conjunto de caracteres glob.
  • Barra invertida `\\` - separador de caminho no Windows; proibida para evitar problemas multiplataforma.
  • Ponto duplo `..` - usado na notação de intervalo (`main..feature`).
  • Sequência @{ - notação abreviada de reflog (`branch@{1}` é uma entrada de reflog).

Regras posicionais e estruturais

  • Não pode começar com ponto (`.`) - convenção de arquivos ocultos; `.hidden` não é um início válido.
  • Não pode terminar com ponto (`.`) - ambíguo com a extensão `.lock` e a notação de extensões de arquivo.
  • Não pode terminar com `.lock` - o Git usa o sufixo `.lock` para arquivos de bloqueio; qualquer componente de caminho terminando em `.lock` é proibido.
  • Não pode começar com hífen (`-`) - conflita com a análise de opções de linha de comando.
  • Não pode conter pontos consecutivos (`..`) - conflito com a notação de intervalo (veja acima).
  • Não pode ser o caractere único `@` - abreviação de `HEAD`.
  • Não pode conter caracteres de controle - caracteres ASCII abaixo de 0x20 e DEL (0x7F) são proibidos.
  • Não pode ser vazio - uma string vazia não é um nome válido.
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

Execute `git check-ref-format --branch seu-nome-proposto` para testar qualquer nome antes de criar a branch. Ele sai com código 0 se o nome é válido e 1 se não é - útil em scripts e hooks de pre-commit. Para uma verificação no navegador com suporte a convenções de equipe, use o [Validador de Convenção de Nomes de Branch](/tools/data/validators/branch-name-convention-validator).

Causas comuns e correções

A maioria das ocorrências desse erro vem de um pequeno número de padrões repetitivos. Cada um tem uma causa específica e uma correção específica de uma linha.

Espaços de títulos de ticket copiados e colados

O gatilho mais comum é copiar um título de ticket ou história diretamente para o nome da branch. "Add user login form" se torna `git checkout -b Add user login form`, que o Git vê como três argumentos separados e rejeita o nome de branch `Add`. Correção: substitua cada espaço por um hífen. Muitas equipes automatizam isso com um alias ou script `branch-from-ticket` que transforma o título antes de passá-lo ao Git. O Gerador de Slugs converte qualquer texto em um slug limpo separado por hifens adequado para nomes de branches.

Caracteres especiais na interpolação de variáveis de CI/CD

Pipelines de CI frequentemente constroem nomes de branches a partir de variáveis de ambiente - títulos de PR, mensagens de commit ou IDs de tickets do Jira. Se qualquer um desses valores contiver um caractere especial (dois-pontos em um ID do Jira como `PROJECT:123`, ou uma barra em uma tag semver como `v1.0.0/rc.1`), o nome de branch interpolado falhará. Correção: sanitize a entrada antes de usá-la como nome de branch. Substitua caracteres não alfanuméricos por hifens e remova hifens e pontos no início e no fim.

Ponto final ou sufixo .lock

Um nome de branch que termina com ponto (`feature.`) ou termina com `.lock` (`release.lock`) falha porque o Git reserva esses padrões para arquivos de bloqueio. Esse erro normalmente aparece quando um desenvolvedor digita um nome terminando com ponto por acidente, ou quando um script acrescenta `.lock` como parte de um nome gerado. Correção: remova o ponto final, ou substitua `.lock` por um sufixo válido como `-locked` ou `-pending`.

Padrão inválidoExemploCorreção
Espaçofeature/add loginfeature/add-login
Ponto duplofeat..loginfeat/login
Tilhotfix~v2hotfix-v2
Dois-pontosPROJECT:123PROJECT-123
Ponto finalrelease.release
Termina com .lockfix.lockfix-pending
Começa com hífen-bugfixbugfix
@ seguido de {user@{branch}user-branch
Barra invertidafeature\\loginfeature/login

Validador de Convenção de Nomes de Branch

Valide nomes de branches Git contra a especificação completa de refname e a convenção da sua equipe - local no navegador, feedback instantâneo, sem configuração.

Open tool

Como renomear uma branch inválida

Em casos raros - particularmente com versões antigas do Git ou branches criadas via ferramentas de terceiros - você pode acabar com um nome de branch inválido já commitado no seu repositório. O Git moderno previne isso no momento da criação, mas se você herdar um repositório com um nome de branch problemático, veja como corrigir.

1

Renomeie a branch local

Execute `git branch -m old-name new-name` para renomear a branch no seu repositório local. A flag `-m` move (renomeia) a referência da branch sem tocar no histórico de commits. Se o nome antigo contém caracteres que complicam o uso de aspas no seu shell, use aspas simples: `git branch -m 'old name with spaces' new-valid-name`.

2

Faça push do novo nome para o remoto

Depois de renomear localmente, faça push da nova branch para o remoto: `git push origin new-valid-name`. Isso cria a nova branch no remoto. Se a branch antiga já tinha sido enviada, os colegas devem atualizar sua referência de rastreamento local com `git fetch --prune` depois que você excluir a branch remota antiga.

3

Exclua a branch remota antiga

Remova a branch remota antiga: `git push origin --delete old-name`. No GitHub, GitLab e Bitbucket, você também pode renomear branches pela interface web na lista de branches - é a opção mais segura quando o nome antigo contém caracteres difíceis de passar pela CLI sem escaping.

4

Atualize os pull requests abertos

Se a branch renomeada tinha pull requests abertos, a maioria das plataformas (GitHub, GitLab) atualiza automaticamente a referência da branch base do PR quando você renomeia pela interface web. Se você renomeou via CLI, verifique seus PRs abertos e atualize manualmente a referência da branch head se necessário. Execuções de CI contra o nome antigo da branch também precisarão ser reexecutadas com o novo nome.

Warning

Não renomeie uma branch que é atualmente a branch padrão (`main` ou `master`) sem antes atualizar as configurações do seu repositório. Renomear a branch padrão sem atualizar o ponteiro HEAD remoto fará com que `git clone` faça checkout da branch errada por padrão em todos os clones subsequentes.

Regras de nomenclatura específicas por plataforma

As regras de refname do próprio Git são a base. As plataformas de hospedagem remota aplicam restrições adicionais por cima - um nome que passa na validação local do Git ainda pode falhar no push para GitHub ou GitLab. Entender as regras específicas de cada plataforma evita a frustração de um nome que funciona localmente mas falha remotamente.

Restrições adicionais do GitHub

O GitHub rejeita nomes de branches que terminam com `.lock` em qualquer componente de caminho (não apenas o segmento final), nomes que contêm pontos consecutivos em qualquer posição e nomes que contêm um byte nulo. O GitHub também impõe um tamanho máximo de nome de branch de 255 bytes. A interface web do GitHub, adicionalmente, remove espaços em branco no início e no fim de nomes criados pela interface.

Restrições adicionais do GitLab

O GitLab acrescenta restrições para padrões de branches protegidas - nomes contendo curingas `*` são reservados para regras de branches protegidas e não podem ser usados como nomes literais de branch. O GitLab também reserva nomes de branch que correspondam ao seu namespacing interno como `protected` e `refs`. Nomes de branch com mais de 255 caracteres são rejeitados. A validação de nomes no pipeline do GitLab CI é separada da validação de refname do Git - erros de interpolação de variáveis de CI aparecem como falhas de pipeline em vez de erros do Git.

Considerações sobre o sistema de arquivos do Windows

No Windows, o diretório `.git/refs/heads/` armazena cada branch como um arquivo. Isso significa que todas as restrições de nomes de arquivo do Windows se aplicam: nomes não podem conter `<`, `>`, `"`, `|`, `?` ou `*`; nomes não podem terminar com espaço ou ponto; e os nomes são insensíveis a maiúsculas e minúsculas no NTFS. A questão da insensibilidade a maiúsculas é particularmente importante em equipes mistas - `Feature/Login` e `feature/login` são a mesma branch no Windows, mas branches diferentes no Linux e no macOS.


RegraNúcleo do GitGitHubGitLabSistema de arquivos Windows
Sem espaços✓✓✓✓
Sem sufixo .lock✓✓ qualquer componente✓✓
Sem pontos duplos✓✓✓✓
Sem hífen inicial✓✓✓✓
Máximo 255 bytes✗ (sem limite)✓✓Limite de caminho do SO
Insensível a maiúsculas✗✗✗✓ (NTFS)
Sem * como nome literal✓✓✓ reservadoN/A

Convenções de nomes de branches por equipe

Válido é o piso, não o teto. Um nome de branch pode ser válido segundo as regras do Git e ainda ser pouco claro, inconsistente ou inutilizável no fluxo de trabalho da sua equipe. Convenções estabelecidas acrescentam previsibilidade sobre a validade técnica - cada membro da equipe consegue ler um nome de branch e entender imediatamente seu propósito, escopo e ciclo de vida.

Convenção Gitflow

O Gitflow usa cinco tipos de branch: `main` (produção), `develop` (integração), `feature/descrição`, `release/versão` e `hotfix/descrição`. Os nomes de branch usam a categoria como prefixo seguido de uma barra e uma descrição separada por hifens. As branches de release incluem o número de versão (`release/1.4.0`). Essa convenção é bem suportada pela maioria dos clientes GUI do Git e ferramentas de CI, que reconhecem os prefixos como categorias de branch.

GitHub Flow e convenções baseadas em trunk

O GitHub Flow usa uma estrutura mais simples: `main` mais branches de feature de vida curta com nomes descritivos (`add-oauth-login`, `fix-pagination-bug`). O desenvolvimento baseado em trunk usa, de forma semelhante, `main` mais branches muito efêmeras que são mescladas em horas. Ambas as abordagens preferem nomes curtos, em minúsculas e separados por hifens sem prefixos de categoria - a suposição é que os nomes de branch são temporários e o título e a descrição do PR carregam o contexto.

Convenções com referência de ticket

Muitas equipes prefixam nomes de branches com uma referência de ticket: `JIRA-1234-fix-login-bug` ou `feat/GH-456-add-dark-mode`. O ID do ticket fornece rastreabilidade entre a branch e o item de trabalho de origem. Ao construir esses nomes programaticamente, sempre sanitize a parte da descrição do ticket - títulos de ticket frequentemente contêm dois-pontos, barras e outros caracteres que quebram as regras de nomenclatura do Git.

Nomes de branches, como mensagens de commit, são documentação. Uma convenção de nomenclatura consistente transforma sua lista de branches em um changelog legível do trabalho em andamento.

- Comunidade Conventional Commits

Prevenindo nomes de branches inválidos

Corrigir erros individuais é reativo. A melhor abordagem é impedir que nomes inválidos sejam criados em primeiro lugar - por meio de ferramentas de validação, integrações de editor e verificações de CI que capturam problemas antes de atrapalhar a equipe.

Hooks de pre-push do Git

Um script `.git/hooks/pre-push` roda antes de qualquer `git push` e pode validar o nome da branch atual contra a convenção da sua equipe. Se o nome falhar, o hook sai com código diferente de zero e aborta o push com uma mensagem explicativa. Use o framework `pre-commit` para distribuir hooks de forma consistente pela equipe - arquivos `.git/hooks/` individuais não são commitados no repositório, mas um `.pre-commit-config.yaml` é.

Validação de nomes no pipeline de CI

Adicione uma etapa de validação de nome de branch no início do seu pipeline de CI. Para o GitHub Actions, use uma etapa de job inicial que verifica o nome da branch contra um padrão regex e faz o workflow falhar se não corresponder. Isso captura nomes tecnicamente válidos segundo o Git, mas que violam a convenção da equipe - nomes sem prefixo de tipo, muito longos ou sem referência de ticket. O Validador de Convenção de Nomes de Branch aplica essa mesma lógica localmente no seu navegador, útil para verificar um nome antes de criar a branch.

  • Valide localmente antes de criar: use o Validador de Convenção de Nomes de Branch para verificar nomes contra as regras do Git e as convenções da equipe.
  • Use um script de criação de branch: uma pequena função de shell que recebe um ID de ticket e uma descrição e produz um nome de branch corretamente formatado elimina totalmente os erros manuais de nomenclatura.
  • Adicione um hook de pre-push: valida o nome da branch a cada push - a última linha de defesa antes que um nome inválido chegue ao remoto.
  • Faça lint no CI: uma etapa do GitHub Actions ou GitLab CI que valida o nome da branch em cada PR impede que violações de convenção sejam mescladas.
  • Documente a convenção no CONTRIBUTING.md: membros da equipe que conhecem as regras cometem menos erros do que quem adivinha a partir de exemplos.

Tip

Ao construir nomes de branches a partir de dados externos (títulos de tickets, mensagens de commit ou respostas de API), sempre sanitize antes de usar. Um padrão confiável: converta a string para minúsculas, substitua qualquer sequência de caracteres não alfanuméricos por um único hífen, remova hifens no início e no fim e trunque para 72 caracteres. O resultado é sempre um nome de branch Git válido e segue as convenções de equipe mais comuns.

Key takeaways

  • O Git valida nomes de branches contra sua especificação de refname e rejeita imediatamente nomes contendo espaços, `..`, `~`, `^`, `:`, `?`, `*`, `[`, `\\`, `@{`, ou nomes que começam/terminam com ponto ou começam com hífen.
  • A causa mais comum é copiar um título de ticket com espaços diretamente para um comando `git checkout -b` - substitua espaços por hifens antes de usar qualquer título como nome de branch.
  • Use `git check-ref-format --branch name` na linha de comando para testar um nome, ou o Validador de Convenção de Nomes de Branch no navegador.
  • Para renomear uma branch existente: `git branch -m old-name new-name` localmente, depois faça push do novo nome e exclua a branch remota antiga com `git push origin --delete old-name`.
  • As regras das plataformas estendem a base do Git: GitHub e GitLab rejeitam `.lock` em qualquer componente de caminho, e o Windows NTFS torna os nomes de branch insensíveis a maiúsculas - sempre use minúsculas para evitar colisões multiplataforma.
  • Previna erros de forma sistemática com um hook de pre-push do Git, uma etapa de validação no pipeline de CI e uma convenção de nomenclatura documentada no seu repositório.
  • A convenção multiplataforma mais segura: `tipo/minúsculas-com-hifens` (por exemplo `feat/add-login-form`, `fix/null-pointer-auth`).

Perguntas frequentes

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