Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIniciantecódigo testado

git branch e git switch: criar, trocar e apagar branches

Branch é um ponteiro de 40 caracteres, não uma cópia da pasta. Como criar, trocar, listar e apagar — e como sair de um detached HEAD sem perder commit.

Rodolfo Mori4 min de leitura

Uma branch é um nome que aponta para um commit e avança quando você cria outro commit nela. Ela permite desenvolver uma busca sem colocar trabalho incompleto na main. git switch troca a branch atual; git branch lista, cria, renomeia e apaga referências.

No sandbox, main começou num commit real. O arquivo da referência contém o hash completo:

bash
cat .git/refs/heads/main
1667072aad5121786854001e291ff25f1a86a675

O ponteiro é menor que uma cópia da pasta

Criar uma branch não duplica o catálogo. O Git escreve uma referência com o mesmo hash e aponta HEAD para ela. Pense num marcador de página: duas pessoas podem colocar marcadores no mesmo capítulo e depois avançar para capítulos diferentes. O limite é que branches formam um grafo de commits, não páginas lineares de um único livro.

Antes da troca, HEAD era uma referência simbólica:

bash
cat .git/HEAD
ref: refs/heads/main

O conteúdo não é um arquivo de configuração para editar na mão. Ele serve para provar o mecanismo. Use comandos de alto nível para mover referências.

Crie e entre com switch menos c

-c cria e troca numa operação. O nome feat/busca comunica intenção e agrupa visualmente branches da mesma categoria:

bash
git switch -c feat/busca
git branch -vv
Switched to a new branch 'feat/busca' * feat/busca 1667072 feat: cria catálogo main 1667072 feat: cria catálogo

O asterisco marca a branch atual. As duas apontam para 1667072 porque nenhum commit novo aconteceu. Depois que a busca ganhar um commit, apenas feat/busca avança.

bash
cat .git/HEAD
ref: refs/heads/feat/busca

Switch separa troca de restauração

Historicamente, git checkout faz vários trabalhos: troca branch, entra em commit e restaura arquivo. switch foi criado para a navegação; restore, para arquivos. Checkout continua válido e aparece em projetos antigos, mas os nomes específicos deixam a intenção mais legível para quem começa.

bash
git switch main
git switch feat/busca
Switched to branch 'main' Switched to branch 'feat/busca'

Se há alteração não commitada que seria sobrescrita, a troca é recusada. Não use force automaticamente. Faça commit coerente, guarde com stash ou descarte de forma consciente. A lição de git stash mostra o caso de uma urgência legítima.

Branch vv mostra vínculo e posição

Com um remote configurado, -vv exibe upstream e distância. Sem remote, ainda mostra hash e assunto:

bash
git branch -vv
* feat/busca 1667072 feat: cria catálogo main 1667072 feat: cria catálogo

Não conclua que branches são iguais apenas porque o assunto é igual. Compare os hashes e use git log --graph --all. O nome é móvel; o hash identifica o commit naquele instante.

Nomes também formam uma linguagem de equipe. feat/busca, fix/frete e docs/instalacao ajudam a reconhecer intenção, mas não substituem a mensagem do commit nem a descrição do pull request. Evite colocar nome de pessoa como única informação: a tarefa precisa continuar compreensível quando outra pessoa assume. Antes de criar, atualize a base combinada pelo time; uma branch nascida de uma main antiga começa com conflito e revisão desnecessários.

Branch local e branch remota não são o mesmo ponteiro. origin/main é a última observação local da referência que mora no remote. Um git fetch atualiza essa observação; git switch main não busca rede. Essa distinção explica por que a lista pode mostrar sua main atrás do upstream mesmo depois de trocar para ela. Leia git branch -vv e o grafo antes de decidir entre merge, rebase ou apenas um novo fetch.

Detached HEAD é um commit sem branch atual

Ao entrar diretamente no hash, HEAD deixa de apontar para um nome:

bash
git switch --detach HEAD
git status --short --branch
HEAD is now at 1667072 feat: cria catálogo ## HEAD (no branch)

Inspecionar é seguro. O risco aparece ao criar um commit e sair sem dar nome a ele. O teste adicionou um livro e commitou:

bash
git commit -m "feat: adiciona Refatoração"
[detached HEAD b1c2cc5] feat: adiciona Refatoração 1 file changed, 1 insertion(+)

Ao voltar, o Git avisou que o commit ficaria sem branch:

bash
git switch feat/busca
Warning: you are leaving 1 commit behind, not connected to any of your branches:

b1c2cc5 feat: adiciona Refatoração

Switched to branch ‘feat/busca’

O hash do aviso é a saída de emergência. Crie uma branch apontando para ele:

bash
git branch recupera-refatoracao b1c2cc5bd48a3055dc6634ef6e07016581425dcf
git branch -vv
* feat/busca 1667072 feat: cria catálogo main 1667072 feat: cria catálogo recupera-refatoracao b1c2cc5 feat: adiciona Refatoração

O reflog e os comandos de desfazer também ajudam quando o aviso já sumiu, desde que o commit ainda exista no armazenamento.

Apague com d antes de considerar D

git branch -d recusa uma branch não integrada. O teste protegeu feat/abandono:

bash
git branch -d feat/abandono
error: the branch 'feat/abandono' is not fully merged hint: If you are sure you want to delete it, run 'git branch -D feat/abandono'

-D força a remoção da referência. Ele não deve ser a resposta padrão ao aviso. Confirme se o commit está em outra branch, tag ou remote e se o trabalho é realmente descartável. No sandbox, a exclusão consciente respondeu:

bash
git branch -D feat/abandono
Deleted branch feat/abandono (was 0efd951).

Sua missão é criar uma branch de tarefa, fazer um commit nela, voltar à main e desenhar os dois ponteiros. Depois entre em detached HEAD num commit antigo e saia sem criar trabalho. Termine quando o merge de branches parecer a reunião de duas linhas do grafo, e não a cópia de duas pastas. A lição de rebase vem depois, quando a diferença entre mover uma referência e recriar commits já estiver clara.

  • git
  • branch
  • switch
  • checkout
  • detached head

Perguntas frequentes

branch duplica todos os arquivos do projeto?
Não. A branch é uma referência para um commit. A working tree é atualizada ao trocar de referência, e objetos iguais são reaproveitados no banco do Git.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em git version 2.54.0 (Apple Git-156) no macOS 27, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. Git — git branch — git-scm.com
  2. Git — git switch — git-scm.com

Continue por aqui