Há pouco tempo na empresa em que trabalho, estava atuando em uma tarefa em uma branch e surgiu a necessidade de ter que verificar um código de outra branch de um colega de squad. Porém, eu ainda não tinha finalizado meu trabalho e nem tinha feito os commits necessários. Normalmente, nessas situações, eu sempre utilizei o git stash ou até mesmo optei por fazer um commit do tipo git commit -m "chore: wip"
para não perder minhas alterações.
O problema é que ao retornar para minha branch, tenho que pegar de volta tudo que coloquei no stash ou reverter o commit wip para a área de staging e continuar meu trabalho. Porém, navegando pela internet em busca de outras soluções para esses cenários, acabei encontrando o git worktree
e passei a utilizá-lo nos cenários em que preciso atuar em branches diferentes.
Caso queira se aprofundar mais sobre o git worktree, recomendo olhar a documentação.
Porque eu passei a utilizar o git worktree e recomendo que você faça o mesmo?
Justamente pelo motivo do cenário que mencionei acima ocorrer com frequência, ficar dando stash ou commit wip pra lá e pra cá, pelo menos para mim, é uma experiência ruim. Utilizando o comando git worktree, basicamente podemos criar um novo diretório/espaço de trabalho com o estado do git desejado sem afetar o espaço de trabalho atual, poupando uso de git stash e commits desnecessários.
Pra falar a verdade, o espaço de trabalho atual já está no worktree do git. Se você digitar o comando git worktree list
, verá que seu espaço de trabalho atual já está listado, assim como meu exemplo abaixo.
git worktree list
/home/djalmeida/www/golang/go-study 03a1d59 [feat/add-verify-token]
No meu exemplo, possuo apenas um espaço de trabalho e estou na branch feat/add-verify-token. Digamos que surgiu um bug em produção e preciso urgentemente corrigir, mas ainda não terminei meu código na branch feat/add-verify-token
. Uma solução rápida é criar um novo espaço de trabalho.
git worktree add -b fix/quick-fix ../go-study-2 origin/main
Dessa forma, um novo espaço de trabalho será criado chamado go-study-2
no mesmo nível de diretório do projeto com a nova branch chamada fix/quick-fix
criada a partir de origin/master
.
Verificando novamente o espaço de trabalho, agora podemos ver que tenho dois espaços de trabalho.
git worktree list
/home/djalmeida/www/golang/go-study 03a1d59 [feat/add-verify-token]
/home/djalmeida/www/golang/go-study-2 07ed0e8 [fix/quick-fix]
Agora basta navegar para o novo espaço de trabalho que acabei de criar, fazer as alterações, enviar para o remoto, mesclar e etc.
cd ../go-study-2
Depois de concluir o trabalho, é só remover o espaço de trabalho criado.
git worktree remove go-study-2
Verificando novamente a lista de espaços de trabalho, note que agora voltei a ter apenas meu espaço de trabalho original.
git worktree list
/home/djalmeida/www/golang/go-study 03a1d59 [feat/add-verify-token]
Agora posso voltar para o espaço original e continuar atuando na branch feat/add-verify-token
.
cd ../go-study
Observação sobre o git worktree
Um fato a ter em conta é que você não pode fazer checkout na mesma branch em mais de um espaço de trabalho.
Por exemplo se você tiver dois espaço de trabalho, no espaço 1 você está na main e tentar fazer checkout na main do espaço 2, receberá um erro parecido com o exemplo abaixo.
git worktree add ../go-study-2 main
Preparing worktree (checking out 'main')
fatal: 'main' is already checked out at '/home/djalmeida/www/golang/go-study'
Da mesma forma, se você tentar mudar para uma branch que já está em checkout em outro espaço de trabalho.
cd ../go-study-2
git checkout main
fatal: 'main' is already checked out at '/home/djalmeida/www/golang/go-study'
Resumo
Neste post, explorei o cenário em que é necessário alternar entre branches. Enfrentar esse desafio durante uma grande refatoração ou um trabalho complexo pode ser desanimador. O git worktree oferece uma abordagem alternativa, possibilitando realizar checkouts adicionais de branches diferentes em diretórios separados e "conectar" esses espaços de trabalho ao repositório. Considero esse utilitário valioso especialmente ao lidar com múltiplas branches simultaneamente.
E você, já tinha ouvido falar do git worktree antes? Gostaria de saber a sua opinião sobre esse utilitário do git. Compartilhe suas experiências nos comentários abaixo.
Top comments (0)