Ione Souza Junior

Git Worktree: Sua Arma Secreta para Multitarefa no Git

17/05/2024 | 7 minutos de leitura | Tradu√ß√Ķes: en | #git

Como uma pessoa desenvolvedora, voc√™ est√° acostumado a lidar com m√ļltiplas tarefas. Voc√™ pode estar corrigindo bugs em uma vers√£o de produ√ß√£o enquanto desenvolve novos recursos para a pr√≥xima vers√£o. Isso geralmente significa alternar entre diferentes branches do seu projeto, o que pode ser um processo desajeitado e demorado. Armazenar mudan√ßas constantemente, alternar branches e esperar que sua IDE se atualize pode interromper significativamente seu fluxo de trabalho. E se houvesse uma maneira de trabalhar em v√°rios branches simultaneamente, sem a constante mudan√ßa de contexto? Para isso, existe o git worktree: um comando poderoso, mas frequentemente negligenciado, que pode revolucionar a maneira como voc√™ realiza multitarefas no Git. Vamos v√™-lo em a√ß√£o neste post.

Pense nisso como sua arma secreta para gerenciar vários estados de projeto sem a dor de cabeça de lidar com repositórios separados. Com o git worktree, você pode alternar facilmente entre branches, experimentar novos recursos e corrigir bugs urgentes - tudo dentro do mesmo projeto, sem grande complicação. Isso é estranho, certo? Não se preocupe! Vamos entender como este comando funciona.

Entendendo o git worktree

Em sua ess√™ncia, o git worktree permite criar v√°rias √°rvores de trabalho a partir de um √ļnico reposit√≥rio Git. Isso significa que voc√™ pode ter v√°rios branches baixados simultaneamente, cada um em seu pr√≥prio diret√≥rio separado, mas todos conectados aos mesmos dados de reposit√≥rio subjacentes ūü§Į.

Imagine assim: sua pasta principal do projeto se torna o diret√≥rio ‚Äúpai‚ÄĚ, e cada git worktree que voc√™ cria √© um diret√≥rio ‚Äúfilho‚ÄĚ, representando um branch diferente do seu projeto. A m√°gica √© que cada diret√≥rio filho opera como um espa√ßo de trabalho completamente independente. Voc√™ pode editar arquivos, fazer commits e at√© criar novos branches dentro de um worktree espec√≠fico, sem afetar nenhum dos outros worktrees.

Isso permite, por exemplo, ter um worktree dedicado ao desenvolvimento de um novo recurso, outro focado em corrigir bugs no branch ‚Äúmain‚ÄĚ e ainda outro para experimentar um recurso experimental arriscado - tudo dentro do mesmo projeto.

Para criar um novo worktree é simples:

git worktree add <caminho/para/novo/worktree> <nome-do-branch>

O <caminho/para/novo/worktree> √© o diret√≥rio onde seu novo worktree ser√° criado. Voc√™ pode nome√°-lo como fizer sentido para a tarefa em que est√° trabalhando. O <nome-do-branch> √© o branch que voc√™ deseja baixar no novo worktree. Por exemplo, para criar um worktree chamado ‚ÄúBookTrackingLint‚ÄĚ para desenvolver um novo recurso no branch ‚Äúswiftlint‚ÄĚ, voc√™ executaria:

git worktree add ../BookTrackingLint swiftlint

Isso criar√° um novo diret√≥rio chamado ‚ÄúBookTrackingLint‚ÄĚ no mesmo n√≠vel da pasta principal do seu projeto e baixar√° o branch ‚Äúswiftlint‚ÄĚ dentro dele. Agora voc√™ pode trabalhar neste branch de forma totalmente independente de seus outros worktrees.

Você pode listar todos os worktrees já criados com o seguinte comando:

git worktree list

Como resultado, você verá algo como isto:

/Users/ionixjunior/Projects/iOS/BookTracking      9060735 [main]
/Users/ionixjunior/Projects/iOS/BookTrackingLint  bf99013 [swiftlint]

Casos de uso e benefícios do git worktree

A beleza do git worktree reside em sua versatilidade. Ele pode ser aplicado a uma variedade de cenários, otimizando significativamente seu fluxo de trabalho de desenvolvimento. Aqui estão alguns casos de uso comuns e os benefícios que eles trazem:

Seja um(a) ‚Äúher√≥i do hotfix‚ÄĚ

Um bug crítico é descoberto em seu ambiente de produção, exigindo atenção imediata. Você precisa criar um branch de hotfix enquanto continua trabalhando em seu branch de recurso atual. Como lidar com isso? Use o git worktree para criar um novo worktree para o branch de hotfix. Isso permite que você resolva rapidamente o problema crítico sem interromper seu trabalho em andamento. Assim que o hotfix for concluído e mesclado, você pode simplesmente excluir o worktree dedicado.

Desenvolvendo novas features sem preocupação

Voc√™ est√° trabalhando em v√°rios recursos em paralelo, cada um exigindo seu pr√≥prio ambiente isolado. Mudar constantemente de branch e armazenar altera√ß√Ķes est√° se tornando um pesadelo. Como lidar com isso? Crie um worktree separado para cada branch de recurso. Isso permite que voc√™ alterne facilmente entre os recursos, trabalhe neles de forma independente e acompanhe facilmente seu progresso sem interromper outros branches.

Testes facilitados

Você precisa testar um branch de recurso específico em um ambiente dedicado sem afetar seu espaço de trabalho de desenvolvimento principal. O que fazer? Use o git worktree para criar um worktree dedicado para fins de teste. Você pode então configurar este ambiente especificamente para teste e descartá-lo facilmente após a conclusão do teste.

Benefícios de usar o git worktree

Com este comando, voc√™ pode reduzir a mudan√ßa de contexto. Chega de realizar diversos stashes e alternar entre diferentes branches, economizando tempo e energia mental. Al√©m disso, voc√™ pode aprimorar a organiza√ß√£o, mantendo seu projeto organizado separando diferentes tarefas de desenvolvimento em worktrees dedicados. Outra coisa boa √© que ele pode melhorar o foco, pois se voc√™ trabalhar em recursos espec√≠ficos ou bugs isoladamente, pode minimizar as distra√ß√Ķes e melhorar a concentra√ß√£o. Al√©m disso, o comando pode fornecer testes e experimenta√ß√£o mais r√°pidos, pois voc√™ pode criar facilmente worktrees dedicados para testar novos recursos ou experimentar diferentes abordagens.

Para IDEs que possuem suporte a multiplas janelas, voc√™ pode utilizar uma inst√Ęncia para abrir um worktree e outra inst√Ęncia para abrir outro. Isso pode ser √ļtil em alguns cen√°rios.

Outro ponto que vale ressaltar é que existem projetos onde o setup é um pouco demorado. O tempo de compilação é grande, a análise dos arquivos é lenta e isso tudo precisa ser realizado quando alteramos o branch. Isso pode impactar em perda de desempenho em nosso trabalho, e o git worktree pode ajudar com isso.

Gerenciando seu worktree

Você criou alguns worktrees, certo? Mas como podemos excluí-los? Talvez apenas excluindo a nova pasta? Sim, você pode fazer isso, mas deixará alguns rastros em seu repositório. Para remover corretamente um worktree, você usa a opção remove seguida pelo diretório do worktree. Usarei o mesmo exemplo do repositório BookTracking que criei anteriormente.

git worktree remove ../BookTrackingLint

Agora, se executarmos o comando list, o worktree n√£o estar√° mais l√°.

git worktree list
/Users/ionixjunior/Projects/iOS/BookTracking  9060735 [main]

Mas, como eu disse, você pode excluir a pasta, mas vamos ver o que acontece. Criei o mesmo worktree novamente, excluí a pasta do worktree e executei o comando list:

git worktree list
/Users/ionixjunior/Projects/iOS/BookTracking      9060735 [main]
/Users/ionixjunior/Projects/iOS/BookTrackingLint  bf99013 [swiftlint] prunable

Agora voc√™ pode ver a palavra ‚Äúprunable‚ÄĚ na pasta que exclu√≠ manualmente. Isso significa que o Git n√£o encontra esse worktree, mas o relacionamento ainda existe no reposit√≥rio. Podemos limpar isso usando o comando ‚Äúprune‚ÄĚ:

git worktree prune

Agora, quando executarmos o comando list, tudo estar√° ok.

git worktree list
/Users/ionixjunior/Projects/iOS/BookTracking  9060735 [main]

Conclus√£o

O comando git worktree √© um divisor de √°guas para qualquer pessoa desenvolvedora que busca aumentar sua produtividade e otimizar seu fluxo de trabalho. Ele o libera das limita√ß√Ķes de mudar constantemente de branch e lidar com reposit√≥rios separados, permitindo que voc√™ realize multitarefas sem esfor√ßo em seus projetos Git. Esteja voc√™ lidando com hotfixes urgentes, desenvolvendo v√°rios recursos em paralelo ou configurando ambientes de teste dedicados, o git worktree fornece uma solu√ß√£o poderosa e flex√≠vel.

Reserve um tempo para explorar o comando, experimentar seus recursos e descobrir como ele pode revolucionar sua abordagem de multitarefas no Git. A sua vers√£o do futuro, que ser√° mais eficiente, agradecer√° por isso.

Até o próximo post!