git checkout
Informações sobre o comando git checkout, seu uso e a relação entre git checkout e git branch. Veja exemplos.
O que o git checkout faz
git checkout é um dos comandos mais versáteis do Git. Ele realiza dois trabalhos distintos:
- Trocar de branch — move o
HEADpara apontar para outro branch e atualiza os arquivos no seu diretório de trabalho para corresponder ao último commit daquele branch. - Restaurar arquivos — sobrescreve arquivos no seu diretório de trabalho (ou na área de staging) com uma versão de um commit, branch ou do índice.
HEAD é o ponteiro do Git para "onde você está agora" — normalmente a ponta do branch que você tem com checkout feito. Quando você executa git checkout, o Git move o HEAD e reescreve os seus arquivos rastreados para que a árvore de trabalho reflita o destino.
Como o comando é sobrecarregado, o Git moderno (2.23+) dividiu seus dois papéis em dois comandos mais claros: git switch para mover entre branches e git restore para descartar alterações em arquivos. O git checkout ainda funciona exatamente como antes e é mostrado ao longo desta página, com os equivalentes modernos indicados onde forem úteis.
Esta página aborda como fazer checkout de branches existentes e novos, trabalhar com branches remotos, restaurar arquivos e o estado de "HEAD desanexado".
Fazendo checkout de um branch existente
Se um repositório já contém vários branches, git checkout <branch> alterna para um deles. Execute git branch primeiro para listar os branches disponíveis; o branch atual é marcado com um asterisco:
Listando branches e alternando para um
$ git branch
* master
test_branch
feature_branch
$ git checkout feature_branch
Switched to branch 'feature_branch'Após a troca, seu diretório de trabalho corresponde ao último commit em feature_branch, e quaisquer novos commits que você criar serão registrados lá. O equivalente moderno é git switch feature_branch.
O Git recusa a troca se você tiver alterações não confirmadas que seriam sobrescritas pelo branch de destino. Nesse caso, confirme-as, guarde-as com stash ou descarte-as primeiro.
Criando e fazendo checkout de um novo branch
Para criar um branch e alternar para ele em uma única etapa, use o sinalizador -b:
git checkout -b
git checkout -b new_branchO sinalizador -b instrui o Git a executar git branch new_branch (criar o branch a partir do HEAD atual) e depois imediatamente git checkout new_branch. É equivalente a:
git branch new_branch
git checkout new_branchPor padrão, o novo branch começa a partir do seu HEAD atual. Para baseá-lo em um branch ou commit diferente, especifique um ponto de partida:
git checkout -b a partir de um ponto de partida específico
git checkout -b new_branch existing_branchAqui, new_branch é criado na ponta de existing_branch em vez de no HEAD atual. O equivalente moderno é git switch -c new_branch existing_branch.
Trocando de branch e HEAD
Executar git checkout <branch> aponta o HEAD para a ponta daquele branch:
git checkout mainSe você trocar por engano ou perder o controle de onde o HEAD esteve, o comando git reflog lista cada posição que o HEAD ocupou, para que você possa retornar a um estado anterior.
Fazendo checkout de um branch remoto
Quando você trabalha em equipe, o repositório remoto contém branches que outras pessoas enviaram. Para vê-los e fazer checkout deles, primeiro baixe os dados remotos mais recentes com git fetch:
git fetch --allO Git moderno pode então fazer checkout de um branch remoto pelo seu nome abreviado. O Git cria automaticamente um branch local que rastreia o branch remoto correspondente:
git checkout feature_branchIsso funciona somente quando exatamente um remoto tem um branch com esse nome. Se o nome for ambíguo, ou se você quiser ser explícito, crie um branch local de rastreamento a partir da referência de rastreamento remoto:
Criando um branch local a partir de um remoto
git checkout -b feature_branch origin/feature_branchO sinalizador -b é necessário aqui — o novo branch local feature_branch é criado e configurado para rastrear origin/feature_branch. Para forçar um branch local existente a corresponder exatamente à ponta do remoto, use git reset:
git reset --hard origin/feature_branchgit reset --hard descarta commits locais e alterações não confirmadas naquele branch, portanto use-o apenas quando tiver a intenção de descartar o trabalho local.
Restaurando arquivos com git checkout
Além de trocar de branch, git checkout pode substituir arquivos na sua árvore de trabalho por uma versão do índice ou de outro commit.
Descarte alterações não confirmadas em um único arquivo e restaure a versão do último commit:
Descartar alterações em um arquivo
git checkout -- file.txtO -- separa as opções do comando do caminho do arquivo, o que evita ambiguidade quando um arquivo e um branch têm o mesmo nome. O equivalente moderno é git restore file.txt.
Restaure um arquivo como ele existia em um commit ou branch específico, sem trocar de branch:
Restaurar um arquivo de outro commit
git checkout <commit> -- file.txtIsso atualiza file.txt no seu diretório de trabalho e na área de staging para o seu conteúdo em <commit>, enquanto o HEAD permanece no seu branch atual. Consulte git restore para a sintaxe moderna mais clara.
Estado de HEAD desanexado
Fazer checkout de um commit específico (em vez de um branch) coloca você em um estado de HEAD desanexado:
git checkout a1b2c3dNormalmente, HEAD aponta para um branch, que por sua vez aponta para um commit. Quando você faz checkout de um commit diretamente, HEAD aponta diretamente para aquele commit sem nenhum branch anexado — é isso que "desanexado" significa. É útil para examinar ou testar um estado antigo do projeto.

O risco é que quaisquer commits que você fizer neste estado não estão em um branch. Assim que você fizer checkout de outro branch, esses commits não terão nenhuma referência apontando para eles e se tornarão difíceis de encontrar (o Git eventualmente irá coletá-los como lixo). Se você decidir manter o trabalho feito em um HEAD desanexado, crie um branch antes de sair:
git switch -c new_branchPortanto: examinar um commit antigo em um HEAD desanexado é perfeitamente seguro, mas faça qualquer desenvolvimento novo em um branch real para que seus commits permaneçam acessíveis. O git reflog ainda pode ajudá-lo a recuperar commits caso você esqueça.