Git avançado: rebase interativo, bisect e worktrees que você deveria usar
1. Rebase interativo: dominando a reescrita de histórico
1.1. O que é o rebase interativo e quando utilizá-lo
O git rebase -i (modo interativo) é uma ferramenta poderosa que permite reescrever o histórico de commits de forma controlada. Diferente do rebase comum, que apenas move commits para uma nova base, o modo interativo abre um editor com uma lista de commits onde você pode aplicar transformações específicas.
Utilize o rebase interativo quando precisar:
- Limpar o histórico antes de enviar para um repositório remoto
- Combinar commits relacionados em um único commit lógico
- Remover commits desnecessários ou incorretos
- Alterar mensagens de commit para maior clareza
1.2. Comandos essenciais
Ao executar git rebase -i HEAD~n, você verá uma lista como esta:
pick a1b2c3d Adiciona funcionalidade de login
pick e4f5g6h Corrige bug no formulário
pick i7j8k9l Refatora validação de dados
Os comandos principais são:
pick: mantém o commit como estásquash: combina o commit com o anterior, mesclando as mensagensfixup: similar ao squash, mas descarta a mensagem do commit combinadoreword: permite alterar apenas a mensagem do commitedit: pausa o rebase para modificar o conteúdo do commitdrop: remove completamente o commit do histórico
1.3. Boas práticas
Nunca reescreva commits que já foram enviados para um repositório remoto compartilhado. O rebase interativo deve ser usado exclusivamente em branches locais ou em branches de feature antes do merge. Para evitar conflitos, sempre mantenha sua branch atualizada com a branch base antes de iniciar um rebase.
2. Estratégias avançadas de rebase interativo
2.1. Dividindo um commit grande com edit
Quando um commit contém múltiplas alterações não relacionadas, use o comando edit:
# No editor do rebase, marque o commit como 'edit'
edit 1a2b3c4 Adiciona integração com API e correções de UI
Após pausar, faça:
git reset HEAD~1
git add -p
git commit -m "Adiciona integração com API"
git add -p
git commit -m "Correções de UI"
git rebase --continue
2.2. Reordenando e combinando commits
Para reordenar, basta mover as linhas no editor. Para combinar, use squash ou fixup:
pick a1b2c3d Configuração inicial do banco
squash e4f5g6h Ajustes na configuração do banco
fixup i7j8k9l Pequena correção na query
pick o1p2q3r Adiciona endpoints da API
2.3. Usando --onto para mover branches
O git rebase --onto permite mover commits de uma branch para outra base:
git rebase --onto main feature-branch bugfix-branch
Isso é útil quando você criou uma branch a partir do local errado e precisa reposicioná-la.
3. Git bisect: caça a bugs com busca binária
3.1. Iniciando uma sessão
O git bisect realiza uma busca binária no histórico para identificar o commit que introduziu um bug:
git bisect start
git bisect bad # Commit atual contém o bug
git bisect good v2.0.0 # Última versão conhecida sem o bug
O Git automaticamente faz checkout de um commit intermediário para teste.
3.2. Automatizando com git bisect run
Para sessões repetitivas, crie um script de teste:
#!/bin/bash
# test_bug.sh
python -c "from app import test_feature; assert test_feature()"
Execute:
git bisect run ./test_bug.sh
O Git automatiza todo o processo, marcando commits como good ou bad baseado no código de saída do script.
3.3. Dicas para bases grandes
Use git bisect skip quando um commit não puder ser testado (por exemplo, falha de compilação não relacionada). Para bisect em merges complexos, considere usar git bisect visualize para ver o grafo de commits.
4. Worktrees: trabalhando em múltiplas branches simultaneamente
4.1. Conceito e diferença para múltiplos clones
Worktrees permitem ter múltiplos diretórios de trabalho vinculados ao mesmo repositório Git. Diferente de múltiplos clones, as worktrees compartilham os objetos Git, economizando espaço em disco e mantendo referências sincronizadas.
4.2. Criando e gerenciando worktrees
# Criar uma worktree para uma nova branch
git worktree add ../hotfix-falha-login hotfix/falha-login
# Criar uma worktree para uma branch existente
git worktree add ../revisao-pr-42 origin/feature/nova-api
# Listar worktrees ativas
git worktree list
# Remover uma worktree
git worktree remove ../hotfix-falha-login
4.3. Casos de uso práticos
- Revisão de PRs: crie uma worktree para cada PR em revisão
- Hotfixes: mantenha a worktree principal em desenvolvimento enquanto aplica correções urgentes
- Experimentos: teste ideias sem interferir no ambiente de trabalho principal
5. Integração prática entre rebase, bisect e worktrees
5.1. Usando worktrees para isolar bisect
Crie uma worktree dedicada para a sessão de bisect:
git worktree add ../bisect-session
cd ../bisect-session
git bisect start
git bisect bad
git bisect good v3.0.0
Isso permite continuar trabalhando normalmente no repositório principal.
5.2. Rebase interativo em worktrees separadas
# Em uma worktree isolada
git worktree add ../refatoracao refatoracao-modulo-x
cd ../refatoracao
git rebase -i HEAD~5
Se houver conflitos, o trabalho na worktree principal permanece intacto.
5.3. Fluxo combinado para manutenção ágil
- Detecte um bug na branch
main - Crie uma worktree para bisect:
git worktree add ../debug-bug - Execute bisect para identificar o commit problemático
- Na worktree principal, crie uma branch de correção
- Use rebase interativo para limpar os commits de correção
- Faça merge ou rebase na branch principal
6. Cuidados e armadilhas comuns
6.1. Conflitos durante rebase
Para minimizar conflitos:
- Faça rebase frequente com a branch base
- Use git rerere para reutilizar resoluções de conflitos anteriores
- Em caso de conflitos complexos, considere git merge em vez de rebase
6.2. Limitações do bisect
O bisect pode ser impreciso com merges complexos. Commits de merge que não seguem a ordem linear podem confundir o algoritmo. Use git bisect visualize para verificar o grafo e considere marcar merges como skip se necessário.
6.3. Gerenciamento de worktrees
Worktrees ocupam espaço em disco proporcional ao tamanho do diretório de trabalho. Limpe worktrees não utilizadas regularmente. Lembre-se que branches com worktrees ativas não podem ser deletadas até que a worktree seja removida.
Referências
- Documentação oficial do Git - Rebase — Guia completo sobre rebase, incluindo modo interativo e opções avançadas
- Documentação oficial do Git - Bisect — Referência detalhada sobre busca binária com git bisect
- Documentação oficial do Git - Worktree — Manual completo sobre gerenciamento de múltiplas árvores de trabalho
- Atlassian Git Tutorial - Rebase Interativo — Tutorial prático com exemplos de squash, fixup e reword
- Git Bisect - Debugging com Busca Binária — Capítulo do Pro Git sobre debugging avançado com bisect
- Git Worktrees - Guia Prático — Arturation rápida com exemplos de uso de worktrees para múltiplas tarefas