Voltar ao Diminua Blog

Artigo

Desvendando o `git worktree`: Gerenciando Múltiplos Branches Simultaneamente

Uma ferramenta poderosa para alternar entre branches sem perder seu trabalho atual

Desvendando o `git worktree`: Gerenciando Múltiplos Branches Simultaneamente

O Desafio de Trabalhar com Múltiplos Branches no Git

Em projetos de desenvolvimento, é comum a necessidade de trabalhar em diferentes funcionalidades ou correções de bugs simultaneamente. O Git, com seu sistema de branches, nos permite isolar essas tarefas. No entanto, alternar entre branches pode se tornar um gargalo, especialmente quando você tem trabalho em andamento que ainda não está pronto para ser commitado. O comando git checkout, embora fundamental, exige que você finalize seu trabalho atual (commitando ou usando git stash) antes de mudar de branch. Isso pode interromper o fluxo de trabalho e gerar sobrecarga mental.

Para cenários onde você precisa de acesso rápido e simultâneo a diferentes branches, o git worktree surge como uma solução elegante e eficiente. Ele permite que você tenha múltiplos diretórios de trabalho, cada um associado a um branch específico, mas compartilhando o mesmo repositório Git subjacente.

O Que é `git worktree` e Como Funciona?

git worktree é um comando do Git que permite vincular vários diretórios de trabalho a um único repositório. Cada diretório de trabalho pode operar em um branch diferente. Isso significa que você pode ter um branch em seu diretório principal e outro branch em um subdiretório separado, ambos apontando para o mesmo repositório e commit mais recente do branch associado.

A grande vantagem é que você não precisa mais fazer stash ou commit de alterações incompletas para mudar de branch. Cada worktree é independente em termos de arquivos de trabalho, mas compartilham o histórico e a configuração do repositório Git central. Isso é particularmente útil quando:

  • Você precisa fazer uma correção urgente em um branch de produção enquanto trabalha em uma nova feature em outro branch.
  • Você quer comparar visualmente o resultado de duas branches lado a lado.
  • Você está revisando um Pull Request e precisa testá-lo em um ambiente separado sem afetar seu trabalho principal.

Configurando um Novo `worktree`

Para criar um novo diretório de trabalho associado a um branch, você utiliza o comando git worktree add. A sintaxe básica é:

git worktree add  

Por exemplo, se você está no diretório raiz do seu repositório e deseja criar um novo diretório chamado hotfix para trabalhar no branch release-v1.0, você executaria:

git worktree add ../hotfix release-v1.0

Este comando criará um novo diretório chamado hotfix no nível superior do seu sistema de arquivos (ao lado do diretório do seu repositório principal) e configurará este novo diretório para trabalhar com o branch release-v1.0. O Git garantirá que o branch release-v1.0 esteja atualizado no novo diretório.

Você pode criar múltiplos worktrees. Para cada um, é importante escolher um caminho de diretório distinto.

Gerenciando Seus `worktrees`

Após criar seus worktrees, você pode gerenciá-los usando outros subcomandos do git worktree:

Listando `worktrees` existentes

Para ver todos os worktrees associados ao seu repositório, use:

git worktree list

A saída mostrará o caminho de cada diretório de trabalho e o branch ao qual ele está associado, juntamente com o commit mais recente.

Removendo um `worktree`

Quando você terminar de trabalhar em um branch específico em um worktree, é importante removê-lo para manter seu sistema organizado. Certifique-se de que não há alterações não commitadas ou não salvas no diretório que você deseja remover. Se houver, o Git pode impedir a remoção para evitar perda de dados.

Para remover um worktree, navegue até o diretório do worktree que você deseja remover e execute:

git worktree remove .

Ou, se você estiver no diretório raiz do repositório principal, pode especificar o caminho:

git worktree remove 

Atenção: A remoção de um worktree é uma operação destrutiva para o diretório associado. Certifique-se de que não precisa mais dos arquivos nele contidos.

Movendo ou Renomeando um `worktree`

Se precisar mover ou renomear um diretório de worktree, o Git oferece um comando para isso:

git worktree move  

Isso atualiza as configurações internas do Git para refletir a nova localização do diretório.

Casos de Uso Práticos

O git worktree é uma ferramenta incrivelmente versátil. Aqui estão alguns cenários onde ele brilha:

  • Correções Urgentes em Produção: Imagine que você está desenvolvendo uma nova feature no branch develop e um bug crítico é reportado em produção (branch main ou master). Em vez de interromper seu trabalho em develop com stash ou commit parciais, você pode simplesmente criar um novo worktree para o branch de produção, fazer a correção, commitar, deployar e depois voltar ao seu trabalho em develop sem perder o contexto.
  • Revisão de Código e Testes Paralelos: Ao revisar um Pull Request (PR), você pode querer testar as alterações em um ambiente isolado. Crie um worktree para o branch do PR, faça seus testes e, se necessário, comente as mudanças ou faça ajustes diretamente nele. Isso mantém seu branch principal limpo.
  • Comparação Visual de Features: Às vezes, é útil ver duas versões do seu código lado a lado. Com worktree, você pode ter um branch em um diretório e outro em um diretório adjacente, facilitando a comparação visual e a identificação de diferenças sutis.
  • Trabalho em Múltiplos Projetos ou Componentes: Se seu repositório contém múltiplos componentes que você precisa gerenciar de forma independente (mesmo que em um único monorepo), worktree pode ajudar a isolar o trabalho em cada componente em seus respectivos branches e diretórios.

Considerações de Segurança e Boas Práticas

Embora o git worktree seja uma ferramenta poderosa, é importante usá-la com responsabilidade:

  • Gerenciamento de Diretórios: Mantenha uma boa organização dos seus diretórios de worktree. Nomes descritivos e uma estrutura de diretórios lógica (por exemplo, todos os worktrees em um diretório pai comum) facilitam a gestão.
  • Limpeza: Remova worktrees que não são mais necessários. Um grande número de worktrees pode se tornar confuso e consumir espaço em disco desnecessariamente.
  • Commit Antes de Remover: Sempre certifique-se de que o trabalho em um worktree está em um estado seguro (commitado ou com um stash bem documentado) antes de removê-lo. O comando git worktree remove apaga o diretório.
  • Compartilhamento de Arquivos: Lembre-se que os worktrees compartilham o mesmo repositório Git. Alterações em um worktree (como adicionar um novo arquivo ou modificar um arquivo existente) podem ser visíveis em outros worktrees se eles estiverem no mesmo branch e o Git for atualizado. No entanto, o Git protege o estado de trabalho de cada worktree individualmente.
  • Performance: Embora eficiente, ter um número excessivo de worktrees pode impactar o desempenho geral do Git em operações que escaneiam o repositório.

Integrar o git worktree em seu fluxo de trabalho DevOps pode otimizar significativamente a forma como você gerencia branches e tarefas paralelas, levando a um desenvolvimento mais ágil e menos propenso a erros causados por trocas de contexto abruptas.

Foto de Christina Morillo no Pexels.