Git worktree: várias branches em checkout ao mesmo tempo
Guia de git worktree
Git worktree: add, list, remove e prune, com exemplos | We.Inc
Monte o comando git worktree add exato para uma branch nova, uma branch existente ou um commit detached e depois liste, trave, mova, remova e limpe worktrees com segurança.
O git worktree permite que um repositório tenha várias pastas de trabalho, cada uma na sua própria branch, compartilhando um único armazenamento de objetos. Rode git worktree add ../hotfix -b hotfix para criar uma pasta nova em uma branch nova, git worktree list para ver todas e git worktree remove ../hotfix quando terminar. Sem precisar de um segundo clone.
Os comandos de worktree do dia a dia
Tarefa
Comando
Pasta nova em uma branch nova
git worktree add ../app-fix -b fix/login
Pasta nova em uma branch existente
git worktree add ../app-review feature/cart
Pasta descartável em um commit
git worktree add --detach ../app-old v1.4.0
Ver todas as worktrees
git worktree list
Apagar uma worktree
git worktree remove ../app-fix
Limpar pastas que você apagou na mão
git worktree prune
Fazer stash, trocar de branch e recompilar toda vez que alguém pede uma correção rápida desperdiça tempo. Uma worktree dá a você um segundo checkout do mesmo repositório em outra pasta, então uma bateria de testes longa, uma revisão de código e um patch urgente podem viver cada um no seu próprio diretório. Use o gerador para obter os comandos e consulte a referência para os subcomandos menos comuns.
Digite a pasta que você quer e o nome da branch e escolha branch nova, branch existente ou commit detached.
Copie o comando add e rode-o de dentro do seu checkout principal.
Trabalhe na pasta nova como em qualquer clone: faça commit, push e pull ali.
Quando a branch for mesclada, rode o comando remove que o gerador mostra, e use prune se algum dia apagou uma pasta na mão.
Mantenha as worktrees como pastas irmãs, por exemplo ../app-fix, para que nunca fiquem dentro da árvore do checkout principal.
Cada worktree precisa das suas próprias dependências instaladas e da sua própria saída de build. Reserve espaço em disco para o node_modules de cada pasta.
Uma branch só pode estar em checkout em uma worktree por vez. Se o add recusar, veja em git worktree list onde ela já está aberta.
Trave uma worktree que fica em um drive removível com git worktree lock --reason "usb disk" para que o prune não a apague enquanto estiver desconectada.
Perguntas frequentes
Qual é a diferença entre uma worktree e um clone?
Um clone copia o repositório inteiro, incluindo o histórico. Uma worktree vinculada compartilha os objetos e as refs do repositório original e só adiciona uma nova pasta de trabalho e um pouco de metadados, então commits feitos em uma ficam visíveis na hora nas outras, sem fetch.
Duas worktrees podem usar a mesma branch?
Não por padrão. O git worktree add recusa uma branch que já está em checkout em outro lugar, porque duas pastas movendo a mesma branch sobrescreveriam o trabalho uma da outra. O --force ignora isso, mas um HEAD detached ou uma segunda branch é quase sempre a melhor escolha.
Por que o git worktree remove falha?
Ele recusa quando a pasta tem arquivos rastreados modificados ou arquivos não rastreados, para você não perder trabalho. Faça commit ou limpe a pasta antes, ou passe --force. Uma worktree travada precisa de --force duas vezes.
O que o git worktree prune faz?
Ele apaga os registros que sobram no git para worktrees cujas pastas não existem mais, por exemplo depois de você remover uma com rm -rf. Adicione -n para ver antes o que ele removeria.
Como renomeio ou movo a pasta de uma worktree?
Use git worktree move <worktree> <new-path> para que o git atualize os seus registros. Se você já a moveu pelo gerenciador de arquivos, rode git worktree repair a partir do novo local para reconectá-la.
Bons motivos para usar worktrees
Revisar um pull request sem mexer em um trabalho pela metade, manter uma suíte de testes lenta rodando em uma branch enquanto programa em outra e comparar duas versões de um app lado a lado são os casos clássicos.
Elas também servem para ferramentas que rodam várias sessões de programação no mesmo repositório: cada sessão ganha a sua própria pasta e branch, então os arquivos não commitados de uma sessão nunca vazam para o build de outra.
O que é compartilhado e o que não é
Todas as worktrees compartilham commits, branches, tags, remotes e a maior parte da configuração. Cada uma tem o seu próprio HEAD, index e arquivos de trabalho, então fazer stage em uma pasta não afeta as outras.
Arquivos ignorados como .env, node_modules e pastas de build não são copiados para uma worktree nova. Copie o arquivo env você mesmo e instale as dependências antes de rodar qualquer coisa.