Der lise Blog:
Einsichten, Ansichten, Aussichten

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:

                  1. Mach viele kleine Commits
                  2. Such dich nicht kaputt. Nutze git bisect!

                   

                  Nach oben

                  Diesen Artikel weiterempfehlen

                   Teilen  Teilen  Teilen  Teilen