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_goodvoire
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 goodou
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 resetDe 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 skipVous êtes interrompu pendant une bissection ? Pas de problème. Sauvegardez l’état actuel.
git bisect log > bisect.log
git bisect resetLe dépôt sera restauré au checkout initial. Ensuite un simple replay pour reprendre.
git bisect replay bisect.logDerniè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.batLa 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 ;)

