[Git] Você conhece os comandos switch e restore?
Este post é mais um da série sobre Git que estou escrevendo. Os anteriores são:
Aqui no TabNews já tivemos vários posts sobre Git, a maioria listando os comandos básicos com uma breve explicação. E tenho reparado que quase nunca mencionam os comandos git switch
e git restore
.
Ambos foram criados na versão 2.23.0, lançada em 2019 - então eu diria que não são mais tão novos assim. As notas da versão dizem o seguinte:
Two new commands "git switch" and "git restore" are introduced to split "checking out a branch to work on advancing its history" and "checking out paths out of the index and/or a tree-ish to work on advancing the current history" out of the single "git checkout" command.
A ideia básica foi separar as funções "mudar para um branch" e "mudar o estado de um arquivo", que sempre foram feitas por git checkout
. Dependendo dos parâmetros usados em git checkout
, ele pode manipular tanto branches quanto arquivos. Para diminuir um pouco esta confusão, ele foi separado em dois comandos.
O switch
, no caso, é para alternar entre diferentes branches (ou simplesmente "mudar de branch"). Ou seja, se antes fazíamos git checkout branch
para mudar para um branch, agora podemos fazer git switch branch
. Ou ainda git checkout -b branch
para criar o branch e já mudar para ele, agora podemos usar git switch -c branch
para fazer o mesmo.
Mas como já dito, o checkout
acumulava funções. Por exemplo, se eu modifiquei um arquivo e ainda não fiz git add
, eu poderia fazer git checkout arquivo
para que as alterações fossem revertidas e ele voltasse para o estado em que estava no último commit. Já git switch arquivo
dará erro, pois switch
só trabalha com branches. Para trabalhar com arquivos use-se o git restore
, ou seja, bastaria fazer git restore arquivo
para obter o mesmo efeito do checkout
.
Creio que a ideia de separar as funções é para deixar mais claro o que está sendo feito. Se estou mexendo com branches, uso switch
. Se quero só mexer com arquivos, restore
. Ter dois comandos separados, cada um com sua função específica, me parece mais claro do que ter um único comando que pode fazer um ou outro dependendo dos parâmetros.
Aqui tem uma tabela comparativa, que resume bem os principais casos de uso:
Antes | Depois |
---|---|
git checkout <branch> | git switch <branch> |
git checkout | N/A (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> | N/A (use git switch <start-point> e 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>…] |
Mas vale lembrar que - pelo menos hoje enquanto escrevo este post - tanto a documentação do git switch
quanto a do git restore
dizem o seguinte:
THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
Ou seja, por enquanto são comandos experimentais e o comportamento pode mudar em versões futuras. Se bem que já faz 4 anos que está com esse aviso, não sei se os comandos vão sumir de repente. E na própria documentação não há menção sobre alguma possível mudança desse status, então talvez continuem como experimentais por mais um tempo.
De qualquer forma, acredito que o git checkout
não vai deixar de existir tão cedo. Mesmo que o git switch
ou git restore
deixem de ser experimentais, ainda deverá haver um período em que eles coexistirão com checkout
, até por questões de retrocompatibilidade (pense em quantos scripts devem existir por aí que ainda usam checkout
por exemplo).
Vale notar também que no commit que introduziu o comando switch
tem o seguinte comentário:
The good old "git checkout" command is still here and will be until all (or most of users) are sick of it.
Ou seja, não me parece que o git checkout
vai sumir tão cedo. Pode ser que switch
e restore
ganhem mais adesão no futuro, mas só o tempo dirá. Atualmente vejo que ainda são ignorados pela maioria dos tutoriais por aí, mas ainda sim acho importante pelo menos saber que eles existem. Pois se um dia eles passarem a ser mais usados, vc não será pego de surpresa.
Leitura adicional:
- Qual a diferença entre "git switch" e "git checkout"? — A maior parte deste post foi baseada na resposta que está no link, com a devida permissão do autor - que no caso sou eu mesmo :-)
- What is the
git restore
command and what is the difference betweengit restore
andgit reset
?