Vale lembrar que a partir da versão 2.23.0 do Git (agosto de 2019), foram criados os comandos switch
e restore
, que servem para substituir algumas funções do git checkout
(e também do git reset
, entre outros). Embora a documentação diga que ainda são experimentais e podem mudar no futuro, fica aqui como referência.
DESFAZENDO ALTERAÇÃO LOCAL (WORKING DIRECTORY)
Este comando deve ser utilizado quando o arquivo ainda não foi adicionado na staged area.
Em vez de:
git checkout -- meu_arquivo.txt
Podemos usar:
git restore meu_arquivo.txt
DESFAZENDO ALTERAÇÃO LOCAL (STAGING AREA)
Este comando deve ser utilizado quando o arquivo já foi adicionado na staged area.
Em vez de:
git reset HEAD meu_arquivo.txt
Podemos usar:
git restore --staged meu_arquivo.txt
TROCANDO PARA UM BRANCH EXISTENTE
Em vez de:
git checkout bug-123
Podemos usar:
git switch bug-123
Da mesma forma, para voltar ao branch principal, basta fazer git switch main
.
CRIAR UM NOVO BRANCH E TROCAR
Em vez de:
git checkout -b bug-456
Podemos usar:
git switch -c bug-456
BAIXAR UM BRANCH REMOTO PARA EDIÇÃO
Em vez de:
git checkout -b bug-123 origin/bug-123
Podemos usar:
git switch -c bug-123 origin/bug-123
Enfim, a ideia básica é que o git checkout
fazia muitas coisas (ora trabalhava com branches, ora com arquivos, dependendo dos argumentos que vc usa) e isso acabava tornando-o confuso. Por isso as responsabilidades foram separadas em dois comandos: switch
trabalha apenas com branches e restore
apenas com arquivos.
Claro que o checkout
ainda vai continuar existindo por um bom tempo e é bom saber usá-lo. Mas também é importante saber que os comandos novos existem (há quase 4 anos, e é incrível que a maioria dos tutoriais ainda os ignoram).
Para mais informações:
- Git: Os novos comandos git restore e git switch
- What is the difference between "git checkout" vs. "git restore" for reverting uncommitted file changes?
- What's the difference between git switch and git checkout branch
Inclusive, no último link acima tem uma tabela que resume os principais casos de uso:
Antes | Depois |
---|---|
git checkout <branch> | git switch <branch> |
git checkout | não tem equivalente direto (use git status ) |
git checkout -b <new_branch> [<start_point>] | git switch -c <new-branch> [<start-point>] |
git checkout -B <new_branch> [<start_point>] | git switch -C <new-branch> [<start-point>] |
git checkout --orphan <new_branch> | git switch --orphan <new-branch> |
git checkout --orphan <new_branch> <start_point> | git switch <start-point> e depois git switch --orphan <new-branch> |
git checkout [--detach] <commit> | git switch --detach <commit> |
git checkout --detach [<branch>] | git switch --detach [<branch>] |
git checkout [--] <pathspec>… | git restore [--] <pathspec>… |
git checkout --pathspec-from-file=<file> | git restore --pathspec-from-file=<file> |
git checkout <tree-ish> [--] <pathspec>… | git restore -s <tree> [--] <pathspec>… |
git checkout <tree-ish> --pathspec-from-file=<file> | git restore -s <tree> --pathspec-from-file=<file> |
git checkout -p [<tree-ish>] [--] [<pathspec>…] | git restore -p [-s <tree>] [--] [<pathspec>…] |