GIT Bisect – das hat mal funktioniert

Tobias Janssen

Backend Software-Developer und GIT Enthusiast bei traperto GmbH

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.

Teile und Herrsche Prinzip

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.