Jede/r Entwickler/in kennt diesen einen Moment: „Das hat doch mal funktioniert!“ – Wie kann jetzt herausgefunden werden, was passiert ist?
Zum einen kann mühselig im Code danach gesucht werden, welche Änderungen dafür gesorgt haben, dass der Code nicht mehr funktionsfähig ist und zum anderen können wir uns der Kunst und Hilfe von GIT bemächtigen um das Problem zu finden.
GIT Bisect ist ein Verfahren welches auf das Prinzip „Teile und Herrsche“ beruht.
Teile und Herrsche ist ein Verfahren, bei dem das Gesamtproblem rekursiv in kleinere Einzelprobleme zerlegt wird, bis dieses gelöst (beherrscht) ist.
Wird dieses Verfahren auf GIT adaptiert, wird eine Menge von Commits, die das Gesamtproblem darstellen, auf kleinere Mengen von Commits beschränkt, bis der Commit gefunden wird, bei dem die Änderungen das Problem beinhalten (beherrscht).
Das Verfahren
Zunächst müssen wir GIT Bisect starten und die Menge von Commits definieren.
git bisect start git bisect bad git bisect good ae5c5a8
Wird bei $git bisect bad kein Commit mit angegeben, wird der aktuelle HEAD verwendet, sprich der aktuelle Stand des ausgecheckten Branches.
Somit haben wir eine Menge von Commits zwischen ae5c5a8 und HEAD definiert. GIT teilt nun die Menge der Commits in zwei Hälften und checkt einen Commit aus.
An dieser Stelle ist der/die Entwickler/in wieder an der Reihe zu überprüfen ob der Code hinter diesem Commit noch funktioniert. Ist das der Fall, wird mit
git bisect good
Bestätigt. Sollte das nicht der Fall sein, wird das mit
git bisect bad
angegeben. Somit wird die „gute“ Hälfte wieder in zwei Teile zerlegt und die Abfrage beginnt von vorne (Rekursion), bis der Commit für das „nicht funktionieren“ gefunden wird.
Das Ergebnis sieht wie folgt aus:
a0b5f980039f15e29fba0f17c186fae6c888bf42 is the first bad commit commit a0b5f980039f15e29fba0f17c186fae6c888bf42 Author: Tobias Janssen <example@example.com> Date: Wed Oct 7 14:44:24 2020 +0200 fix: anpassung tobias Telefonnummer Telefonbuch.txt | 2 +-
Das Ergebnis zeigt neben der Commit Details auch die Dateien an, die in diesem Commit angepasst wurden. Somit kann „der Übeltäter“ schnell ausfindig gemacht werden.
Um den GIT Bisect Modus wieder zu verlassen, können folgenden zwei Befehle verwendet werden:
git bisect reset git bisect git reset --hard <commitId>
Weitere hilfreiche Befehle sind folgende:
git bisect log
Zeigt alle Commits die während des Verfahrens überprüft wurden.
git bisect skip
Mit $ git bisect skip wird der aktuelle Commit übersprungen.
Somit ist GIT Bisect eine enorme Arbeitserleichterung um schnell herauszufinden warum der Code/die Software nicht mehr funktioniert.