Achando Bugs com Git Bisect

O git possui um comando muito interessante para achar bugs no seu código: git bisect

Basicamente o que o git bisect faz é uma busca binária no seu repositório git para encontrar qual commit introduziu um bug no seu código.

A maneira como ele funciona é bem simples: você passa o hash de um commit onde seu código estava funcionando e o hash do commit onde você percebeu que seu código parou de funcionar, finalmente você diz para o git qual comando ele deve executar em cada commit para validar se aquele commit está ou não “bugado”.

Para mostrar o quão simples é de se usar esse comando, eu criei um repositório no github para que você possa acompanhar comigo o uso do git bisect.

Primeiramente clone para sua máquina o seguinte repositório: https://github.com/jonduarte/git-bisect-example com o comando


$ git clone https://github.com/jonduarte/git-bisect-example

depois entre na pasta do projeto

cd git-bisect-example

e execute o comando ruby ex.rb

Você verá que o comando falhará. Agora vamos usar o git bisect para achar onde esse bug foi introduzido. Use o commando git log --oneline para listas os commits disponíveis.

Primeiramente precisamos encontrar uma versão “funcional” do projeto. Vamos pegar o commit 712db34 que é o commit inicial do projeto e onde eu tenho certeza que meu teste estava passando – A propósito, lendo o nome dos commits você já tem um spoiler de qual commit quebrou nosso teste 🙂

Depois preciso pegar o hash do commit onde eu percebi que havia um bug no código, no meu caso apenas percebi isso no meu último commit que possui o hash: 114f21f

Pronto agora temos informações suficientes para pedir ao git para encontrar onde o bug foi introduzido.

primeiramente iniciando o git bisect

$ git bisect start

agora precisamos passar os dois hashes para o git, um indicando o estado positivo do nosso código e o outro indicando o estado negativo:

$ git bisect good 712db34

$ git bisect bad 114f21f

finalmente precisamos indicar pro git qual comando ele deve executar entre os commits para definir se um commit possui o bug ou não. No nossa caso é o comando ruby ex.rb

$ git bisect run ruby ex.rb

Finalmente o git nos mostra que o commit que introduziu o bug nosso código foi o seguinte:

f4c1af35e2361c4504d533df81aac7fa76c718b1 is the first bad commit

No nosso exemplo não conseguimos ver efetivamente em ação a busca binária que o git realiza para encontrar um mau commit, porém certamente se seu repositório git for um pouco maior você poderá ver como esse comando é efetivo.

Finalmente, para sair do modo bisect, execute o comando:

$ git bisect reset

Pronto! agora você pode verificar o commit que introduziu o bug e criar seu fix.

 

Achando Bugs com Git Bisect