git checkout
Trocar de branch ou restaurar arquivos da árvore de trabalho
O git checkout é um comando versátil que troca de branch, cria branches novas, restaura arquivos de commits específicos e pode deixar o seu repositório no estado “HEAD desanexado” (detached HEAD). Embora versões mais novas do Git tenham dividido parte das funções entre “git switch” e “git restore”, o checkout continua muito usado e conhecido.
Sinopse
git checkout <branch>
git checkout -b <new-branch> [<start-point>]
git checkout -B <branch> [<start-point>]
git checkout --detach [<branch>]
git checkout [--] <pathspec>...
git checkout <commit> -- <pathspec>...Opções
Escolhendo a opção certa
Criar branches
Jeitos diferentes de criar uma branch nova e trocar para ela
| Comando | Se a branch existir | Histórico | Ideal para |
|---|---|---|---|
-b <name> | Falha com erro | Normal (ligada) | Trabalho comum em funcionalidade nova |
-B <name> | Redefinida no commit atual | Normal (ligada) | Recomeçar uma branch do zero |
--orphan <name> | Falha com erro | Nenhum (desligada) | gh-pages, docs, começar do zero |
Trocar de branch com mudanças sem commit
O que acontece com as suas mudanças locais ao trocar de branch
| Comando | Mudanças sem commit | Nível de risco | Quando usar |
|---|---|---|---|
git checkout <branch> | Bloqueado se houver conflito | Seguro | Comportamento padrão - evita acidentes |
git checkout -f <branch> | Descartadas para sempre | Perigoso | Abandonar de propósito todas as mudanças locais |
git checkout -m <branch> | Mescladas por um merge de três vias | Médio | Levar as mudanças para outra branch |
git stash + checkout | Guardadas para depois | Seguro | Troca de contexto temporária |
Restaurar arquivos
Descartar ou restaurar o conteúdo de arquivos a partir de fontes diferentes
| Comando | Origem | Afeta a preparação | Recuperável |
|---|---|---|---|
-- <file> | Índice (versão preparada) | No | Não - mudanças perdidas para sempre |
<commit> -- <file> | Um commit específico | Sim (preparado) | Não - mas preparado para revisão |
-p -- <file> | Índice (interativo) | No | Parcial - escolha os trechos |
Rastreamento de branches remotas
Controlar a relação entre branches locais e remotas
| Comando | Cria rastreamento | Caso de uso | git push/pull |
|---|---|---|---|
--track origin/feat | Sim (automático) | Trabalhar na branch de um colega | Funciona sem argumentos |
--no-track -b exp origin/main | Não (independente) | Experimentar com segurança | Exige indicar o remoto |
<remote-branch> | Sim (se não houver ambiguidade) | Checkout rápido de uma remota | Funciona sem argumentos |
Resolver conflitos de merge
Escolher um lado durante conflitos de merge
| Comando | Mantém | Descarta | Quando usar |
|---|---|---|---|
--ours <file> | A versão da sua branch | Mudanças que chegam | As suas mudanças estão certas |
--theirs <file> | Versão que chega | As suas mudanças | Aceitar a implementação deles |
(manual edit) | Resultado combinado | Nada | Precisa de partes dos dois lados |
checkout e os comandos modernos
O Git 2.23+ dividiu o checkout em comandos específicos
| Comando | Troca de branch | Restaura arquivos | Recomendado para |
|---|---|---|---|
git checkout | Sim | Sim | Costume, versões antigas do Git |
git switch | Sim | No | Intenção clara: só operações de branch |
git restore | No | Sim | Intenção clara: só operações de arquivo |
Exemplos de fluxos de trabalho
git stashGuardar o trabalho atual sem commit
git checkout other-branchTrocar para a outra branch
(review or make quick fix)Fazer o trabalho necessário nesta branch
git checkout -Voltar para a branch anterior (atalho)
git stash popRestaurar o trabalho guardado
git checkout mainTrocar para a branch main
git pull origin mainPegar as mudanças mais recentes do remoto
git checkout -b feature-nameCriar a nova branch de funcionalidade e trocar para ela
(make changes and commits)Trabalhar na funcionalidade
git push -u origin feature-nameEnviar a branch e configurar o rastreamento
git statusVer quais arquivos foram modificados
git diff file.jsRevisar as mudanças que você vai descartar
git checkout -- file.jsDescartar as mudanças de um arquivo específico
git checkout -- .Ou descartar TODAS as mudanças não preparadas dos arquivos rastreados
git log --onelineAchar o hash do commit de que precisa
git checkout <commit-hash>Fazer checkout daquele commit específico (HEAD desanexado)
(inspect, test, or debug)Investigar o código antigo
git checkout mainVoltar para a branch main ao terminar
git log --oneline -- file.jsAchar os commits que mudaram este arquivo
git show <commit>:file.jsPré-visualizar a versão antiga
git checkout <commit> -- file.jsRestaurar o arquivo a partir daquele commit (fica preparado)
git commit -m 'Restore file.js'Fazer commit da versão restaurada
git fetch originBuscar as informações mais recentes das branches remotas
git branch -rVer as branches remotas disponíveis
git checkout --track origin/featureCriar uma branch local rastreando a remota
git pullAgora o pull funciona sem indicar o remoto
Solução de problemas
error: Your local changes to the following files would be overwritten by checkout
Causa: Você tem mudanças sem commit que conflitam com a branch de destino
Faça commit das mudanças, guarde-as com stash ou use -f para forçar (descarta as mudanças)
git stash && git checkout branch && git stash poperror: pathspec 'branch-name' did not match any file(s) known to git
Causa: A branch não existe, ou talvez você tenha digitado o nome errado
Veja as branches disponíveis com git branch -a, ou crie a branch com -b
git branch -a | grep branch-nameYou are in 'detached HEAD' state
Causa: Você fez checkout de um hash de commit ou de uma tag em vez de um nome de branch
Se quiser continuar trabalhando, crie uma branch. Senão, faça checkout de uma branch existente
git checkout -b new-branch-nameCommits feitos com o HEAD desanexado se perdem
Causa: Você fez commits com o HEAD desanexado e depois trocou para outra branch
Encontre os commits pelo reflog e crie uma branch para guardá-los
git reflog && git branch recovered-work <commit-hash>Não é possível fazer checkout: um arquivo não rastreado seria sobrescrito
Causa: Você tem arquivos não rastreados que existem na branch de destino
Exclua, mova ou guarde com stash esses arquivos não rastreados primeiro
git stash --include-untracked && git checkout branchMudanças descartadas sem querer com checkout --
Causa: git checkout -- <file> remove para sempre as mudanças sem commit
Infelizmente, o Git não consegue recuperá-las. Confira o histórico local do seu editor
(check IDE local history if available)fatal: 'name' could be both a local file and a tracking branch
Causa: Um arquivo ou pasta tem o mesmo nome da branch remota da qual você quer fazer checkout
Adicione um -- no final para dizer ao Git que o nome é uma branch, ou use git switch
git checkout branch-name --A branch não atualiza depois do checkout
Causa: Talvez você tenha feito checkout direto de uma branch de rastreamento remoto
Crie uma branch local de rastreamento em vez de fazer checkout direto de origin/branch
git checkout --track origin/branch-nameDicas e armadilhas
Boas práticas
- ✓Use 'git stash' antes de trocar de branch se tiver trabalho sem commit que quer manter
- ✓Prefira 'git checkout -b' a 'git branch' + 'git checkout' separados para criar uma branch e trocar para ela
- ✓Use '--' para separar claramente caminhos de arquivo de nomes de branch: 'git checkout -- file.txt'
- ✓Considere os comandos modernos 'git switch' para branches e 'git restore' para arquivos - a intenção fica mais clara
- ✓Use 'git checkout -' para voltar rápido à branch anterior (como 'cd -')
- ✓Antes de usar '-f' para forçar o checkout, tenha certeza de que quer mesmo descartar as suas mudanças
- ✓Com o HEAD desanexado, crie uma branch logo se pretende fazer commits
- ✓Use '--track' ao fazer checkout de branches remotas para configurar push/pull automaticamente
- ✓Use 'git checkout <commit> -- <file>' para restaurar arquivos específicos sem trocar de branch
- ✓Evite fazer checkout de commits diretamente, a não ser para investigar - use nomes de branch no trabalho normal
- ✓Use '-p' (modo patch) quando quiser descartar só algumas mudanças de um arquivo
- ✓Sempre confira se está na branch certa com 'git branch' ou 'git status' antes de começar a trabalhar
Erros comuns
- ✗Tentar fazer checkout com mudanças sem commit. O Git se recusa a trocar se isso fosse sobrescrever as suas mudanças - faça commit, stash ou use -f para forçar (descarta as mudanças).
- ✗Confundir checkout de branches com checkout de arquivos. Restaurar arquivos sem querer ao tentar trocar de branch - use -- antes dos caminhos: git checkout -- file.txt
- ✗Fazer commits com o HEAD desanexado. Esses commits ficam órfãos quando você faz checkout de outra branch - crie antes uma branch: git checkout -b my-branch
- ✗Usar -B sem entender que ele sobrescreve. Isso pode perder a posição da branch existente - use -b para branches novas, e -B só quando quiser redefinir de propósito.
Perguntas frequentes
'git switch' é um comando mais novo (Git 2.23+) que só troca de branch, o que o torna mais claro e seguro. 'git checkout' pode tanto trocar de branch QUANTO restaurar arquivos, o que pode confundir. Use 'git switch' para branches e 'git restore' para arquivos se preferir a abordagem moderna.
Infelizmente, só com o Git não dá - as mudanças são descartadas para sempre. Algumas IDEs têm histórico local que pode ajudar. Por isso é importante ter cuidado com este comando.
HEAD desanexado (detached) significa que você fez checkout de um commit específico em vez de uma branch. Você pode explorar e fazer commits, mas eles não vão pertencer a nenhuma branch. Crie uma branch com 'git checkout -b name' para guardar o seu trabalho.
'-b' cria uma branch nova e falha se ela já existir. '-B' cria uma branch nova ou redefine uma existente para a posição atual. Use '-B' quando quiser redefinir uma branch de propósito.
Use 'git checkout other-branch -- path/to/file'. Isso copia o arquivo daquela branch para o seu diretório de trabalho e a área de preparação. Depois você pode fazer commit dele na branch atual.
O Git protege você contra perder trabalho. Se trocar de branch fosse sobrescrever as suas mudanças, ele se recusa. Faça commit das mudanças, guarde-as com 'git stash' ou use 'git checkout -f' para forçar (o que descarta as mudanças).
Ele troca para a branch em que você estava antes, como 'cd -' no shell. É um jeito rápido de alternar entre duas branches em que você está trabalhando.
Primeiro faça 'git fetch origin', depois 'git checkout branch-name' (o Git cria automaticamente uma branch de rastreamento se origin/branch-name existir) ou, explicitamente, 'git checkout --track origin/branch-name'.
Sim, use 'git checkout -p <commit> -- <file>' para o modo interativo, ou simplesmente 'git checkout <commit> -- <specific-files>' para restaurar só alguns arquivos daquele commit.
Porque ele faz duas coisas bem diferentes: trocar de branch E restaurar arquivos. O Git 2.23 introduziu 'git switch' e 'git restore' para separar essas funções. O 'git checkout' continua funcionando e é muito usado.