git bisect und cherry-pick: Fehler finden und Commits übernehmen
Kurz: Mit git bisect findet man per Halbierung den Commit, der einen Fehler eingeführt hat; mit git cherry-pick übernimmt man einzelne Commits in einen anderen Branch.
Genauer: Zwei fortgeschrittene Git-Befehle, die im Alltag viel Zeit sparen. Beide setzen voraus, dass der Verlauf sauber in sinnvolle, kleine Commits gegliedert ist.
Im Detail
git bisect: Fehlersuche per Binärsuche
Du weißt: Vor drei Wochen funktionierte es, jetzt nicht mehr, dazwischen liegen 200 Commits. git bisect halbiert den Bereich wiederholt (Binärsuche), und nach etwa acht Schritten kennt man den Verursacher.
git bisect start
git bisect bad # aktueller Stand ist fehlerhaft
git bisect good v1.4.0 # dieser Stand war in Ordnung
# Git checkt einen mittleren Commit aus: testen, dann
git bisect good # oder: git bisect bad
# ... wiederholen, bis "<hash> is the first bad commit"
git bisect reset # zurück zum Ausgangszustand
Mit einem Testskript läuft es automatisch: git bisect run npm test (Exit-Code 0 = gut, 1 bis 127 = schlecht, 125 = überspringen).
git cherry-pick: einzelne Commits übernehmen
Normalerweise führt man ganze Branches zusammen (Merge). cherry-pick kopiert dagegen einen oder wenige Commits auf den aktuellen Branch:
git switch release/1.2
git cherry-pick 3f4a2b1 # einen Commit übernehmen
git cherry-pick A..B # einen Bereich
git cherry-pick -x 3f4a2b1 # Quelle in der Nachricht vermerken
Typischer Fall: Ein Fehler wurde im Hauptzweig behoben, soll aber auch in den Release-Zweig. Der übernommene Commit bekommt eine neue Hash-ID, weil er auf einem anderen Elternteil sitzt.
Konflikte und Fallen
Bei Konflikten hält Git an: Konflikt lösen, git add, dann git cherry-pick --continue (oder --abort). Wer Commits mehrfach übernimmt, erzeugt Duplikate im Verlauf, die später beim Zusammenführen verwirren können. Cherry-pick ersetzt keinen sauberen Branch-Workflow. Bei Bisect müssen die geprüften Stände bauen und testbar sein; mit git bisect skip überspringt man kaputte Zwischenstände.
Zusammenhang
Kleine, saubere Commits (siehe Conventional Commits) machen beide Werkzeuge erst wirksam: Ein riesiger Commit „Alles geändert“ lässt sich weder gezielt finden noch übernehmen. Auch git blame und git log -S helfen bei der Spurensuche.
Siehe auch: Git, Git Rebase, Merge-Konflikte, Conventional Commits