Le gestionnaire de versions Git propose un excellent moyen de détecter le moment où un bug a été introduit dans votre code source.

Le principe général est assez simple à comprendre :

  • Git parcourt un ensemble limité de révisions (qui correspond à l’ensemble de l’historique par défaut).
  • Pour chaque révision vous testez et indiquez à Git si la révision contient le bug ou non.
  • Par dichotomie Git sélectionne la prochaine révision à tester.
  • Finalement il ne doit en rester qu’une :smiley: (révision !).

Mise en pratique

On commence par indiquer à Git que l’on souhaite démarrer une session de chasse au bug :

git bisect start

Il est possible d’ajouter une révision que l’on sait mauvaise (par exemple HEAD) et une que l’on sait bonne, cela permet de réduire le nombre d’étapes à exécuter pour débusquer le bug :

git bisect start HEAD <revision>

Git vous indique alors le nombre de révisions à tester et le nombre d’étapes que cela représente :

Bisecting: 17 revisions left to test after this (roughly 4 steps)

La prochaine révision à tester est automatiquement récupérée et vous n’avez plus qu’à la tester afin d’indiquer à Git si elle contient ou non le bug :

git bisect good|bad

La prochaine révision à tester est récupérée, et ce jusqu’à ce que vous ayez tester toutes les révisions nécessaires.
Git vous donnera alors la révision coupable :

d209088c516c60f1a079ca7433c7542c9dbcb9c1 is the first bad commit

Une fois le coupable identifié vous pouvez arrêter la session afin de remettre votre code source dans l’état précédent :

git bisect reset

Astuce

En cas d’erreur lors du marquage d’une révision il est toujours possible après coup d’indiquer à Git si la révision est bonne ou mauvaise :

git bisect good|bad <revision>