Vous avez une régression en production et vous devez trouver le
commit coupable ? Git offre plusieurs outils de diagnostic :
git bisect effectue une recherche dichotomique dans l’historique,
git blame révèle l’auteur de chaque ligne, et git log -S
retrouve le commit qui a ajouté ou supprimé un mot-clé. Ce guide
couvre chaque outil avec des cas concrets.
Prérequis : Consulter l’historique et Chercher dans l’historique.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Utiliser
git bisectpour localiser un commit régressif - Automatiser bisect avec
bisect runet un script de test - Lire
git blamepour retracer l’origine d’un bug dans le code - Chercher dans l’historique avec
log -Setlog -L
Quel outil pour quel problème ?
Section intitulée « Quel outil pour quel problème ? »| Problème | Outil | Commande clé |
|---|---|---|
| Bug apparu entre deux versions | git bisect | Recherche dichotomique |
| Qui a modifié cette ligne ? | git blame | Annotation par ligne |
| Quand ce mot-clé a été ajouté/supprimé ? | git log -S | Recherche pickaxe |
| Comment cette fonction a évolué ? | git log -L | Historique d’un intervalle |
| Qui a le plus contribué ? | git shortlog | Statistiques auteur |
Trouver le commit coupable avec bisect
Section intitulée « Trouver le commit coupable avec bisect »git bisect effectue une recherche dichotomique : à chaque étape,
il vous propose un commit au milieu de l’intervalle [bon…mauvais] et
vous indiquez si le bug est présent ou non. En quelques étapes, il
identifie le commit exact.
Bisect manuel
Section intitulée « Bisect manuel »-
Lancez la session bisect
Fenêtre de terminal git bisect start -
Indiquez le commit actuel comme mauvais
Fenêtre de terminal git bisect badGit utilise HEAD par défaut. Vous pouvez spécifier un SHA :
git bisect bad a1b2c3d. -
Indiquez un commit où tout fonctionnait
Fenêtre de terminal git bisect good v1.2.0Utilisez un tag, un SHA, ou tout identifiant de commit.
-
Testez chaque commit proposé
Git checkout un commit au milieu et affiche le nombre d’étapes restantes :
Bisecting: 12 revisions left to test after this (roughly 4 steps)Testez le comportement, puis indiquez le résultat :
Fenêtre de terminal # Si le bug est présent :git bisect bad# Si le bug est absent :git bisect good -
Git identifie le commit coupable
Après quelques itérations :
a1b2c3d is the first bad commitcommit a1b2c3dAuthor: Alice <alice@example.com>Date: Mon Jan 15 10:30:00 2026refactor: changer le calcul de la TVA -
Terminez la session bisect
Fenêtre de terminal git bisect resetCela restaure HEAD à la position d’avant le bisect.
Bisect automatique avec bisect run
Section intitulée « Bisect automatique avec bisect run »Si vous disposez d’un script ou d’une commande qui retourne 0 (succès) quand le bug est absent et un code non-zéro quand le bug est présent, automatisez la recherche :
git bisect startgit bisect bad HEADgit bisect good v1.2.0git bisect run npm testGit exécute npm test à chaque étape et marque automatiquement le
commit comme bon ou mauvais selon le code de retour.
Avec un script personnalisé :
git bisect run ./test-regression.shLe script doit retourner :
- 0 : le commit est bon (pas de bug)
- 1-124, 126-127 : le commit est mauvais (bug présent)
- 125 : le commit ne peut pas être testé (skip)
Bisect avec des termes personnalisés
Section intitulée « Bisect avec des termes personnalisés »Pour un bug de performance, les termes « good/bad » peuvent prêter à confusion. Utilisez des termes personnalisés :
git bisect start --term-old=fast --term-new=slowgit bisect slow HEADgit bisect fast v1.2.0Identifier l’auteur d’un changement avec blame
Section intitulée « Identifier l’auteur d’un changement avec blame »git blame annote chaque ligne d’un fichier avec le SHA du commit, la
date et l’auteur :
git blame src/utils/tax.jsa1b2c3d4 (Alice 2026-01-15 10:30) const TAX_RATE = 0.20;e4f5a6b7 (Bob 2025-12-01 14:12) function calculateTax(amount) {a1b2c3d4 (Alice 2026-01-15 10:30) return amount * (1 + TAX_RATE);f1a2b3c4 (Carol 2025-11-20 09:45) }Blame sur un intervalle de lignes
Section intitulée « Blame sur un intervalle de lignes »Pour cibler un bloc spécifique :
git blame -L 10,25 src/utils/tax.jsAffiche uniquement les lignes 10 à 25.
Ignorer les commits de formatage
Section intitulée « Ignorer les commits de formatage »Un commit de reformatage (ajout de trailing commas, changement
d’indentation) pollue le blame. Créez un fichier
.git-blame-ignore-revs listant les SHA à ignorer :
# Reformatage prettier - 2025-06-15a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0Configurez Git pour l’utiliser automatiquement :
git config blame.ignoreRevsFile .git-blame-ignore-revsTous les appels à git blame ignoreront ces commits.
Chercher dans l’historique avec log -S (pickaxe)
Section intitulée « Chercher dans l’historique avec log -S (pickaxe) »git log -S retrouve les commits qui ont ajouté ou supprimé un
mot-clé dans le code source :
git log -S "TAX_RATE" --onelinea1b2c3d refactor: changer le calcul de la TVAf1a2b3c feat: ajouter le calcul de taxeCela montre les commits où TAX_RATE est apparu ou disparu
du diff.
Recherche par expression régulière
Section intitulée « Recherche par expression régulière »Pour une recherche plus flexible :
git log -G "TAX_RATE\s*=\s*0\.\d+" --oneline-G utilise une expression régulière au lieu d’une chaîne littérale.
Limiter à un fichier
Section intitulée « Limiter à un fichier »git log -S "TAX_RATE" -- src/utils/tax.jsL’opérateur -- sépare les options des chemins de fichiers.
Suivre l’évolution d’une fonction avec log -L
Section intitulée « Suivre l’évolution d’une fonction avec log -L »git log -L affiche l’historique des modifications d’un intervalle
de lignes ou d’une fonction :
Par nom de fonction
Section intitulée « Par nom de fonction »git log -L :calculateTax:src/utils/tax.jsGit identifie automatiquement les bornes de la fonction
calculateTax et montre chaque commit qui l’a modifiée, avec le diff
correspondant.
Par intervalle de lignes
Section intitulée « Par intervalle de lignes »git log -L 10,25:src/utils/tax.jsAffiche l’historique des modifications entre les lignes 10 et 25.
Statistiques avec shortlog
Section intitulée « Statistiques avec shortlog »git shortlog résume les contributions par auteur :
git shortlog -sn --no-merges 142 Alice 87 Bob 45 CarolOptions utiles :
| Option | Effet |
|---|---|
-s | Nombre de commits uniquement (pas de titres) |
-n | Tri par nombre de commits décroissant |
--no-merges | Exclut les commits de merge |
--since="2026-01-01" | Depuis une date |
Pour analyser un répertoire :
git shortlog -sn -- src/utils/Dépannage : problèmes courants
Section intitulée « Dépannage : problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
bisect propose des commits qui ne compilent pas | Certains commits intermédiaires cassent le build | git bisect skip ou code retour 125 dans le script |
blame montre un commit de formatage pour toutes les lignes | Reformatage massif du code | Créer .git-blame-ignore-revs et configurer blame.ignoreRevsFile |
log -S ne trouve rien | Le mot-clé n’a jamais été dans le diff | Essayez -G avec une regex, ou git grep "mot" pour chercher dans le contenu actuel |
log -L :func:file ne reconnaît pas la fonction | Langage non détecté par les patterns Git | Ajoutez un pattern personnalisé dans .gitattributes |
bisect run marque tout comme « bad » | Le script retourne toujours un code non-zéro | Testez le script manuellement sur un commit connu comme bon |
À retenir
Section intitulée « À retenir »git bisectest l’outil le plus efficace pour trouver un commit coupable — il divise l’intervalle par 2 à chaque étapebisect runautomatise la recherche avec un script qui retourne 0 (bon) ou 1 (mauvais)git blamerévèle qui a modifié chaque ligne — utilisez.git-blame-ignore-revspour exclure les commits de formatagegit log -S(pickaxe) retrouve le commit qui a ajouté ou supprimé un mot-clégit log -Lsuit l’évolution d’une fonction ou d’un intervalle de lignes dans le tempsgit shortlog -sndonne une vue statistique des contributions