Commits schneller finden mit git bisect
Oft genug habe ich diese Situation erlebt: Ich habe ein paar Änderungen am Code vorgenommen und ab und an einen kleinen Commit dazwischen geschoben. Nach etlichen weiteren lasse ich mal wieder die Integrationstests laufen - und siehe da, ein Fehler hat sich eingeschlichen.
Gut: Das lässt sich finden. Dazu muss ich muss nur die Commits durchgehen. Das kann aber sehr mühselig sein, zumal diese manuelle Vorgehensweise langsam und fehleranfällig ist.
Zur Abhilfe gibt es git bisect. Das übernimmt die Arbeit für mich. Git bisect wird direkt mit git ausgeliefert. Einige git-Tools haben es auch direkt integriert (z.B. Fork). Hier will ich kurz zeigen, wie bequem das in IntelliJ geht. Dafür wird das kleine Plugin git bisect run benötigt.
Schritt 1: Ohje! Ein Test schlägt fehl!
Ein Unit-Test misslingt. Wir müssen nun nur irgendwie herausfinden, welcher.
Schritt 2: Mit git bisect Test auswählen
Entsprechenden Test mit git bisect über das Kontextmenü auswählen und laufen lassen.
Schritt 3: Commit auswählen
Im Dialog muss ich nun eintragen, bei welchem Commit der Test fehlschlägt und bei welchem es noch funktioniert hat.
Schritt 4: Bad revision eintragen
Als "Bad revision" trage ich meinen aktuellen Branch ein (HEAD-commit)
Schritt 5: Good revision eintragen
Um die "Good revision" zu finden, muss ich ein bisschen suchen. In diesem Fall glaube ich, dass der Commit von vor ca. einer Woche noch okay war.
Schritt 6: Prüfsumme kopieren
Die Prüfsumme (SHA1) des Commits noch kopieren und im Bisect-Dialog eintragen. Dann starten!
Schritt 7: bisect läuft
Bisect läuft nun. Das kann ein bisschen dauern: Eine binäre Suche geht über alle Commits und führt den Test aus. Anhand dessen Ergebnis (Fehlschlag/Erfolg) sucht git bisect den fehlerhaften Commit.
Schritt 8: Aktueller Fortschritt
Das Plugin zeigt mir auch den aktuellen Fortschritt an und wie lange es wohl noch braucht.
Schritt 9: Ergebnis anzeigen
Nach etwas Zeit (bei mir zum Glück nur ein paar Minuten) präsentiert mir git bisect das Ergebnis: Der Übeltäter bin ich (wer sonst). Ich kann nun via "Show in Git log" zum Commit wechseln und mir diesen ansehen. (Den Bisect-Vorgang beende ich mit Reset.)
Schritt 10: Commit-Änderung analysieren
Im Git-Log in IntelliJ sehe ich direkt, was im Commit geändert wurde. Ab jetzt muss ich selbst nachdenken.
Fazit:
- Mach viele kleine Commits
- Such dich nicht kaputt. Nutze git bisect!
Du bist Softwareentwickler:in? Und suchst nach einem agilen und dynamischen Team? Hier geht's zu unserer Jobbörse.