Enfer et damnation, vous venez de constater un bug dans votre code. Évidemment, il est difficile de savoir à quel moment cette régression est apparue et en trouver l'origine pourrait nous permettre de comprendre et donc de résoudre le bug.
Heureusement, git-bisect
vient à votre secours, pour peu de savoir l'utiliser.
On commence donc par signifier à git que nous sommes dans un état "mauvais" du code :
git bisect bad
Vous devez démarrer avec "git bisect start"
Souhaitez-vous que je le fasse pour vous [Y/n] ? y
Il faut maintenant remonter suffisamment longtemps dans l'historique dans l'objectif de trouver l'état du code ou la régression constatée n'existait pas. Un petit git log
devrait suffire à identifier le commit-id correspondant.
git checkout <commit-id>
Après avoir vérifié que la régression n'existait pas dans cet état du code, on signifie à git-bisect
qu'on a une sous la main une version du code correcte.
git bisect good
Bissection : 132 révisions à tester après cette (à peu près 7 étapes)
[<commit-id>] <commit-message>
En retour, git-bisect
nous donne le nombre de révisions à tester (ici : 132), et le nombre d'étapes estimées avant d'obtenir le nom du coupable (ici : 7). Enfin, git-bisect
à effectué un checkout automatique sur un autre <commit-id>
et attend vos instructions.
Il ne reste qu'a tester le code et à donner comme instruction soit un git bisect good
, soit un git bisect bad
en fonction du résultat observé. L'opération sera plus ou moins longue en fonction du nombre de commits à tester.
➜ webapp git:(6ae90d246) git bisect good
Bissection : 132 révisions à tester après cette (à peu près 7 étapes)
[49cbe40d5cb63b9f2a036560190983b2848d6df0] Merge branch 'master' into deploy/staging
➜ webapp git:(49cbe40d5) ✗ git bisect good
Bissection : 66 révisions à tester après cette (à peu près 6 étapes)
[dc9c093633ca9af720ae560b01ff455d4bd4fb51] <commit-message>
➜ webapp git:(dc9c09363) ✗ git bisect good
Bissection : 33 révisions à tester après cette (à peu près 5 étapes)
[4f8b4fd5f7ecb71141510823e89f3d941f6d892b] <commit-message>
➜ webapp git:(4f8b4fd5f) git bisect bad
Bissection : 16 révisions à tester après cette (à peu près 4 étapes)
[0e5acfb262de5f692f8383cd51fe5c4bed729b92] <commit-message>
➜ webapp git:(0e5acfb26) git bisect good
Bissection : 7 révisions à tester après cette (à peu près 3 étapes)
[7623848ffee8d72429623e3b5fb8fb1a8040aeed] <commit-message>
➜ webapp git:(7623848ff) ✗ git bisect good
Bissection : 4 révisions à tester après cette (à peu près 2 étapes)
[50f6b9ebf42ff5cda83d33d4489e944829f87c56] <commit-message>
➜ webapp git:(50f6b9ebf) ✗ git bisect good
Bissection : 2 révisions à tester après cette (à peu près 1 étape)
[d763c0336e13cbc91befbe853194dd077775e6cd] <commit-message>
➜ webapp git:(d763c0336) git bisect good
Bissection : 0 révision à tester après cette (à peu près 1 étape)
[c1af98fc24e031d0d87a567caa7615c0c2c3d66c] <commit-message>
➜ webapp git:(c1af98fc2) git bisect bad
Bissection : 0 révision à tester après cette (à peu près 0 étape)
[026f9bf37555815c0efc9dfb16e90473faacf48f] <commit-message>
Une fois la dernière étape passé, git-bisect
vous donne l'identité du coupable :
git bisect bad
026f9bf37555815c0efc9dfb16e90473faacf48f is the first bad commit
Pour terminer, nous pouvons revenir à l'état initial du code (HEAD
)
git bisect reset
#article #git #nonclass #programming