Última chance! Formação ilimitada com 50% de desconto
A promoção termina em
Por muito tempo, o git checkout cuidou de quase tudo relacionado a navegação no repositório, troca de branches, restauração de arquivos e inspeção de commits antigos. Essa flexibilidade gerava ambiguidade. A mesma sintaxe podia significar coisas diferentes dependendo do contexto.
Um pequeno erro de digitação podia trocar de branch quando você queria restaurar um arquivo. Um check rápido no histórico com git checkout <commit-hash> podia te deixar em um estado de HEAD destacado sem você perceber. O comando funcionava, mas exigia atenção constante aos seus múltiplos comportamentos.
Foi aí que o Git 2.23 introduziu o git switch, um comando mais especializado para lidar com operações de branch.
Neste guia, vou mostrar como o git switch é diferente do git checkout. Também vamos ver onde cada comando se encaixa nos fluxos de trabalho modernos e entender seus escopos.
Se Git ainda é relativamente novo para você, recomendo aprender o básico no nosso curso Introduction to Git.
git switch é um comando dedicado, introduzido no Git 2.23, para gerenciar navegação e criação de branches. Ele torna a movimentação entre branches mais limpa, segura e menos propensa a erros.
Antes dele, os desenvolvedores usavam git checkout para trocar de branch. O problema era que o git checkout acumulava várias tarefas não relacionadas:
Isso deixava o comando sobrecarregado e fácil de usar de forma equivocada.
O Git resolveu isso dividindo responsabilidades. O git switch agora cuida da troca e criação de branches, e o git restore cuida da restauração de arquivos. Essa separação reduz a ambiguidade e diminui o risco de alterações acidentais em arquivos.
Na prática, git switch branch-name move o ponteiro HEAD atual para a branch informada. Você também pode usar git switch -c new-branch para criar e já alternar para uma nova branch.
Agora que você entendeu por que o git switch foi criado, vamos ver como ele realmente difere do git checkout por baixo dos panos.
Antes do Git 2.23, o git checkout fazia tanto navegação de branches quanto restauração de arquivos. Essa abordagem funcionava, mas misturava dois conceitos fundamentalmente diferentes. Ele move o HEAD, restaura arquivos e faz checkout de commits. Dependendo do uso, manipula o ponteiro HEAD, o index e a working tree.

O git switch foca exclusivamente em mover o ponteiro HEAD entre branches. Quando você roda git switch branch-name, o Git atualiza o HEAD para apontar para aquela branch e ajusta o diretório de trabalho para combiná-la. Esse comando existe especificamente para navegação e criação de branches. Com git switch e git restore, as responsabilidades ficam bem divididas:
git switch move o HEAD entre branches.
git restore modifica arquivos na working tree ou no index.
Por exemplo, restaurar um arquivo antes exigia: git checkout HEAD -- file.txt. Hoje, a abordagem recomendada é: git restore file.txt.
Aqui, você está restaurando um arquivo, não navegando entre branches. Em scripts e na documentação do time, essa distinção melhora a legibilidade e reduz erros.
O Git 2.23 separou responsabilidades ao introduzir o git switch para operações com branches e o git restore para restauração de arquivos.
Antes dessa versão, o git checkout funcionava como uma ferramenta multiuso. Ele podia trocar de branch, restaurar arquivos ou ir para commits arbitrários. Porém, isso gerava confusão, especialmente para iniciantes. Ao dividir o comando, o Git reduziu a ambiguidade e deixou os fluxos mais claros.
No Git, o HEAD normalmente aponta para uma branch. Essa branch, por sua vez, aponta para o commit mais recente. Quando você cria um novo commit, o Git move a branch para frente. Esse é o fluxo padrão.
Um HEAD destacado acontece quando o HEAD aponta diretamente para um commit em vez de uma branch. Nesse estado, você não está em nenhuma branch. Se fizer um novo commit, o Git o cria, mas nenhuma branch o referencia. A menos que você crie explicitamente uma branch, esses commits ficam sem referência e podem ser difíceis de localizar depois.

Quando você executa git checkout <commit-hash>, o Git automaticamente entra no modo de HEAD destacado. Ele muda para aquele commit e destaca o HEAD sem pedir confirmação extra. Esse comportamento é válido, mas facilita entrar nesse modo sem querer.
Já o git switch exige menção explícita. Para destacar o HEAD, você precisa usar git switch --detach <commit-hash>. Sem a flag --detach, o git switch atua apenas em branches. Esse design reduz estados destacados acidentais e torna o trabalho com branches mais seguro e previsível.
Agora que cobrimos as diferenças de alto nível, vamos ver sintaxe, escopo e pontos de segurança.
Para criar e já alternar para uma nova branch com git switch, use git switch -c <branch-name>. No git checkout, o equivalente é git checkout -b <branch-name>.
Ambos criam uma nova branch e trocam para ela, mas a diferença está na clareza de intenção. No git switch, a flag -c deixa claro que você está criando uma branch, enquanto no git checkout, -b historicamente significa "branch", mas comunica menos a intenção.
O git switch também traz a flag -C: git switch -C <branch-name>. Ela é mais forte que -c: cria a branch à força ou a reseta se já existir. Esse comportamento é explícito e focado em branch. No git checkout, existe algo semelhante, mas a semântica é menos separada porque o comando serve a vários propósitos.
git switch funciona somente com branches. Ele não restaura arquivos, não tira mudanças do stage e não faz checkout de caminhos específicos de commits anteriores. Basicamente, ele não suporta operações no nível de arquivo.
Em contraste, o git checkout pode atuar no nível de arquivo. Por exemplo, git checkout <commit> -- <file> restaura um arquivo específico de um commit passado.
Porém, a documentação moderna do Git sugere usar git restore para isso. O ponto-chave é que o git switch deliberadamente exclui manipulação de arquivos para manter seu escopo enxuto e previsível.
Um problema comum do git checkout é a ambiguidade. Se um nome de branch e um nome de arquivo forem idênticos, dependendo do contexto, ele pode trocar de branch ou restaurar um arquivo. O git switch evita totalmente essa ambiguidade. Ele só opera em branches. Se você não informar um nome de branch válido, o Git falha de forma clara em vez de tentar adivinhar.
git switch também fornece mensagens de erro mais claras quando mudanças locais conflitam com a branch de destino. Se a troca de branch sobrescreveria trabalho não commitado, o Git interrompe a operação e exibe mensagens diretas, como:
Se a branch não existe: fatal: invalid reference: feature/login
Se mudanças locais seriam sobrescritas: error: Your local changes to the following files would be overwritten by checkout
Se a branch já existe ao usar -c: fatal: a branch named 'feature/login' already exists
Mensagens claras como essas reduzem mudanças de estado acidentais.
Entender o git switch fica muito mais fácil quando você o vê em fluxos reais. Estes exemplos mostram como ele se comporta no dia a dia do gerenciamento de branches e por que ele é mais seguro e previsível do que o git checkout.
No desenvolvimento diário, você basicamente alterna entre branches ou cria novas.
Para mudar para uma branch local existente, use: git switch <branch_name>. Aqui, o Git move o HEAD para a branch informada e atualiza seu diretório de trabalho para refletir essa branch.
Para criar uma nova branch para a feature "new_ui" e já alternar para ela em um passo, use git switch -c feature/new-ui. Isso cria a branch a partir do seu commit atual e move o HEAD para ela imediatamente.
Se você precisa resetar ou sobrescrever uma branch existente, use: git switch -C feature/new-ui. O -C maiúsculo força a criação ou reseta o ponteiro da branch. Isso deixa a intenção destrutiva explícita.
Você também pode alternar rapidamente entre suas duas últimas branches com git switch -. Isso é muito útil ao revisar código em uma branch e voltar repetidamente para a sua branch de feature.

Muitas vezes, uma branch existe no remoto, mas não localmente. Por exemplo, alguém faz push de origin/bugfix, mas você ainda não a criou.
Se você rodar: git switch bugfix, o Git criará uma branch local bugfix e a configurará para rastrear a branch remota origin/bugfix, assumindo que haja correspondência clara no origin. Isso simplifica a colaboração porque você não precisa definir o upstream manualmente.
Se quiser impedir que o Git adivinhe, use: git switch --no-guess bugfix. Agora o Git falha se a branch não existir localmente. Isso é útil em fluxos mais rígidos, onde o rastreamento automático poderia gerar confusão.
Se preferir ser explícito ao criar uma branch de rastreamento, use git switch -c bugfix --track origin/bugfix. Isso deixa a relação de tracking clara no próprio comando.
Às vezes você só quer olhar um commit antigo. Talvez queira testar uma versão anterior ou verificar quando um bug foi introduzido. Nesse caso, você quer ir temporariamente para aquele ponto no histórico.
Com o git switch, você precisa dizer isso explicitamente: git switch --detach <commit-hash>.
A flag --detach diz ao Git: mova o HEAD diretamente para este commit, não para uma branch. Agora você pode explorar o código, rodar testes ou buildar o projeto. Se fizer novos commits nesse estado, eles não ficam ligados a nenhuma branch, a menos que você crie uma.
Com git checkout <commit-hash>, a mesma ação acontece automaticamente, sem flag extra. Isso facilita entrar em modo destacado sem querer, enquanto exigir --detach no git switch evita estados de HEAD destacado acidentais.
Agora, vamos ver como integrar o git switch em fluxos típicos do Git.
Em fluxos modernos de desenvolvimento, o git switch deve lidar com todo o trabalho relacionado a branches. Isso inclui
Como o git switch foca apenas em gerenciamento de branches, ele comunica a intenção com clareza.
git checkout ainda tem seu papel, mas menor agora. Automação legada escrita antes do Git 2.23 costuma depender dele. Algumas tarefas de reversão no nível de arquivo também podem usá-lo, embora o git restore seja o substituto preferido daqui em diante.
Há dois cenários distintos que podem causar problema ao usar o git switch.
Um erro comum ao tentar trocar de branch com mudanças locais presentes é “error: Your local changes would be overwritten”. Aqui, o Git bloqueia a operação porque a troca sobrescreveria trabalho não commitado. Você tem duas opções seguras para contornar isso:
Se quiser manter as mudanças para depois, rode git stash antes de trocar para a branch de destino. Depois de trocar, você pode restaurá-las com git stash pop.
Se quiser descartar as mudanças locais de propósito, use: git switch --discard-changes target-branch. Essa opção diz ao Git para descartar as mudanças locais e resetar o index e a working tree para combinar com a branch de destino (não remove arquivos não rastreados).
Outro cenário é entrar acidentalmente em um estado de HEAD destacado. Se você perceber que não está em uma branch, mas tem trabalho que quer manter, crie uma nova branch imediatamente: git switch -c recovery-branch. Isso anexa seu histórico de commits atual a uma branch nomeada e preserva suas mudanças.
Adotar o git switch não é só uma preferência de comando. É uma pequena melhoria estrutural na forma como os times pensam os fluxos de trabalho com Git. Os benefícios se acumulam quando a adoção é consistente na documentação, onboarding e automação.
Comece pela documentação interna. Se seus guias de “primeiros passos” ainda ensinam git checkout para trocar de branch, atualize para git switch. Mantenha o checkout apenas onde ele for realmente necessário.
O treinamento também ajuda. Comandos modernos do Git oferecem mensagens de erro mais claras, especialmente quando mudanças locais conflitam com a troca de branch. Incentive desenvolvedores a ler e entender essas mensagens em vez de tratá-las como falhas genéricas. O conjunto mais novo de comandos é mais explícito, e reconhecer isso aumenta a confiança e reduz erros.
Em scripts shell, pipelines de CI e aliases do Git, prefira git switch para navegação entre branches, pois comunica a intenção de imediato. Um script que usa git switch main é mais fácil de interpretar do que um que depende de git checkout, que pode ter vários significados.
Se você define aliases do Git, atualize-os para refletir o uso moderno. Por exemplo, um alias para criar branches de feature deve encapsular git switch -c, não git checkout -b.
Por fim, verifique as versões do Git em todos os ambientes. git switch requer Git 2.23 ou superior. Garanta que as máquinas dos desenvolvedores, os runners de CI e os servidores de build atendam a esse requisito antes de padronizar o novo comando. Uma checagem simples de versão evita problemas sutis de compatibilidade.
Olhando o quadro geral, a grande vantagem do git switch é simples: ele torna o gerenciamento de branches mais claro, seguro e intencional. Quando você roda o comando, não há ambiguidade sobre o que está acontecendo. Você está trocando de branch. Só isso. E esse grau de clareza tira uma quantidade surpreendente de atrito do desenvolvimento do dia a dia.
No entanto, o git checkout não foi descontinuado; você ainda pode usá-lo para restaurar arquivos, alternar entre branches ou lidar com cenários mais complexos. Mas, para a navegação diária entre branches, o Git recomenda usar o git switch.
Como próximo passo, recomendo o nosso curso Intermediate Git, focado em colaboração com Git.
Não. O git switch é uma alternativa moderna ao git checkout, mas apenas para operações relacionadas a branches. O git checkout ainda funciona e continua disponível, especialmente em fluxos antigos e scripts legados. Contudo, para trocar e criar branches, o git switch é o comando moderno recomendado.
Não. O git switch foi introduzido no Git 2.23. Se você trabalha em ambientes com versões mais antigas, o comando não estará disponível. Sempre verifique sua versão do Git antes de padronizá-la em automações ou documentações.
Não. O git switch lida apenas com operações de branch. Para restaurar arquivos, use o git restore, que substitui a funcionalidade relacionada a arquivos anteriormente feita pelo git checkout.
O Git mantém o git checkout por compatibilidade retroativa. Muitos scripts, tutoriais e fluxos antigos dependem dele. No entanto, o Git moderno incentiva o uso de git switch e git restore para uma separação mais clara de responsabilidades.
Srujana é redatora freelancer de tecnologia e tem um diploma de quatro anos em Ciência da Computação. Escrever sobre vários tópicos, incluindo ciência de dados, computação em nuvem, desenvolvimento, programação, segurança e muitos outros, é algo natural para ela. Ela gosta de literatura clássica e de explorar novos destinos.
Cursos de Git
Curso
Curso
Curso

blog
Summer Worsley
14 min
Tutorial
Olivia Smith
13 min
Tutorial
Abid Ali Awan
9 min
Tutorial
Tutorial
Tutorial