`git bisect` ist ein sehr nuetzliches Werkzeug um Regressionen zu finden, d.h. Fehler die in einer Codebasis im Laufe der Zeit eingefuehrt wurden. Hierbei hat man typischerweise eine alte Revision die fehlerfrei ist und eine neue Revision, die fehlerhaft ist.
## Beispielanwendung: Hello World
Das vorliegende "Hello World" ist ein triviales Beispiel um `git bisect` vorzufuehren.
## Vorbereitung
Zunaechst sollte das Repository ausgecheckt werden:
Zur halbautomatischen Suche der Revision, die den Fehler eingefuehrt hat kann man nun `git bisect` wie folgt beginnen:
```console
$git checkout master
Previous HEAD position was d208bcb... initial version of hello world
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$git bisect start
$git bisect bad
$git bisect good d208bcb
Bisecting: 5 revisions left to test after this (roughly 3 steps)
[2c463b9e8cc0b73fcacd82b99f51acfea2ea085c] germans are somewhat more formal...
```
Hiermit wurden nun die neueste Revision HEAD als kaputt und die aelteste d208bcb als funktionierend markiert. Im letzten Schritt hat `git bisect` automatisch eine ungefaehr in der Mitte befindliche Revision ausgecheckt, die nun getestet werden kann:
Die Testsuite befindet diese Revision fuer gut, weswegen man hier nun diese als gut markiert. `git bisect` checkt automatisch die naechste zu testende Revision aus:
```console
$git bisect good
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[b2a30db52966bf32b0928dc05eb67879390ff589] the new Texan owner of our company requested this
```
Waere der Test fehlgeschlagen haette man dies per `git bisect bad` angezeigt. Waere die Revision untestbar, was auch vorkommen kann wenn beispielsweise das Compilieren fehlschlaegt, so zeigt man diese per `git bisect skip` an. Das Testen und Markieren wiederholt man bis keine Schritte und Revisionen mehr uebrig sind und ein Ergebnis feststeht:
```console
<...>
$git bisect good
b2a30db52966bf32b0928dc05eb67879390ff589 is the first bad commit
commit b2a30db52966bf32b0928dc05eb67879390ff589
Author: Alexander Wuerstlein <arw@arw.name>
Date: Tue Jun 11 14:44:17 2013 +0200
the new Texan owner of our company requested this
:100644 100644 304528e494897bcc19d300d50c615882f8a4e20e 45ec4a19e69189070a83fd80266b4b71a839ed5b M hello.c
```
Mittels `git bisect log` oder `git bisect visualize` kann man sich den Verlauf oder die Uebergangsstelle ansehen. `git bisect reset` bringt die Arbeitskopie wieder in den Ursprungszustand.
## vollautomatisches git bisect
Die obigen iterativen Schritte, welche die Software wiederholt compilieren, testen und das Ergebnis an `git bisect` weiterleiten eignen sich sehr gut zur Automatisierung, wenn die Entscheidung ob der Test erfolgreich war vollautomatisch getroffen werden kann. Dann verkuerzt sich obige Beschreibung auf die Verwendung eines geeigneten Skriptes, hier [bisect.sh](bisect.sh):
```console
$git bisect start
$git bisect bad
$git bisect good d208bcb
Bisecting: 5 revisions left to test after this (roughly 3 steps)
[2c463b9e8cc0b73fcacd82b99f51acfea2ea085c] germans are somewhat more formal...
$git bisect run ./bisect.sh
<...>
[b6d36749a325e6a75a1ee83cf45a322f7eee7431] add missing header to make it compile