Soms komt het voor dat er een bug ontdekt wordt waarvan je weet dat dit ergens in de code per ongeluk ontstaan is. In dit soort situaties kun je slim gebruik maken van "git bisect". Dit command kan in slechts enkele stappen de commit aanwijzen waar de bug ontstaan is, ook als je repository duizenden commits bevat en handmatig opzoeken eigenlijk onbegonnen werk is.

Hoe werkt het?

Het "git bisec" command gebruikt de halveringsmethode (Engels: 'bisection') om een commit te vinden waar de bug is geïntroduceerd. Hierbij dien je aan te geven binnen welke reeks van commits gezocht moet worden. Vervolgens neemt git de middelste commit en kun je aangeven of dit een 'goede' of een 'foute' commit is. Elke stap halveert dus de mogelijke opties!

Stap 1

We beginnen met het vinden van een “goede” commit, de commit waarbij de bug nog niet aanwezig is, en een “foute” commit, waarbij de bug aanwezig is. Meestal is de laatste commit de commit waar de bug aanwezig dus die is snel gevonden:

$ git log -n 1

De commit hash onthouden we voor de volgende stap. Nu dienen we een commit te vinden waarbij de bug niet aanwezig was. Wat ik meestal doe is in stappen van 50 of 100 commits terug gaan, en kijken of de bug aanwezig is:

$ git checkout HEAD~50

Herhaal deze stap totdat je ziet dat de bug niet meer aanwezig is. Onthoudt de commit hash voor de volgende stap.

Stap 2

Nu kunnen we beginnen met het halveren.

$ git bisect start

Vervolgens dien je de “goede” en de “foute” commits aan te geven die je gevonden hebt in stap 1 (Vervang de commit hashes in het voorbeeld):

$ git bisect start 8b309d9

$ git bisect bad 6bb79f2

Git zal nu automatisch een commit voorschotelen die in het midden ligt van de twee commits.

Stap 3

Controleer of je bug aanwezig is. Als de bug in deze commit verdwenen is geef je aan dat dit een “goede” commit is:

$ git bisect good

Als de bug aanwezig is, geef je aan dat dit een “foute” commit is:

$ git bisect bad

Elke keer als je dit doet zal git bepalen welke commit bekeken moet worden door gebruik te maken van de halveringsmethode.

Herhaal stap 3 totdat er geen stappen meer zijn. Uiteindelijk zal git aangeven welke commit fout is gegaan:

7b32f07cb1e0ad82258fd07974faae3f74b97b45 is the first bad commit

Stap 4

Om terug te gaan naar de commit waar je begonnen bent gebruik je reset:

$ git bisect reset

Je kunt nu de wijzigingen bekijken die in de commit zijn gedaan. Dit kan bijvoorbeeld met het volgende command:

$ git diff 7b32f07cb1e0ad82258fd07974faae3f74b97b45^ 7b32f07cb1e0ad82258fd07974faae3f74b97b45

(Waarbij je de commit hash uiteraard vervangt met jouw commit hash.)

Als alternatief kun je ook in Github/Bitbucket/Gitlab de betreffende commit bekijken.

Tot slot

Als je de wijzigingen bekijkt in de gevonden commit zorgt dit meestal voor een Aha!-moment en weet je meteen hoe je de bug kunt oplossen. Succes met het vinden van bugs!

Geschreven door: Jeroen Schouten

Meer kennis bijspijkeren? Kom dan naar onze Meetup: Ode aan de Code!

Bekijk onze Meetups

Wij zijn altijd op zoek naar getalenteerde vakgenoten!

Bekijk onze vacatures