DEV Community

@dyhalmeida
@dyhalmeida

Posted on

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

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]
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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]
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Depois de concluir o trabalho, é só remover o espaço de trabalho criado.

git worktree remove go-study-2
Enter fullscreen mode Exit fullscreen mode

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]
Enter fullscreen mode Exit fullscreen mode

Agora posso voltar para o espaço original e continuar atuando na branch feat/add-verify-token.

cd ../go-study
Enter fullscreen mode Exit fullscreen mode

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'
Enter fullscreen mode Exit fullscreen mode

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'
Enter fullscreen mode Exit fullscreen mode

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)