Git Avançado: Rebase, Bisect e Rerere
Ferramentas cirúrgicas para manter o histórico limpo e debugar regressões automaticamente.
Rebase Interativo (-i)
O git commit raramente sai perfeito na primeira vez. Antes de abrir um PR, limpe a casa.
git rebase -i HEAD~3
Isso abre um editor com os últimos 3 commits. Comandos úteis:
- pick: Mantém o commit.
- reword: Mantém o conteúdo, mas permite editar a mensagem.
- squash: Funde este commit com o anterior (útil para “fix typo”).
- drop: Apaga o commit da história.
Regra de Ouro: NUNCA faça rebase em branches públicas (main/develop). Apenas na sua feature branch local.
Resolvendo Conflitos com Inteligência
Git Rerere (Reuse Recorded Resolution)
Se você faz rebases frequentes, vai resolver o mesmo conflito várias vezes. O rerere ensina o Git a lembrar como você resolveu.
- Habilite:
git config --global rerere.enabled true - Resolva um conflito e commite.
- O Git grava a “impressão digital” do conflito.
- No próximo rebase/merge com o mesmo conflito, o Git aplica a solução sozinho.
Git Bisect: O Caçador de Bugs
Seu sistema funcionava semana passada (v1.0) e quebrou hoje (v1.1). Há 500 commits no meio. Onde quebrou?
O bisect faz uma busca binária no histórico.
- Inicie:
git bisect start - Marque o ruim (atual):
git bisect bad - Marque o bom (antigo):
git bisect good v1.0 - O Git faz checkout no meio.
- Teste. Funcionou?
git bisect good. Falhou?git bisect bad. - Repita até o Git dizer: “Commit xyz is the first bad commit”.
Automação (God Mode)
Você pode rodar um script a cada passo!
git bisect run ./teste_automatizado.sh
O script deve retornar 0 (bom) ou não-zero (ruim). O Git encontra o culpado sozinho em segundos.
Hooks (Automação de Qualidade)
Hooks são scripts em .git/hooks que rodam em eventos.
- pre-commit: Roda linters/formatadores. Se falhar, o commit é abortado.
- pre-push: Roda testes rápidos. Evita quebrar a CI.
Exemplo de pre-commit (C/C++):
#!/bin/sh
clang-format -i src/*.c
cppcheck src/