git branch
Listar, criar ou excluir branches
O comando 'git branch' permite criar, listar, renomear e excluir branches. Ele não troca de branch - para isso use 'git switch' ou 'git checkout'. No Git, as branches são ponteiros leves para commits, o que torna criar e trocar de branch extremamente rápido. Sem argumentos, o git branch lista as branches existentes e destaca a atual. Com um nome de branch, ele cria uma branch nova apontando para o HEAD atual. Branches são essenciais para o desenvolvimento em paralelo: várias funcionalidades ou correções podem avançar ao mesmo tempo sem atrapalhar umas às outras.
Sinopse
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>]Opções
Escolhendo a opção certa
Ver branches
Jeitos diferentes de listar e inspecionar branches
| Comando | Mostra locais | Mostra remotas | Informação extra | Caso de uso |
|---|---|---|---|---|
git branch | Sim | No | Branch atual marcada com * | Olhada rápida nas branches locais |
git branch -r | No | Sim | Refs de rastreamento remoto | Ver o que há no servidor |
git branch -a | Sim | Sim | Todas as refs | Visão completa de todas as branches |
git branch -v | Sim | No | Último commit de cada branch | Ver a atividade das branches de relance |
git branch -vv | Sim | No | Upstream + à frente/atrás | Conferir a sincronização com o remoto |
git branch --show-current | Só a atual | No | Só o nome | Scripts, prompts do shell |
Excluir branches
Exclusão segura ou forçada - saiba a diferença
| Comando | Exige merge | Pode perder trabalho | Quando usar |
|---|---|---|---|
-d (--delete) | Sim | No | Depois do merge do PR, limpeza de rotina |
-D (--delete --force) | No | Sim | Abandonar trabalho experimental |
Renomear e copiar branches
Opções para reorganizar os nomes das suas branches
| Comando | Sobrescreve a existente | Mantém a original | Uso típico |
|---|---|---|---|
-m (--move) | Não (falha) | No | Renomear: feature → feature-v2 |
-M (--move --force) | Sim | No | Substituir um nome de branch existente |
-c (--copy) | Não (falha) | Sim | Duplicar uma branch para experimentar |
-C (--copy --force) | Sim | Sim | Copiar, sobrescrevendo se existir |
Filtrar branches pelo status de merge
Achar branches prontas para excluir ou ainda em andamento
| Comando | Mostra | Propósito | Passo seguinte comum |
|---|---|---|---|
--merged | Branches mescladas no HEAD | Achar candidatas à limpeza | git branch -d <branch> |
--merged main | Branches mescladas na main | Encontrar branches que podem ser excluídas com segurança | Excluir em massa as branches mescladas |
--no-merged | Branches NÃO mescladas | Achar trabalho em andamento | Revisar antes de uma release |
--contains <commit> | Branches que contêm um commit | Descobrir para onde foi uma correção | Conferir o deploy de um hotfix |
Rastreamento do upstream
Configurar a relação entre branches locais e remotas
| Comando | Ação | Efeito | Quando usar |
|---|---|---|---|
-u origin/main | Definir o upstream | git push/pull funcionam sem argumentos | Depois de criar uma branch local |
--track origin/feature | Criar + definir o upstream | Branch local nova rastreando uma remota | Começar a trabalhar em uma branch remota |
--unset-upstream | Remover o upstream | Desconectar do remoto | Parar de rastrear uma branch remota excluída |
Exemplos de fluxos de trabalho
git branch feature-loginCriar uma branch nova para a funcionalidade
git switch feature-loginTrocar para a branch nova
(make changes and commits)Trabalhar na funcionalidade com vários commits
git switch main && git merge feature-loginMesclar a funcionalidade pronta de volta na main
git branch -d feature-loginExcluir a branch da funcionalidade depois do merge
git branch --mergedListar as branches já mescladas
git branch -d branch-nameExcluir com segurança as branches mescladas, uma a uma
git fetch --pruneRemover referências de rastreamento remoto obsoletas
git branch -rConferir que as branches remotas estão limpas
git fetch originBuscar as informações mais recentes das branches remotas
git branch -rListar as branches remotas disponíveis
git branch --track feature origin/featureCriar uma branch local rastreando a remota
git switch featureTrocar para a nova branch de rastreamento
git branch -m old-name new-nameRenomear a branch local
git push origin -u new-nameEnviar o nome novo da branch para o remoto
git push origin --delete old-nameExcluir o nome antigo da branch do remoto
git log --oneline -1Pegar o hash do commit que você procura
git branch --contains <commit-hash>Achar branches locais com este commit
git branch -r --contains <commit-hash>Achar branches remotas com este commit
Solução de problemas
Não é possível excluir a branch - não totalmente mesclada
Causa: A branch tem commits não mesclados no upstream dela (ou no HEAD, se não tiver upstream)
Mescle a branch primeiro, ou use -D para forçar a exclusão se tiver certeza de que quer descartar o trabalho
git branch -D branch-nameNão é possível excluir a branch atual
Causa: Você está tentando excluir a branch em que está
Troque antes para outra branch e depois exclua a branch desejada
git switch main && git branch -d old-branchEsse nome de branch já existe
Causa: Você está tentando criar uma branch com um nome que já existe
Escolha outro nome, exclua antes a branch existente ou use -f para movê-la para um novo ponto de partida
git branch -f existing-name <start-point>Nenhum upstream configurado para o push
Causa: A branch local não tem relação de rastreamento com uma branch remota
Configure a relação de rastreamento com o upstream
git push -u origin branch-nameA branch remota não aparece em git branch -r
Causa: O repositório local não tem as informações mais recentes das branches remotas
Faça fetch do remoto para atualizar as suas branches de rastreamento remoto
git fetch originHEAD desanexado (detached) depois do checkout
Causa: Você fez checkout de um commit diretamente em vez de uma branch
Crie uma branch nova no commit atual ou volte para uma branch existente
git switch -c new-branch-nameA branch rastreia o remoto errado
Causa: O upstream está configurado para rastrear uma branch remota incorreta
Redefina o rastreamento do upstream para a branch remota correta
git branch -u origin/correct-branchNão aparecem todas as branches
Causa: Por padrão, só as branches locais são mostradas
Use a opção -a para mostrar tanto as branches locais quanto as de rastreamento remoto
git branch -aDicas e armadilhas
Boas práticas
- ✓Use nomes de branch descritivos que indiquem o propósito: feature/user-auth, bugfix/login-error, hotfix/security-patch
- ✓Exclua branches depois do merge para manter o repositório limpo - use 'git branch --merged' para achar as que podem ser excluídas com segurança
- ✓Sempre crie branches de funcionalidade a partir de uma main atualizada para diminuir conflitos de merge
- ✓Use 'git branch -vv' para ver as relações de rastreamento e quanto está à frente/atrás
- ✓Configure o rastreamento ao criar branches com 'git push -u origin branch-name' para facilitar push/pull
- ✓Evite trabalhar direto na main/master - sempre crie uma branch para as mudanças
- ✓Use 'git branch --no-merged' para achar branches com trabalho ainda em andamento
- ✓Sincronize as branches remotas com frequência com 'git fetch --prune' para remover referências obsoletas
- ✓Considere usar 'git switch' em vez de 'git checkout' para deixar a intenção mais clara ao trocar de branch
- ✓Use '--sort=-committerdate' para ver primeiro as branches com atividade mais recente
- ✓Antes de excluir uma branch com -D, confirme com 'git log branch-name' que você não precisa mais dela
- ✓Mantenha os nomes de branch em minúsculas e com hifens, por consistência e compatibilidade
Erros comuns
- ✗Esperar que 'git branch <name>' troque para a branch nova. Ele só cria a branch - use 'git switch <name>' ou 'git checkout -b <name>' para criar e trocar.
- ✗Tentar excluir a branch atual. Você precisa trocar para outra branch antes de excluir aquela em que está.
- ✗Usar -d em branches não mescladas e perder trabalho. O -d protege você - se quiser mesmo excluir trabalho não mesclado, use -D.
- ✗Esquecer de enviar branches novas para o remoto. Branches locais não são compartilhadas até você rodar 'git push -u origin <branch>'.
- ✗Não limpar branches antigas. Use com frequência 'git branch --merged' para achar e excluir branches já mescladas.
Perguntas frequentes
'git branch <name>' só cria uma branch nova, sem trocar para ela. 'git checkout -b <name>' cria uma branch nova E troca para ela em um só comando. O equivalente moderno é 'git switch -c <name>'.
Use 'git branch -m old-name new-name' para renomear uma branch. Se você está na branch que quer renomear, basta 'git branch -m new-name'. Para branches remotas, você precisa enviar o nome novo e excluir o antigo.
-d é uma exclusão segura que só funciona se a branch estiver totalmente mesclada no upstream dela (ou no HEAD, se não houver upstream). -D é uma exclusão forçada que remove a branch seja qual for o status de merge. Só use -D quando tiver certeza de que quer descartar commits não mesclados.
Use 'git push origin --delete branch-name' ou a sintaxe mais curta 'git push origin :branch-name'. Isso remove a branch do repositório remoto.
Branches de rastreamento remoto (como origin/main) são referências locais que acompanham o estado das branches nos repositórios remotos. Elas são atualizadas no fetch ou no pull e mostram para onde as branches remotas apontam.
Use 'git branch --show-current' para ver só o nome, ou 'git branch' para ver todas as branches com a atual marcada com *. O 'git status' também mostra a branch atual.
O Git não permite excluir a branch em que você está. Troque antes para outra branch com 'git switch other-branch' e depois exclua a branch desejada.
Use 'git branch branch-name commit-hash' para criar uma branch a partir de qualquer commit. O ponto de partida pode ser um hash de commit, uma tag ou outro nome de branch.
A branch upstream (ou de rastreamento) é a branch remota para a qual a sua branch local envia e da qual puxa por padrão. Defina-a com 'git branch -u origin/branch-name' ou 'git push -u origin branch-name'.
Use 'git branch --sort=-committerdate' para listar primeiro as branches com os commits mais recentes. Adicione -v para ver também o hash e a mensagem do commit.