Git bisect ou comment aimer chercher les régressions.

J’utilise git depuis un bon moment maintenant, ma réelle utilisation ayant débuté en même temps que le développement avec Enrico Ros de Fotowall.
Jusqu’à présent, je n’avais jamais eu besoin d’utiliser de fonctions plus avancées que git log, git fetch, git merge…

Une régression est enfin apparue dans notre logiciel Fotowall, ce qui m’a donné l’occasion de tester git bisect, dont j’avais vaguement entendu parler. Je pensais que trouver cette régression serait une vrai galère, mais en fait, il s’avère que l’outil git bisect est très performant, et m’a permis de corriger le problème en à peine 15 minutes !

A quoi sert git bisect ?

Il s’agit d’un outil permettant de traquer les régressions (c’est à dire les fonctionnalités d’un programmes qui arrêtent de fonctionner suite à d’autres modifications). Il va tester les commits entre un indiqué comme bon, et un autre indiqué comme mauvais (l’actuel généralement).

L’intérêt de git bisect est multiple :

  • Il passe automatiquement d’un commit à l’autre
  • Il ne parcours pas les commits dans l’ordre, mais « coupe la poire en 2 », ce qui permet d’avoir bien moins de compilations à faire.
  • Il travaille automatiquement dans une branche à part, ce qui permet de garder intact le travail actuel
  • Il permet de lancer des scripts pour tester automatiquement le programme. Dans le cas d’un programme utilisant le principe de « test driven development« , ceci peut être réellement pratique, les compilations pouvant être lancées automatiquement, git bisect peut travailler sans intervention du programmeur.

Utilisation

Trève de présentations, voyons comment utiliser cet outil qui vous permettra de gagner un temps considérable en cas de régressions :

Tout d’abord, il faut démarrer git bisect, lui indiquer un mauvais commit, ainsi qu’un commit qu’on pense être valable (le plus proche possible du mauvais commit pour gagner du temps).

git bisect start
git bisect bad  # Le commit courant est mauvais
git bisect good c016cd61d91eb07d5baa8bfe7714fc68ac5e1ae2 # ce commit fonctionne

Ensuite, il faut compiler, et regarder si ça fonctionne. Si ça fonctionne, on l’indique avec git bisect good, sinon on indique que ça ne fonctionne pas avec git bisect bad.

make
git bisect good #ou git bisect bad si ça ne fonctionne pas

Répéter l’opération jusqu’à ce que git trouve le dernier commit valable, il vous l’indiquera et vous placera à ce commit.

Pour abandonner la bisection

git bisect reset

Exemple
Pour que ça soit un peu plus clair, voici un exemple avec Fotowall (j’ai pris les commits au pif, et mis les git bisect bad aléatoirement, vu que Fotowall fonctionne très bien).

$ git bisect start
$ git bisect bad
$ git bisect good c016cd61d91eb07d5baa8bfe7714fc68ac5e1ae2
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[4f9ae4eab1e9fbc00b676c6589f469a6cbbc2b54] Finally FIX the Navigation Bar & Picture Search Widget - escaping QGraphicsScene through Widgets though..
$ make
[...]
$ ./fotowall # test du programme, on constate que la fonctionnalité ne fonctionne pas correctement
$ git bisect bad
Bisecting: 1 revisions left to test after this (roughly 1 steps)
[47e3cdaab6a6f8c3bcd6b8c5d9567eaa44513cf4] Smaller fix.
$ make && ./fotowall #fonctionne toujours pas
$ git bisect bad
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[69cfda605533685c791c362e3a57e806dca5a2c5] Small fix.
$ make && ./fotowall #ce coup-ci ça fonctionne
$ git bisect good
47e3cdaab6a6f8c3bcd6b8c5d9567eaa44513cf4 <strong>is first bad commit</strong>
commit 47e3cdaab6a6f8c3bcd6b8c5d9567eaa44513cf4
Author: Enrico Ros
Date:   Thu Dec 3 16:54:21 2009 +0100

Smaller fix.

:040000 040000 8e4dd27e5b9d20cd1cb0fcbf3b11bd1d2b9a2042 93939c2bbd03adaf9306c2c2137cbac7fa93e874 M	App
$ git bisect log
git bisect start
# bad: [a7357c1f59ea4961046e53d3350a855ea7e69ff7] Fix bug "Unable to load with drag and drop (from nautilus)"
git bisect bad a7357c1f59ea4961046e53d3350a855ea7e69ff7
# good: [c016cd61d91eb07d5baa8bfe7714fc68ac5e1ae2] 0.9: Cosmetic fixes, last round on win32.
git bisect good c016cd61d91eb07d5baa8bfe7714fc68ac5e1ae2
# bad: [4f9ae4eab1e9fbc00b676c6589f469a6cbbc2b54] Finally FIX the Navigation Bar & Picture Search Widget - escaping QGraphicsScene through Widgets though..
git bisect bad 4f9ae4eab1e9fbc00b676c6589f469a6cbbc2b54
# bad: [47e3cdaab6a6f8c3bcd6b8c5d9567eaa44513cf4] Smaller fix.
git bisect bad 47e3cdaab6a6f8c3bcd6b8c5d9567eaa44513cf4
# good: [69cfda605533685c791c362e3a57e806dca5a2c5] Small fix.
git bisect good 69cfda605533685c791c362e3a57e806dca5a2c5

Git a donc trouvé le premier mauvais commit « 47e3cdaab6a6f8c3bcd6b8c5d9567eaa44513cf4 is first bad commit« , et vous a placé dessus. Il ne vous reste plus qu’à trouver ce qui ne vas pas, et à le corriger dans la branche principale🙂

Aller plus loin

git bisect ne se limite pas aux fonctionnalités que j’ai décrites, c’est la base du fonctionnement de git bisect. Il est possible de lui faire automatiser la compilation/vérification en lançant un script sur chaque commit. Je vous laisse regarder la doc de git si vous avez besoin d’une telle fonctionnnalité.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :