Git Bisect à l’aide pour déboguer votre code

Git est un environnement riche et sophistiqué. Il héberge quelques perles, Git Bisect est l’une d’entre elles.

Le problème que tente de résoudre Bisect est la recherche du moment où une régression s’est produite dans votre code. Il fonctionnait à un certain moment, mais il s’est produit une régression dans l’histoire des différents commits. Lequel est le coupable?

Bisect va automatiquement faire des checkouts dans chaque commit situés entre le moment où tout est bon et celui où tout va mal. A chaque étape vous pouvez effectuer un test ou demander à Bisect de le faire pour vous. La recherche est alors automatique.

On recherche de proche en proche le commit à partir duquel la régression à eu lieu.

Cet article à pour objectif d’expliquer comment fonctionne Bisect, nous ferons des démos dans les articles qui suivent.

Comment fonctionne Bisect

Regardons cette infographie:

2022-02-19_11-34-52

A gauche la situation de départ. Nous sommes sur une branche qui a reçue une série de commits C1 à C7.

On découvre une régression au niveau du commit en cours (C7). On sait par ailleurs que tout fonctionnait lors du commit C2. La régression s’est donc produite entre C2 et C7.

Git Bisect va nous aider à retrouver qui est le responsable!

La notion importante dans Bisect est celle de GOOD/BAD.

GOOD désigne un commit où tout se passait bien. BAD désigne un commit où le problème se produit. C’est ce que nous voyons sur l’infographie.

  1. Bisect va successivement choisir un commit entre GOOD et BAD
    Le choix est fait par dichotomie
  2. Bisect fait checkout sur ce commit
  3. Vous testez ou demandez à Bisect de tester
  4. Selon le résultat du test, le commit est déclaré BAD ou GOOD
    C’est ce que l’on voit sur l’infographie qui suit à gauche. 

2022-02-19_11-43-42

On a alors un nouveau couple GOOD/BAD. Le commit est déclaré GOOD. Par conséquent tous les commits qui précèdent son GOOD.

Bisect recommence l’opération précédente, la nouvelle cible est donc C6 que l’on teste à nouveau.

Il y a deux cas de figure:

  1. C6 est BAD
    Dans ce cas la régression doit être recherchée dans C6
  2. C6 est GOOD
    Dans ce cas la régression doit être recherchée dans le dernier commit, C7

2022-02-19_11-49-39

Le principe est donc très simple. 

Quelques réflexions

Tout d’abord la notion de BAD et GOOD que recouvre t’elle? Git Bisect ne donne aucune recommandation autre que celle-ci:

La situation doit être facile à caractériser et reproductible.

Bisect ne vous aidera pas vraiment sur une anomalie non reproductible.

Une anomalie c’est ce que vous définissez comme tel. Ce peut être un bug, un plantage, une latence qui augmente, une fuite mémoire…

Ce doit être testable, rien d’autre.

La procédure de navigation dans les commits est automatiquement prise en charge par Git Bisect. Concernant les tests cela dépend de ce que vous recherchez.

Si le test est scriptable (par exemple un code de retour, des tests unitaires…), alors on peut demander à Bisect de le lancer automatiquement et faire la recherche de bout en bout tout seul.

Un dernier point. L’objectif de Bisect est de circonscrire la recherche d’une régression à un petit périmètre: un commit.

Encore faut t’il que le périmètre soit limité. C’est pour cette raison que l’on déconseille de faire de gros commits avec de très nombreuses modifications. 

2 commentaires sur « Git Bisect à l’aide pour déboguer votre code »

  1. De ce que je comprend tu penses que l’unité de la dichotomie est le commit ? J’avais pour espoir que cela soit au lignes de codes qui ont changées. As tu eu le temps de gratter cette partie là ?

  2. C’est bien le commit. Pas la ligne de code. D’où l’importance d’éviter les commits fourre-tout. Bisect est un outil purement Git.

    Le prochain article montrera Bisect en action, ce sera plus clair.

Votre 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 )

Connexion à %s