Fabrizio Feitosa

Fabrizio Feitosa

Exploro o universo do desenvolvimento com artigos, tutoriais e reflexões sobre tecnologia — compartilhando aprendizados reais e dicas práticas do dia a dia.


Voltar

Como excluir todas as branches locais, exceto a atual?

Aprenda a remover com segurança as branches locais que não está usando e manter apenas a branch atual.

Publicado em
Tempo de leitura
3 min de leitura

Ao executar git branch no repositório local, é comum encontrar branches de trabalhos já concluídos. Este comando ajuda a limpar as branches locais e preservar apenas aquela em que você está.

O comando

Em repositórios novos, a branch principal costuma se chamar main. Ainda assim, em vez de depender desse nome, o comando abaixo identifica e preserva automaticamente a branch atual:

current_branch=$(git branch --show-current)
 
if [ -z "$current_branch" ]; then
  echo "Faça checkout de uma branch antes de continuar."
  exit 1
fi
 
git branch --format="%(refname:short)" |
  while IFS= read -r branch; do
    [ "$branch" = "$current_branch" ] || git branch -d "$branch"
  done

O comando funciona no Git Bash, no macOS e em terminais Bash/Linux. Ele não altera branches remotas, como origin/main.

Se você realmente precisar apagar branches que ainda não foram integradas, troque git branch -d "$branch" por git branch -D "$branch" depois de conferir o que será removido.

Atalho de uma linha para manter a main

Se você está na main e quer manter somente ela, o atalho continua muito prático:

git branch --format="%(refname:short)" | grep -vx "main" | xargs git branch -D

Ele é a versão atualizada do conhecido git branch | grep -v "main" | xargs git branch -D: remove todas as branches locais, exceto main, em uma linha. Use-o apenas quando a branch que deve sobreviver for realmente a main e você estiver nela.

O --format e o grep -x fazem a comparação pelo nome completo. Assim, uma branch como feature/main-layout não fica preservada por acidente. Como -D força a exclusão de branches não integradas, você pode trocar por -d para uma limpeza conservadora.

Confira antes de apagar

Para listar as branches que seriam removidas, sem apagar nada, execute:

current_branch=$(git branch --show-current)
git branch --format="%(refname:short)" |
  while IFS= read -r branch; do
    [ "$branch" = "$current_branch" ] || echo "$branch"
  done

Por exemplo, se você estiver em main, a listagem poderá ser:

feature/login
fix/menu-mobile

Entendendo o comando

git branch --show-current

Retorna o nome da branch atual, por exemplo, main. Em um estado de HEAD destacado (detached HEAD), ele não retorna nada; por isso o script interrompe a execução nesse caso, evitando uma limpeza acidental.

git branch --format="%(refname:short)"

Lista os nomes das branches locais sem o asterisco que identifica a branch atual na saída normal de git branch. Isso torna a comparação precisa, inclusive para nomes como main, feature/main-layout e maintenance.

O loop while

O loop lê cada branch e executa a remoção somente quando o nome é diferente de current_branch. Assim, ele preserva exatamente a branch atual, independentemente de ela se chamar main ou ter outro nome.

git branch -d e git branch -D

  • git branch -d <nome>: remove uma branch apenas quando ela já foi integrada à branch atual ou à sua upstream.
  • git branch -D <nome>: força a remoção, mesmo sem integração. Commits que ficarem sem referência podem ser mais difíceis de recuperar depois que o reflog expirar.

PowerShell

No PowerShell, use o equivalente abaixo. Permaneça na branch que deseja manter — normalmente, main:

$currentBranch = git branch --show-current
 
if (-not $currentBranch) {
  throw "Faça checkout de uma branch antes de continuar."
}
 
git branch --format="%(refname:short)" |
  Where-Object { $_ -ne $currentBranch } |
  ForEach-Object { git branch -d $_ }

Para forçar a remoção de branches não integradas no PowerShell, substitua git branch -d $_ por git branch -D $_ somente após revisar a lista.

Isso é tudo! 😊

Referências: documentação oficial do git branch.