git bisect
Encontrar o commit que introduziu um bug por busca binária
O comando 'git bisect' encontra o commit que introduziu um bug. Você marca um commit como ruim (bad, tem o bug) e um como bom (good, não tem); o git faz checkout do commit do meio, você o testa e responde good ou bad, e o git divide os suspeitos ao meio de novo até sobrar um. Mesmo mil commits exigem só uns dez testes. git bisect reset leva você de volta para onde começou.
Sinopse
git bisect start [<bad> [<good>...]]
git bisect (bad | good) [<rev>...]
git bisect skip [<rev>...]
git bisect reset
git bisect log
git bisect run <cmd>...Opções
Escolhendo a opção certa
Testes necessários
A busca binária divide os suspeitos ao meio a cada vez
| Comando | testes do bisect |
|---|---|
10 commits | cerca de 4 |
100 commits | cerca de 7 |
1000 commits | cerca de 10 |
Exemplos
Iniciar uma sessão
git bisect startComeça a busca.
Marcar commits
git bisect bad && git bisect good v1.0O commit atual é ruim, v1.0 era bom.
Automatizar
git bisect run npm testDeixe um script de teste responder por você.
Terminar
git bisect resetDe volta ao seu branch.
Exemplos de fluxos de trabalho
git bisect start HEAD v1.0Ruim agora, bom na v1.0
git bisect good / git bisect badTestar cada commit que o git faz checkout
git bisect resetDe volta ao seu branch
git revert <first-bad>Desfazer o culpado
Solução de problemas
You need to start by "git bisect start"
Causa: Nenhuma sessão em andamento
Execute git bisect start primeiro
Resposta errada dada
Causa: Todos os passos seguintes dependem dela
git bisect log > log.txt, corrija a linha, git bisect reset, git bisect replay log.txt
Dicas e armadilhas
Boas práticas
- ✓Escreva um teste automático e use git bisect run.
- ✓Sempre termine com git bisect reset.
Erros comuns
- ✗Responder errado uma vez — todos os passos seguintes ficam errados (confira com git bisect log).
- ✗Esquecer git bisect reset e continuar trabalhando num HEAD destacado.
- ✗Começar com alterações não commitadas que atrapalham os checkouts.
Perguntas frequentes
Sim: git bisect start --term-old=fast --term-new=slow, p. ex. para descobrir quando algo ficou lento.