top of page

git bisect

  • 11 juin
  • 2 min de lecture

git bisect

ou la dichotomie appliquée à la recherche d’un bug 🙂


L’algorithme de recherche par dichotomie consiste à séparer une liste triée en 2 parties égales à chaque itération. Si l’élément cherché est dedans, on conserve, sinon on jette. Et on continue avec 2 fois moins d’éléments.


Vous avez déjà joué au Juste Prix ? Par exemple, vous savez que le prix à trouver est compris entre 100 € et 200 €. Alors commençons.

150 € ? Plus grand

175 € ? Plus petit

162 € ? Plus grand

169 € ? Bingo 🙂

4 itérations pour 100 possibilités.


Git peut faire la même chose avec les commits (une liste triée dans laquelle une partie des commits est saine et l’autre non)

Imaginez chercher un bug au milieu de 1 000 000 de commits… 20 étapes au maximum seront nécessaires pour trouver le commit qui a introduit le bug.


Ça vous dit ?

C’est parti !


Pour reprendre l’exemple arrangé du juste prix, il nous faut une fourchette de commit.

1 commit dont on est sûr qu’il est mauvais (contient le bug)

1 commit dont on est sûr qu’il est sain (pas encore le bug)

git bisect start
git bisect bad commit_bad
git bisect good commit_good

voire

git bisect start commit_bad commit_good

À partir de là, git va faire un checkout et ce sera à vous de tester/déterminer si ce commit est bon ou mauvais et de l’indiquer à git par un

git bisect good

ou

git bisect bad

À la fin des itérations, vous aurez un

e74c374f8e6c1215ca11453ebc0a97d9d055b149 is the first bad commit 

Enfin, il suffit de quitter l’environnement de bisection pour revenir au checkout initial avec un

git bisect reset

De rien 🙂


Encore quelques astuces :

Il se peut qu’un commit soit intestable pour des raisons qui ne sont pas liées au bug recherché. Dans ce cas, on peut utiliser le skip.

git bisect skip

Vous êtes interrompu pendant une bissection ? Pas de problème. Sauvegardez l’état actuel.

git bisect log > bisect.log
git bisect reset

Le dépôt sera restauré au checkout initial. Ensuite un simple replay pour reprendre.

git bisect replay bisect.log

Dernière astuce : si vous pouvez automatiser vos tests, faites-le ;) mais surtout, informez git du résultat avec le code de retour :

0 : good

125 : intestable

>0 : bad

git bisect run test_app.bat

La bissection se fera automatiquement, profitez-en. ;)


Vous ne vous en servirez peut-être pas tous les jours, mais la prochaine fois qu’un bug vous résiste, pensez git bisect ;)

git bisect, trouver une aiguille dans une botte de commits

 
 

© LH&TECH, tous droits réservés.

bottom of page