Git bisect : pour trouver l'origine d'une régression

Anne git

La commande magique git bisect permet de retrouver la version qui a introduit une régression. Elle est très bien décrite dans la doc, mais voici un petit résumé rapide.

Recherche manuelle

Initialiser

$ git bisect start
$ git bisect bad            # la version courante contient le bug
$ git bisect good v1.2.3    # la version v1.2.3 est ok

ou plus rapidement pour dire la même chose :

$ git bisect start HEAD v1.2.3

Si on sait que le problème vient d’une modification dans le répertoire src/compute, on peut accélérer la recherche en l’indiquant :

 $ git bisect start HEAD v1.2.3 -- src/compute

Rechercher

L’outil va ensuite commuter vers une version intermédiaire. On fait le test, puis on indique :

$ git bisect good  # la version est ok

ou

$ git bisect bad   # la version est boguée

Le processus continue jusqu'à ce que la version coupable soit identifiée.

Terminer

Il faut terminer avec :

$ git bisect reset

On se retrouve alors sur la version de départ.

Pour basculer sur la version coupable :

$ git bisect reset bisect/bad

Pour rester sur la version courante (la dernière testée) :

$ git bisect reset HEAD

Enfin, pour choisir une autre version :

$ git bisect reset <commit>

Recherche automatique

Si on se donne la peine d'écrire un petit script pour déterminer si une version est bonne ou mauvaise, la recherche est automatique.

Le script peut ressembler à ça :

#!/bin/bash
make || exit 125   # on passe les versions qui ne compilent pas
bin/mon_programme -options > tmp.log
if grep Failed tmp.log ; then
  exit 1           # le bug est présent dans cette version
else
  exit 0           # cette version est ok.
fi

On commence comme précédemment par bisect start et on indique les versions - la bonne et la mauvaise - de départ, puis on lance :

$ git bisect run script.sh

Et c’est parti…

Ne pas oublier de terminer comme précédemment par :

$ git bisect reset

Voir aussi :