Executando verificação de segurança...
12

[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:

AntesDepois
git checkout <branch>git switch <branch>
git checkoutN/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:

Carregando publicação patrocinada...
2

Fascinante observar a evolução do Git ao longo do tempo. A introdução dos comandos git switch e git restore representa uma tentativa clara de aprimorar a usabilidade e a clareza.

A separação das funcionalidades anteriormente abrangidas pelo pai de todos, onipresente git checkout é uma mudança bem-vinda. A ideia de ter comandos distintos para mudar entre branches (git switch) e para manipular o estado de arquivos (git restore)ajuda demais a entender o que está sendo executado em cada operação.

A tabelinha é uma boa pra nós desenvolvedores nos adaptarmos à nova sintaxe. A transição do antigo git checkout para o novo git switch é intuitiva e reflete a intenção por trás da mudança.

mas lembrando é bom notar o status "experimental" desses comandos, como indicado na documentação. A advertência de que "O COMANDO É EXPERIMENTAL. O COMPORTAMENTO PODE MUDAR" destaca a importância de monitorar as atualizações futuras do Git. A incerteza sobre o futuro dos comandos git switch e git restore pode fazer com que muitos desenvolvedores hesitem em integrá-los totalmente em seus fluxos de trabalho, e acho que é por isso que poucos tutoriais e dicas sobre o git não comentam sobre eles.

embora os comandos git switch e git restore possam não ter conquistado a grande maioria dos devs até o momento, é massa a conscientização sobre sua existência. O futuro dirá se esses comandos experimentais se tornarão a norma, mas qualquer ocisa tem o TabNews pra atualizar a gente <3

2

Muito bacana esse artigo sobre os comandos, acho essas atualizações no Git super relevantes. Separar as funções do git checkout em comandos mais específicos parece uma mudança positiva, facilitando nosso trabalho no dia a dia. Vou começar a aplicar esses comandos nos meus projetos para ver como funcionam na prática. Muito bom conteúdo!

1