[GIT] Bisect - Aula 18
Bisect
É um comando usado para encontrar Commits problemáticos em um histórico de alterações. Ele utiliza uma busca binária (por isso o nome "Bisect") para identificar qual Commit introduziu um bug ou erro no código.
Obs: O Bisect não é exclusivo para encontrar bugs, ele pode ser usado para identificar qualquer alteração específica no código.
Como fazer um Bisect
Iniciamos fazendo uma busca:
git bisect start
Devemos então indicar um Commit que contenha o bug e outro que não o contenha, é o conceito de bom (Good) e mau (Bad).
Good = Commit que não contem bug.
Bad = Commit que contem o bug.
git bisect bad Commit_Hash
git bisect good Commit_Hash
Obs: Caso não informe o Hash no Bisect Bad, ele irá considerar o Commit atual.
Após isso, o Git buscará um Commit para você testar se ele possui o bug.
Faça o teste manualmente e então indique ao Git:
git bisect bad
Se o teste falhar e o Commit estiver com o bug.
ou
git bisect good
Se o teste funcionar e o Commit não estiver com o bug.
O Git continuará a fazer checkout em Commits intermediários até identificar o culpado.
Quando o Git encontrar o Commit específico, ele mostrará algo como:
abc789 is the first bad commit
Após isso basta finalizar o Bisect:
git bisect reset
Busca Binária
A busca binária do Bisect funciona dividindo iterativamente o espaço de Commits em duas metades.
Iniciamos Indicando o Commit bom e o Commit ruim, isso dará ao Git um intervalo de busca.
O Git calcula um Commit intermediário entre os dois, para chegar ao meio.
Então vem o momento em que indicamos ao Git se aquele Commit é bom ou ruim.
Bom = O Git saberá que todos os Commits anteriores a esse também são bons.
Ruim = O Git saberá que todos os Commits que se encontram a frente do Commit testado são ruins.
Com base no resultado, o Git descarta metade dos Commits e repete o processo.
Bisect Run
O git bisect run
automatiza o processo de Bisect, executando um comando ou script de teste em cada commit.
Como funciona?
O comando fornecido após git bisect run
deve retornar:
0 = Se o Commit estiver bom.
Qualquer valor diferente de 0: Se o commit estiver ruim.
Como usar o Bisect Run
Suponha que você tenha um script de teste chamado testar_codigo.sh
:
#!/bin/bash
python meu_programa.py > /dev/null
if grep -q "Erro fatal" log.txt; then
exit 1 # Bug encontrado
else
exit 0 # Tudo certo
fi
Para automatizar o Bisect:
-
Inicie a busca
-
Indique o Commit bom e o Commit ruim
-
Execute:
git bisect run ./testar_codigo.sh
O Git rodará o teste em cada Commit, marcando como bom ou ruim com base no valor de saída.