Git
Bisecting / Fouten vinden commits
Zoeken…
Syntaxis
git bisect <subcommand> <options>
git bisect start <bad> [<good>...]
git bisect reset
git bisect good
git bisect bad
Binair zoeken (git bisect)
git bisect
kun je achterhalen welke commit een bug heeft geïntroduceerd met behulp van een binaire zoekopdracht.
Begin met het splitsen van een sessie door twee commit-referenties op te geven: een goede commit voor de bug en een slechte commit na de bug. Over het algemeen is de slechte commit HEAD
.
# start the git bisect session
$ git bisect start
# give a commit where the bug doesn't exist
$ git bisect good 49c747d
# give a commit where the bug exist
$ git bisect bad HEAD
git
start een binaire zoekopdracht: het splitst de revisie in twee en schakelt de repository naar de tussentijdse revisie. Inspecteer de code om te bepalen of de revisie goed of slecht is:
# tell git the revision is good,
# which means it doesn't contain the bug
$ git bisect good
# if the revision contains the bug,
# then tell git it's bad
$ git bisect bad
git
blijft de binaire zoekopdracht uitvoeren op elke resterende subset van slechte revisies, afhankelijk van je instructies. git
zal een enkele revisie presenteren die, tenzij je vlaggen incorrect waren, exact de revisie zal vertegenwoordigen waar de bug werd geïntroduceerd.
Vergeet daarna niet om git bisect reset
om de bisect-sessie te beëindigen en terug te keren naar HEAD.
$ git bisect reset
Als u een script hebt dat kan controleren op de bug, kunt u het proces automatiseren met:
$ git bisect run [script] [arguments]
Waar [script]
het pad naar uw script is en [arguments]
alle argumenten die aan uw script moeten worden doorgegeven.
Het uitvoeren van deze opdracht zal automatisch de binaire zoekopdracht doorlopen, waarbij git bisect good
of git bisect bad
bij elke stap wordt uitgevoerd, afhankelijk van de exitcode van je script. Verlaten met 0 betekent good
, terwijl afsluiten met 1-124, 126 of 127 slecht aangeeft. 125 geeft aan dat het script die revisie niet kan testen (waardoor een git bisect skip
wordt geactiveerd).
Zoek semi-automatisch een defecte commit
Stel je voor dat je op de master
branch zit en iets niet werkt zoals verwacht (een regressie werd geïntroduceerd), maar je weet niet waar. Alles wat je weet is, dat het werkte in de laatste release (die bijvoorbeeld getagd was of je kent de commit hash, laten we old-rel
hier nemen).
Git heeft hulp voor je, het vinden van de defecte commit die de regressie heeft geïntroduceerd met een zeer laag aantal stappen (binair zoeken).
Begin eerst met het in tweeën delen:
git bisect start master old-rel
Dit zal git vertellen dat master
een kapotte revisie is (of de eerste kapotte versie) en old-rel
is de laatst bekende versie.
Git zal nu een losgemaakt hoofd bekijken in het midden van beide commits. Nu kunt u uw testen doen. Afhankelijk van of het werkt of niet
git bisect good
of
git bisect bad
. In het geval dat deze commit niet getest kan worden, kun je gemakkelijk git reset
en die testen, git zal hiervoor zorgen.
Na een paar stappen zal git de defecte commit hash uitvoeren.
Om het bisect-proces af te breken, geeft u het gewoon op
git bisect reset
en git zal de vorige status herstellen.