Der Befehl git bisect bietet eine Möglichkeit, den Fehlerererkennungsprozess zu beschleunigen. Sie können das Problem schneller bestimmen. Mit Git Bisect können Sie eine Reihe von Commits definieren, von denen Sie vermuten, dass Sie den problematischen Code haben, und dann binäre Eliminierungsmethoden verwenden, um den Beginn des Problems zu finden. Das Finden von Bugs wird schneller und einfacher.
Lassen Sie uns ein Beispiel einrichten und einige Testfälle ausführen, um zu sehen, wie es funktioniert.
Beispiel -Setup
In unserem Beispiel werden wir einen Test erstellen.TXT -Datei und mit jedem Commit eine neue Zeile zur Datei hinzufügen. Nach 16 Commits sieht der endgültige Status der Datei so aus:
Hier ist mein guter Code 1
Hier ist mein guter Code 2
Hier ist mein guter Code 3
Hier ist mein guter Code 4
Hier ist mein guter Code 5
Hier ist mein guter Code 6
Hier ist mein guter Code 7
Hier ist mein guter Code 8
Hier ist mein schlechter Code 1 <-- BUG INTRODUCED HERE
Hier ist mein schlechter Code 2
Hier ist mein schlechter Code 3
Hier ist mein schlechter Code 4
Hier ist mein schlechter Code 5
Hier ist mein schlechter Code 6
Hier ist mein schlechter Code 7
Hier ist mein schlechter Code 8
Hier ist mein schlechter Code 9
Im obigen Beispiel stieg der Fehler nach 8 Commits in den Code ein. Wir haben den Code auch nach der Einführung des Fehlers weiterentwickelt.
Sie können einen Ordner namens my_bisect_test erstellen und die folgenden Befehle aus dem Ordner verwenden, um die Beispielsituation zu erstellen:
Git init
echo "Hier ist mein guter Code 1"> Test.txt
Git add -a && git Commit -m "My Commit 1"
Echo "Hier ist mein guter Code 2" >> Test.txt
Git add -a && git Commit -m "My Commit 2 (v1.0.0) "
Echo "Hier ist mein guter Code 3" >> Test.txt
Git add -a && git Commit -m "My Commit 3"
Echo "Hier ist mein guter Code 4" >> Test.txt
Git add -a && git Commit -m "My Commit 4"
Echo "Hier ist mein guter Code 5" >> Test.txt
Git add -a && git Commit -m "mein Commit 5 (v1.0.1) "
Echo "Hier ist mein guter Code 6" >> Test.txt
Git add -a && git Commit -m "My Commit 6"
Echo "Hier ist mein guter Code 7" >> Test.txt
Git add -a && git Commit -m "mein Commit 7 (v1.0.2) "
Echo "Hier ist mein guter Code 8" >> Test.txt
git add -a && git commit -m "mein Commit 8"
echo "Hier ist mein schlechter Code 1"> Test.txt
Git add -a && git Commit -m "My Commit 9"
Echo "Hier ist mein schlechter Code 2" >> Test.txt
git add -a && git commit -m "mein Commit 10"
Echo "Hier ist mein schlechter Code 3" >> Test.txt
Git add -a && git commit -m "mein Commit 11"
Echo "Hier ist mein schlechter Code 4" >> Test.txt
git add -a && git commit -m "mein Commit 12 (v1.0.3)"
Echo "Hier ist mein schlechter Code 5" >> Test.txt
Git add -a && git Commit -m "mein Commit 13"
Echo "Hier ist mein schlechter Code 6" >> Test.txt
Git add -a && git Commit -m "My Commit 14"
Echo "Hier ist mein schlechter Code 7" >> Test.txt
Git add -a && git Commit -m "mein Commit 15 (v1.0.4) "
Echo "Hier ist mein schlechter Code 8" >> Test.txt
Git add -a && git Commit -m "My Commit 16"
Geschichte überprüfen
Wenn Sie sich die Geschichte der Commits ansehen, sehen Sie Folgendes:
$ git log
Commit 3023B63EB42C7FADC93C2DD18B532A44A0A6888A
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:27 2017 -0800
Mein Commit 17
Commit 10EF0286D6459CD5DEA5038A54EDF36FC9BFE4C3
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:25 2017 -0800
Mein Commit 16
Commit 598D4C4ACAEB14CDA0552B6A92AA975C436D337A
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:23 2017 -0800
Mein Commit 15 (v1.0.4)
Commit B9678B75AC93D532EED22C2C6617E5A9D70FE7B
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:21 2017 -0800
Mein Commit 14
Commit EB3F2F7B0EBEDB732ECB5F18BEE786CD3CBBB521
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:19 2017 -0800
Mein Commit 13
Commit 3CB475A4693B704793946A878007B40A1FF67CD1
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:17 2017 -0800
Mein Commit 12 (v1.0.3)
Commit 0419a38d898e28c4db69064478ecab7736700310
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:15 2017 -0800
Mein Commit 11
Commit 15BC59201AC1F16AEAA233EB485E81FAD48FE35F
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:13 2017 -0800
Mein Commit 10
Commit A33E366AD9F6004A61A468B48B36E0C0C802A815
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:11 2017 -0800
Mein Commit 9
Commit EAD472D61F516067983D7E29D548FC856D6E6868
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:09 2017 -0800
Mein Commit 8
Commit 8995d427668768af88266f1e78213506586b0157
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:07 2017 -0800
Mein Commit 7 (v1.0.2)
Commit BE3B341559752E733C6392A16D6E87B5AF52E701
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:05 2017 -0800
Mein Commit 6
Commit C54B58BA8F73FB464222F30C90AA72F60B99BDA9
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:03 2017 -0800
Mein Commit 5 (v1.0.1)
Commit 264267111643EF5014E92E23FD2F306A10E93A64
Autor: Zak H
Datum: Sonne 31. Dezember 23:07:01 2017 -0800
Mein Commit 4
Commit CFD7127CD35F3C1A55EB7C6608ECAB75BE30B208
Autor: Zak H
Datum: Sonne 31. Dezember 23:06:59 2017 -0800
Mein Commit 3
Commit 3F90793B631DDCE7BE509C36B0244606A2C0E8AD
Autor: Zak H
Datum: Sonne 31. Dezember 23:06:57 2017 -0800
Mein Commit 2 (v1.0.0)
Commit CC163ADB8A3F7B7B52411DB2B3D8BAB9B7FB191E
Autor: Zak H
Datum: Sonne 31. Dezember 23:06:55 2017 -0800
Mein Commit 1
Selbst mit nur einer Handvoll Commits können Sie erkennen, dass es schwierig ist.
Den Fehler finden
Verwenden wir Git Log -online, um eine mehr aufgeräumte Version des Commit -Historie zu sehen.
$ Git -Protokoll -Einmal
3023b63 mein Commit 17
10EF028 mein Commit 16
598D4C4 My Commit 15 (v1.0.4)
B9678B7 mein Commit 14
eb3f2f7 mein Commit 13
3cb475a mein Commit 12 (v1.0.3)
0419a38 mein Commit 11
15bc592 mein Commit 10
a33e366 mein Commit 9
Ead472d mein Commit 8
8995D42 My Commit 7 (v1.0.2)
BE3B341 mein Commit 6
C54B58B mein Commit 5 (v1.0.1)
2642671 mein Commit 4
CFD7127 mein Commit 3
3F90793 My Commit 2 (v1.0.0)
CC163AD mein Commit 1
Wir möchten die Situation finden, in der die Zeile „Hier ist mein schlechter Code 1 <- BUG INTRODUCED HERE” entered the picture.
Angenommen, wir erinnern uns, dass unser Code bis v1 gut war.0.2 Und wir möchten von diesem Moment bis zum letzten Commit überprüfen. Wir beginnen zuerst den Halbierungsbefehl:
$ git halbsekt Start
Wir bieten die gute Grenze und die schlechte Grenze (kein Hash bedeutet den neuesten Code):
$ git halb gut 8995d42
$ git halbsekt schlecht
Ausgang:
Halbzeit: 4 Überarbeitungen, die danach testen müssen (ungefähr 2 Schritte)
[3CB475A4693B704793946A878007B40A1FF67CD1] My Commit 12 (v1.0.3)
Der Halbierungsbefehl hat den Mittelpunkt in unserem definierten Bereich festgestellt und den Code automatisch um 12 bestritten 12. Wir können unseren Code jetzt testen. In unserem Fall werden wir den Testinhalt des Tests ausgeben.txt:
$ CAT -Test.txt
Ausgang:
Hier ist mein guter Code 1
Hier ist mein guter Code 2
Hier ist mein guter Code 3
Hier ist mein guter Code 4
Hier ist mein guter Code 5
Hier ist mein guter Code 6
Hier ist mein guter Code 7
Hier ist mein guter Code 8
Hier ist mein schlechter Code 1 <-- BUG INTRODUCED HERE
Hier ist mein schlechter Code 2
Hier ist mein schlechter Code 3
Hier ist mein schlechter Code 4
Wir sehen, dass der Testzustand.TXT ist im Post-Bug-Zustand. Es ist also im schlechten Zustand. Also lassen wir den Halbzeitbefehl mit:
$ git halbsekt schlecht
Ausgang:
Halbierung: 2 Überarbeitungen, die danach testen müssen (ungefähr 1 Schritt)
[A33E366AD9F6004A61A468B48B36E0C0C802A815] My Commit 9
Es verschiebt unseren Code, um 9 zu begehen. Wir testen noch einmal:
$ CAT -Test.txt
Ausgang:
Hier ist mein guter Code 1
Hier ist mein guter Code 2
Hier ist mein guter Code 3
Hier ist mein guter Code 4
Hier ist mein guter Code 5
Hier ist mein guter Code 6
Hier ist mein guter Code 7
Hier ist mein guter Code 8
Hier ist mein schlechter Code 1 <-- BUG INTRODUCED HERE
Wir sehen, dass wir den Ausgangspunkt des Fehlers gefunden haben. Das Commit "A33E366 My Commit 9" ist der Schuldige.
Schließlich haben wir alles wieder normalisiert, bis:
$ git halbset zurücksetzen
Ausgang:
Vorherige Kopfposition war A33E366… mein Commit 9
Zum Branch "Master" umgestellt
Versuchen wir im gleichen Beispiel eine Situation, in der ein anderer Entwickler mit der Prämisse beginnt, dass der Fehler zwischen V1 eingeführt wurde.0.0 und v1.0.3. Wir können den Prozess wieder starten:
$ git halbsekt Start
$ git halb gut 3f90793
$ git halbset bad 3cb475a
Ausgang:
Halbzeit: 4 Überarbeitungen, die danach testen müssen (ungefähr 2 Schritte)
[8995d427668768af88266f1e78213506586b0157] Mein Commit 7 (v1.0.2)
Bisect hat unseren Code auf 7 oder v1 bewegt.0.2. Lassen Sie uns unseren Test durchführen:
$ CAT -Test.txt
Ausgang:
Hier ist mein guter Code 1
Hier ist mein guter Code 2
Hier ist mein guter Code 3
Hier ist mein guter Code 4
Hier ist mein guter Code 5
Hier ist mein guter Code 6
Hier ist mein guter Code 7
Wir sehen keinen schlechten Code. Lassen Sie Git halbsekt wissen:
$ git halbiert gut
Ausgang:
Halbierung: 2 Überarbeitungen, die danach testen müssen (ungefähr 1 Schritt)
[A33E366AD9F6004A61A468B48B36E0C0C802A815] My Commit 9
Es hat uns zu begehen 9. Wir testen noch einmal:
$ CAT -Test.txt
Ausgang:
Hier ist mein guter Code 1
Hier ist mein guter Code 2
Hier ist mein guter Code 3
Hier ist mein guter Code 4
Hier ist mein guter Code 5
Hier ist mein guter Code 6
Hier ist mein guter Code 7
Hier ist mein guter Code 8
Hier ist mein schlechter Code 1 <-- BUG INTRODUCED HERE
Wir haben erneut das Commit gefunden, das den Fehler eingeführt hat. Es war das Commit "A33E366 My Commit 9". Obwohl wir mit dem unterschiedlichen Verdachtsbereich begonnen haben, fanden wir in wenigen Schritten den gleichen Fehler.
Lassen Sie uns zurücksetzen:
$ git halbset zurücksetzen
Ausgang:
Vorherige Kopfposition war A33E366… mein Commit 9
Zum Branch "Master" umgestellt
Abschluss
Wie Sie aus dem Beispiel sehen können, können wir mit Git -Halbzeit ein Problem schneller bestimmen. Es ist ein großartiges Werkzeug, um Ihre Produktivität zu verbessern. Anstatt die gesamte Geschichte der Commits durchzugehen, können Sie einen systematischeren Ansatz zum Debuggen verfolgen.
https: // git-scm.com/docs/git-bisekt
https: // git-scm.com/book/en/v2/git-tools-debugging-with-git