Gitgit bisect

Isoler les bugs avec git bisect

On rencontre souvent des situations où une fonctionnalité qui fonctionnait parfaitement se met soudainement à planter suite à une série de modifications. Identifier le commit fautif dans un historique de plusieurs dizaines, voire centaines de commits peut devenir une tâche laborieuse. Heureusement, git bisect est un outil de Git qui permet de localiser efficacement le commit en cause.

Principe de git bisect

git bisect fonctionne comme une recherche binaire (binary search).
Au lieu de tester chaque commit un par un, l’outil divise l’historique en deux parties et teste un commit à chaque étape, réduisant le nombre total de tests nécessaires.

good ou bad : À chaque étape, vous indiquez si le commit testé est “bon” (good) ou “mauvais” (bad).
Git navigue entre les commits, divisant l’historique en deux à chaque fois, pour réduire la zone de recherche. Objectif : En quelques étapes, Git isole le premier commit qui introduit le bug.

Pourquoi utiliser git bisect ?

Dans un contexte de développement, un bug peut rapidement entraîner des pertes de temps ou des erreurs. Un outil comme git bisect permet de :

  • Gagner en productivité en réduisant la durée d’investigation,
  • Améliorer la stabilité des fonctionnalités en identifiant rapidement des commits fautifs,
  • Faciliter le debugging en utilisant une approche structurée pour tester l’historique de modifications.

Étapes d’utilisation de git bisect

Démarrer la session de bisect

Commencez par indiquer à Git que vous souhaitez trouver un commit fautif.

git bisect start

Marquer le commit défectueux

Marquez le commit actuel (par exemple, HEAD) comme étant “mauvais” (bad) puisqu’il contient le bug :

git bisect bad
  1. Marquer un commit de référence bon Identifiez un commit dans l’historique où le code fonctionnait correctement et marquez-le comme “bon” (good) :
git bisect good <hash-du-commit>

Git sélectionnera alors un commit au milieu de la fourchette entre le commit bon et le commit mauvais et vous y placera.

  1. Tester et répéter Lancez les tests pour vérifier si le commit est “bon” ou “mauvais”. Indiquez ensuite à Git le résultat.
git bisect good   # Si le test est bon
git bisect bad    # Si le test est mauvais

Git continuera de naviguer à travers les commits pour diviser la fourchette jusqu’à isoler le commit fautif.

  1. Conclure la session de bisect Une fois que vous avez trouvé le commit fautif, terminez la session :
git bisect reset

Git reviendra alors à la branche d’origine et vous pourrez faire un fix sur le commit fautif.

Cas pratique

Vous pouvez restaurer une version précise d’un fichier depuis le commit bad pour corriger le bug.

git checkout <hash-du-commit> -- <chemin-du-fichier>

et par la suite créer un commit de fixup:

git commit --fixup <hash-du-commit>

enfin si vous êtes sur votre propre branche et que le commit bad provient de cette même branche il peut être judicieux de squash le commit de fixup:

git rebase --autosquash -i <hash-du-commit>

Exercice

C’est parti!