Git bisect: Wie identifiziere ich einen Fehler in Ihrem Code?



In diesem Artikel über git bisect erfahren Sie, wie der Befehl 'git bisect' beim Erkennen des ersten fehlerhaften Commits hilft, das einen Fehler mithilfe des binären Suchalgorithmus verursacht.

Mein Code funktionierte bis gestern einwandfrei, aber erst, als ein kürzlich erfolgter Abruf aus dem Remote-Repository den Code brach !!!

Wenn Sie sich in einer ähnlichen Situation befinden und es nicht wissen welche Änderung hat den Code gebrochen oder Wer von vielen Mitwirkenden besitzt Dies Fehler / Funktion , dann ist Git Bisect dein Ausweg. In diesem Artikel über Git-Halbierung erfahren Sie, wie dieGit-HalbierungBefehl kommt zu Rettung bei der Erkennung des ersten fehlerhaften Commits, das den Fehler mithilfe des binären Suchalgorithmus verursacht.

In diesem Artikel werden folgende Themen behandelt:





Warum Git Bisect verwenden?

Es besteht kein Zweifel daran, dass Sie dazu neigen, für jede geringfügige Änderung eine Reihe von Commits zu erstellen . In einem solchen Szenario wird das Debuggen des Codes zu einer mühsamen Aufgabe, da Sie manuell zu jeder einzelnen Revision des Projekt-Snapshots zurückkehren müssen, um den Arbeitscode zu testen und den Fehler zu erkennen. Das wird jetzt noch mehr Komplex Wenn Sie die Arbeit eines anderen ohne einen Leitpunkt inspizieren müssen, klingt es auch nicht sehr machbar, jeden zu bitten, seine eigenen Fehler zu beseitigen.
Unterwegs können Sie auch eine Reihe von Feature-Zweigen (oder Hotfix-Zweigen) erstellen und verwerfen und dabei Zeit und Mühe verschwenden, während Sie von der Hauptentwicklungslinie abweichen.



Um solche Szenarien zu vermeiden, können Sie die verwendenGit-HalbierungBefehl, um die fehlerhafte Projektrevision (oder den Snapshot) zu finden und sie schließlich mit dem zu behebenGit zurücksetzenBefehl.

Wie sucht 'Git Bisect'?



Dieser Befehl Halbierungen (teilt) Ihre Geschichte zwischen dem gut und der Schlecht verpflichten Angebot. Es zeigt auf deine aktuell Projekt Zustand zu einer Mittelklasse verpflichten Schnappschuss. Der Befehl git bisect bewegt sich dann durch jede Commit-ID zwischen diesem Bereich während Pause bei jedem Schnappschuss, damit Sie es können Testen Sie den Code . Wenn der Fehler vorliegt, deklarieren Sie das Commit als Schlecht, wenn nicht als gut es sei denn, die Suche endet.

Syntax

Git-Halbierung

Um Git Bisect besser zu verstehen, erstellen wir ein Projekt, das den Code für eine einfache Navigations-App entwickelt, die in einem Auto verwendet werden kann.

Erstes Projekt-Setup

Führen Sie die folgenden Schritte aus, um ein Projekt zu erstellen, das den Code für eine einfache Navigations-App zur Verwendung in einem Auto entwickelt:

Schritt 1: Erstellen Sie ein neues Verzeichnis in Ihrem $ HOME-Ordner:

cd $ HOME mkdir my_nav_app

Schritt 2: Navigieren Sie zum neuen Verzeichnis:

Beispiel einer Instanzvariablen in Java
cd $ my_nav_app

Schritt 3: Klonen Sie, um das Projekt von meiner GitHub-Seite herunterzuladen:

Git-Klon https://github.com/divyabhushan/my_nav_app.git

Lassen Sie uns nun die Projektverzeichnisse und das Dateilayout verstehen, die mit dem Befehl gedruckt werden:ls -lTR

Quellcode-Layout - Git Bisect - Edureka

Lassen Sie uns als Nächstes das Projektverlaufsjournal anzeigen, um die Commits anzuzeigen, die ich vorgenommen habe, um diesen Code zu generieren.

Zum Beispiel druckt ein einfacher git log-Befehl den Verlauf im Detail, ich mag es jedoch, den Verlauf hübsch zu formatieren und anzupassen. Lassen Sie uns dabei Legen Sie einen Aliasnamen fest - 'hist' Verwendung der Git Alias Befehl wie unten gezeigt:

git alias.hist 'log --pretty = format:'% C (gelb)% h% Creset% ad | % C (grün)% s% Kreset% C (rot)% d% Kreset% C (blau) [% an] '--graph --decorate --date = short'

Jetzt werde ich diese Fehlerbehebungsfunktion in einem separaten Zweig ausführen, um die Hauptentwicklung im Hauptzweig nicht zu beeinträchtigen. Befolgen Sie dazu die folgenden Befehle:

  • Erstellen Sie den Zweig 'dev': [Meister] $Git Branch Dev
  • Wechseln Sie zum Zweig 'dev': $Git Checkout Dev
  • Listen Sie die Verlaufsprotokolle auf: [dev] $geh hist[Hinweis: Der hier verwendete Befehl 'Alias']

Außerdem habe ich das letzte bekannte gute Commit hervorgehoben, von dem ich weiß, dass mein Skript mit den erwarteten Testergebnissen einwandfrei funktioniert hat. Dieser Commit-Snapshot ist getaggt als v1.0.

Nachdem wir nun unser letztes gutes Commit kennen, lassen Sie uns in diesem Artikel über „Git Bisect“ fortfahren und die Anwendung testen.

Testen Sie die Anwendung

Führen Sie das Skript als - $ aus./scripts/myApplication.sh[Erstes Testen]



Mein aktueller Projektstatus ist eindeutig in Error und ich bin mir nicht sicher, welche Änderung ich an welchem ​​Commit vorgenommen habe, das diese Änderung eingeführt hat. Lassen Sie uns als nächstes in diesem Artikel über Git Bisect sehen, wie Sie das schlechte Commit identifizieren können.

Identifizierung des schlechten Commits

Führen Sie die folgenden Schritte aus, um mit der Überprüfung auf das schlechte Commit zu beginnen:

  • Starten Sie den Befehl halbieren ::Git Bisect Start
  • Erwähnen Sie die ID für das schlechte Commit: git bisect bad HEADodergit bisect c5b3ca8
  • Erwähnen Sie die letzte bekannte Good-Commit-ID: git bisect good v1.0oderGit-Halbierung 93859d8

Dies halbiert den Bereich des Commit-Verlaufs ungefähr in der Mitte zwischen den guten und schlechten Commits, der uns zur Commit-ID bringt: f61a7e8

Daher hat der Befehl die Projektversion wie in dieser Festschreibungs-ID ausgecheckt. Lassen Sie uns nun fortfahren und unsere Anwendung erneut testen.

Befehl zum Ausführen der Anwendung : $./scripts/myApplication.sh[zweites Mal testen]


Seit der Anwendung bestanden Bei diesem Commit ist dieses Commit sicherlich kein schlechtes Commit. Als nächstes müssen Sie dem bisect-Befehl dasselbe mitteilen wie - $git bisect gut


Dadurch wird das Suchergebnis wie gezeigt weiter auf die erste Hälfte des Bereichs eingegrenzt.


Testen Sie Ihre Anwendung erneut - Befehl: $./scripts/myApplication.sh[drittes Testen]


Da wir also wie oben einen Fehler sehen, ist dies ein schlechtes Commit.

Lassen Sie den Befehl bisect wissen und führen Sie $ ausgit bisect schlecht


Das schränkt die Suche weiter ein und bringt Sie zur letzten blau eingekreisten mittleren Revision: a6ac769

Also teste ich meine Anwendung ein letztes Mal mit demselben Befehl: $./scripts/myApplication.sh[Test zum vierten Mal]

Da die Anwendung nun erneut fehlgeschlagen ist, handelt es sich immer noch um ein schlechtes Commit. Führen Sie also den folgenden Befehl aus:

Führen Sie den folgenden Befehl aus: git bisect schlecht

Schlechtes Commit gefunden

Dies schließt das einzige letzte Commit ab, das noch übrig ist.


Sie wissen also, dass hier der Code gebrochen ist. Was als nächstes?

Verstehe, welche Datei den Fehler hatte

In diesem Fall gibt Ihnen die Ausgabe nur minimale Informationen über die ID festschreiben , Autorenname , und der Erstellungsdatum zusammen mit Nachricht festschreiben und der Pfad das wurde geändert.

Wenn Sie weiter debuggen möchten, müssen Sie lesen das ID-Objekt festschreiben .

Befehl: git show a6ac76994b3f6c7519204f910fc787b7928cf8ef

pmi-acp lohnt sich

Dadurch wird das Festschreibungsobjekt gelesen und die Protokollnachricht und der Textdiff gedruckt.

Sie können auch den Befehl 'Git-Schuld' verwenden, um zu analysieren, wie und in welchem ​​Commit jede Zeile von welchem ​​Autor geändert wurde. Führen Sie den Befehl wie folgt aus:Git Schuld Code / Develop_nav.sh

Stoppen Sie die Suche

Verwenden Sie den folgenden Befehl, um die Suche zu beenden:

Befehl: Git Bisect Reset


Somit wird der Halbierungsprozess gestoppt und Sie befinden sich wieder in dem Zweig, von dem aus Sie die Suche gestartet haben. Der nächste Schritt besteht nun darin, den Code zu reparieren oder zu debuggen.

Wie kann ich den Code reparieren / debuggen?

Nun, es gibt einige Problemumgehungen, mit denen Sie den aktuellen Status des Projekts beheben können, nachdem Sie das Commit identifiziert haben, das den Fehler verursacht hat.
Wenn Sie jedoch ein Commit für a ändern freigegebenes Repository es ist am besten zu zurückkehren die Änderung mit dem ‘ Git zurücksetzen ' Befehl.

Aufgabe: Setzen Sie die durch das erwähnte schlechte Commit vorgenommenen Änderungen zurück

Befehl: git revert a6ac769

Infolgedessen hat das Zurücksetzen der durch dieses Commit vorgenommenen Änderungen zwei Dinge bewirkt:

  • Es löschte die letzten 3 hinzugefügten Zeilen (grün markiert) und fügte die gelöschte Zeile (rot angezeigt) zurück. (Rückseite von a6ac769)
  • Erstellt ein zusätzliches Commit mit den Informationen zum Zurücksetzen von Nachrichten

'Der Befehl' Zurücksetzen 'erleichtert auch das Verfolgen der Änderung, die Sie vom ursprünglichen Commit zurückgesetzt haben.'

Verwenden Sie die 'Show' Befehl erneut, um die Objekt-ID zu lesen, wie z.

Befehl: Git Show 801f029

Fahren Sie nun fort und testen Sie die Anwendung. Es wird ordnungsgemäß ausgeführt.

Befehl: $./scripts/myApplication.sh

Wenn Sie dagegen das fehlerhafte Commit aus dem Verlauf entfernen möchten:

  • Sie könnten die ‘ Git zurücksetzen ‘Befehl mit dem“--schwerOption (obwohl in einem freigegebenen Repository nicht empfohlen).

  • Überprüfen Sie eine frühere Version einer einzelnen Datei mit dem Befehl „Git CheckoutBefehl mit dem- -' Möglichkeit.

Es ist zu beachten, dass dies nur Änderungen in Ihrem lokalen Repository vornimmt, bis Sie die Änderungen in ein Remote-Repository übertragen. Da einige Änderungen wie in unserem obigen Fall eine neue Festschreibungsobjekt-ID erstellen, wird in solchen Fällen ein normaler Push an das Remote-Repository abgelehnt, da der Verlauf divergiert hätte. Sie müssen das ‘ Git Push Befehl mit dem--Macht' Möglichkeit.

Aktualisieren Sie den Hauptzweig

Während ich den Fehler in meinem 'dev'-Zweig behoben habe, kann ich diese Änderung jetzt auch mit dem' master'-Zweig zusammenführen.

  • Wechseln Sie zu 'Master', Befehl:Git Checkout Master
  • Ziehen Sie die letzten Aktualisierungen von 'Ursprung / Master' zu 'Master'. Befehl:Git Pull Ursprung
  • Zusammenführen von 'dev' -Änderungen, Befehl:Git Merge Riese

Ihre Zusammenführung kann jedoch zu Konflikten führen, wenn mehr Commits aus dem Remote-Repository vorhanden sind. Lösen Sie Konflikte und fahren Sie mit der Zusammenführung fort.
Schieben Sie schließlich nur die stabilen Commits des Hauptzweigs in das Remote-Repository, während Sie Ihre Drecksarbeit (Fehler, Funktionen, Verbesserungen) nur für die Funktionszweige wie in diesem Beispiel wie 'dev' ausführen.
Darüber hinaus ist es am besten, eine logische zu übernehmen Verzweigungsstrategie um Ihren Git-Workflow-Prozess zu optimieren und zu sichern.

Zusammenfassend ist „git bisect“ so schnell ein praktischer und nützlicher Befehl identifizieren das ID festschreiben Das eingeführt zu Fehler in Ihrem laufenden Code mit Hilfe eines umfangreichen binäre Suche durch logisch Teilen Das Commit protokolliert auf halbem Weg zwischen dem gut und Schlecht verpflichten Angebot . Abschließend haben Sie gelernt erkennen das fehlerhafte Festschreiben und zurückkehren die dadurch vorgenommene Änderung.

Zusätzlich zu den Unterbefehlen 'gut' und 'schlecht' können Sie auch Begriffe wie 'neu' und 'alt' verwenden, um den Revisionsstatus zu beschreiben. Sie können den Befehl mehrmals ausführen, indem Sie verschiedene Unterbefehle und Revisions- / Festschreibungs-IDs übergeben, um verschiedene Festschreibungs-IDs (she-1) zu identifizieren. Alternativ kann auch ein automatisiertes Testskript ausgeführt werden, um den fehlerhaften Code mit diesem Befehl zu erstellen. Eine detaillierte Beschreibung dieses Befehls finden Sie auch, indem Sie ausführengit bisect --helpauf dem Terminal. Also, Leute damit, wir haben ein Ende dieses Artikels über Git Bisect.

Die Absicht von DevOps ist es, schneller und zuverlässiger Software von besserer Qualität zu erstellen und gleichzeitig eine bessere Kommunikation und Zusammenarbeit zwischen Teams zu ermöglichen. Wenn Sie von diesem Artikel fasziniert sind, c verdammt noch mal von Edureka, einem vertrauenswürdigen Online-Lernunternehmen mit einem Netzwerk von mehr als 250.000 zufriedenen Lernenden auf der ganzen Welt. Der Edureka DevOps Certification Training-Kurs hilft den Lernenden, zu verstehen, was DevOps ist, und Fachwissen über verschiedene DevOps-Prozesse und -Tools wie Puppet, Jenkins, Nagios, Ansible, Chef, Saltstack und GIT zu erwerben, um mehrere Schritte in SDLC zu automatisieren.

Hast du eine Frage an uns? Bitte erwähnen Sie es im Kommentarbereich des Artikels 'Git Bisect' und wir werden uns umgehend bei Ihnen melden.