Trabalhe com duas branches ou mais ao mesmo tempo com Git Worktree

RMAG news

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.

Leave a Reply

Your email address will not be published. Required fields are marked *