Git Bisect - Localizando A Origem De Um Bug Através De Busca Binária Entre Os Commits

4

Click here to load reader

description

Localizando A Origem De Um Bug Através De Busca Binária Entre Os Commits

Transcript of Git Bisect - Localizando A Origem De Um Bug Através De Busca Binária Entre Os Commits

Page 1: Git Bisect - Localizando A Origem De Um Bug Através De Busca Binária Entre Os Commits

Git12/2009

Git: Localizando a origem de um bug através de busca

binária entre os commits

No artigo de hoje, vamos abordar uma funcionalidade muito interessante do Git, a qual nos permite fazer uma busca binária no projeto procurando o commit exato onde o bug foi introduzido no projeto.

Cenário: Você não é o único desenvolvedor que trabalha no projeto. Enquanto você trabalha em um branch, outras pessoas trabalham em outros branches, e no final todos fazem o merge no branch master. O merge é feito várias vezes por semana. Em um belo dia, uma funcionalidade que antes funcionava perfeitamente pára de funcionar, mas ninguém sabe dizer quem foi o responsável por quebrar aquela parte da aplicação, e como não existia uma suíte de testes cobrindo tal funcionalidade, o bug foi commitado.

Problema: Onde o erro foi commitado?Solução: Utilizar o comando git bisect.

O projeto possui os seguintes commits:

Por Alberto Lealhttp://www.albertoleal.eti.br

[email protected]/albertolealwww.imasters.com.br

Page 2: Git Bisect - Localizando A Origem De Um Bug Através De Busca Binária Entre Os Commits

**Para efeito de didática, já sabemos que o bug está no commit: bd9e83fe1def11a38436d159b1ce721920fb9565

Antes de iniciar a busca binária, deve-se saber pelo menos um commit onde não existia o bug. Neste caso, sabemos que até o segundo commit tudo funcionava perfeitamente. Mas, para ter certeza disso, execute o comando abaixo, rode a aplicação e teste:

commit 5c370fe0c059566a88e41699bfb7fea0abf4da0cAuthor: Alberto Leal <[email protected]>Date: Sat Dec 12 11:05:04 2009 -0200

CBR 98575 - Cert verification

commit bd9e83fe1def11a38436d159b1ce721920fb9565Author: Alberto Leal <[email protected]>Date: Sat Dec 12 11:04:25 2009 -0200

CBR 26345 - Regression

commit 61de4d21518855196426986ee0798c1e69f05ae0Author: Alberto Leal <[email protected]>Date: Sat Dec 12 11:03:37 2009 -0200

bug 123 fixed

commit 32c8ce277a7db30aea67f7397a06596b1fc8bfdfAuthor: Alberto Leal <[email protected]>Date: Sat Dec 12 11:02:58 2009 -0200

sessionTimeout features added

commit 1973d569ac052697c6e35e7e26b4e7b03ba09616Author: Alberto Leal <[email protected]>Date: Sat Dec 12 11:01:58 2009 -0200

slogan on the header

commit 294d5cac2d9b400b7d244d71c6db5849f61fad6aAuthor: Alberto Leal <[email protected]>Date: Sat Dec 12 11:01:01 2009 -0200

initial commit

Por Alberto Lealhttp://www.albertoleal.eti.br

[email protected]/albertolealwww.imasters.com.br

Page 3: Git Bisect - Localizando A Origem De Um Bug Através De Busca Binária Entre Os Commits

Observação: Estamos utilizando poucos commits, mas no “mundo real” os commits são muitos.

Após constatar que não existe o bug no segundo commit, volte para o último commit da mesma maneira:

Agora chegou a vez de utilizar o comando git bisect. A idéia é marcar os commits como bad(ruim) e good(bom), e deixar que o Git faça uma busca binária entre os commits.

Antes de mais nada, é necessário informar ao Git que vamos iniciar uma busca binária, para isso execute git bisect start. Repare que após iniciar o bisect, marcamos o último commit como bad e o segundo commit como good. Em seguida o Git fez uma busca binária e encontrou o commit “bug 123 fixed”. Neste momento você deve executar a sua aplicação para ver se o bug está lá. Não, o bug não está lá, portanto, marcamos o commit como good:

Novamente, o Git faz uma busca binária e encontra mais um commit para ser analisado. Após rodar a aplicação, constata-se que o erro está commit atual que o bisect encontrou “CBR 26345 - Regression”:

git checkout 1973d569ac052697c6e35e7e26b4e7b03ba09616

git checkout 5c370fe0c059566a88e41699bfb7fea0abf4da0c

Alberto:repo Alberto$ git bisect startAlberto:repo Alberto$ git bisect badA l b e r t o : r e p o A l b e r t o $ g i t b i s e c t g o o d 1973d569ac052697c6e35e7e26b4e7b03ba09616Bisecting: 1 revisions left to test after this (roughly 1 steps)[61de4d21518855196426986ee0798c1e69f05ae0] bug 123 fixed

Alberto:repo Alberto$ git bisect goodBisecting: 0 revisions left to test after this (roughly 0 steps)[bd9e83fe1def11a38436d159b1ce721920fb9565] CBR 26345 - Regression

Por Alberto Lealhttp://www.albertoleal.eti.br

[email protected]/albertolealwww.imasters.com.br

Page 4: Git Bisect - Localizando A Origem De Um Bug Através De Busca Binária Entre Os Commits

Pronto! Agora já sabemos em qual commit o bug foi introduzido.E, para finalizar, da mesma forma que informamos ao Git que desejávamos fazer uma busca binária, devemos informá-lo que já terminamos, executando o comando abaixo:

Muita gente acha que quando se está trabalhando sozinho em um projeto de software não é necessário utilizar um sistema de controle de versões. O que é um falácia.O Git, por exemplo, dispõe de excelentes ferramentas para nos auxiliar.Utilizar um SCM é indispensável e indiferente a quantidade de desenvolvedores que estão trabalhando no projeto.

Alberto:repo Alberto$ git bisect badbd9e83fe1def11a38436d159b1ce721920fb9565 is first bad commitcommit bd9e83fe1def11a38436d159b1ce721920fb9565Author: Alberto Leal <[email protected]>Date: Sat Dec 12 11:04:25 2009 -0200

CBR 26345 - Regression

:100644 100644 9309150acfad8f21cb460ee17663fcbeaf212aa0 172b5ae1734b7bd1e1ac46b5cade3e61cbfddff1 Mimasters.txt

Alberto:repo Alberto$ git bisect resetPrevious HEAD position was bd9e83f... CBR 26345 - RegressionSwitched to branch 'master'

Por Alberto Lealhttp://www.albertoleal.eti.br

[email protected]/albertolealwww.imasters.com.br