So überprüfen Sie, ob ein Git-Commit im Reflog vorhanden ist

GitGitBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie den leistungsstarken Befehl git reflog verwenden können, um die Historie Ihres HEAD in einem Git-Repository zu verfolgen. Sie werden entdecken, wie das Reflog wie ein persönliches Tagebuch Ihrer Aktionen fungiert und Commits, Merges, Rebases und vieles mehr aufzeichnet, auch für Commits, die von keinem Branch mehr erreicht werden können.

Durch praktische Schritte lernen Sie, Reflog-Einträge aufzulisten, das Reflog nach bestimmten Commit-Hashes zu durchsuchen und zu verstehen, wie Reflog-Einträge ablaufen. In diesem Lab erhalten Sie das Wissen, um das Reflog als wichtiges Werkzeug zum Wiederherstellen verlorener Arbeit und zum Verständnis der Historie Ihres Repositorys zu nutzen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BranchManagementGroup -.-> git/log("Show Commits") git/BranchManagementGroup -.-> git/reflog("Log Ref Changes") subgraph Lab Skills git/log -.-> lab-560061{{"So überprüfen Sie, ob ein Git-Commit im Reflog vorhanden ist"}} git/reflog -.-> lab-560061{{"So überprüfen Sie, ob ein Git-Commit im Reflog vorhanden ist"}} end

Ausführen von git reflog zum Auflisten der Einträge

In diesem Schritt werden wir einen leistungsstarken Git-Befehl namens git reflog erkunden. Stellen Sie sich das Reflog als Ihr persönliches Tagebuch aller Aktionen vor, die Sie in Ihrem Git-Repository ausgeführt haben. Es protokolliert, wann Sie Commits vorgenommen, Commits geändert, Branches gemerged, Rebases durchgeführt und sogar wenn Sie versehentlich Ihr Repository zurückgesetzt haben.

Der Befehl git reflog ist unglaublich nützlich, um verlorene Commits wiederherzustellen oder die Historie Ihres Repositorys zu verstehen, auch wenn diese Commits von keinem Branch mehr erreicht werden können.

Lassen Sie uns das Reflog für unser my-time-machine-Repository anzeigen. Stellen Sie zunächst sicher, dass Sie sich im richtigen Verzeichnis befinden:

cd ~/project/my-time-machine

Führen Sie nun den Befehl git reflog aus:

git reflog

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

a1b2c3d (HEAD -> master) HEAD@{0}: commit: Send a message to the future
a1b2c3d (HEAD -> master) HEAD@{1}: initial commit (master)

Lassen Sie uns diese Ausgabe analysieren:

  • a1b2c3d: Dies ist der kurze Commit-Hash, ein eindeutiger Bezeichner für jeden Commit.
  • (HEAD -> master): Dies zeigt an, dass der HEAD (Ihre aktuelle Position) und der master-Branch auf diesen Commit verweisen.
  • HEAD@{0}: Dies ist der Reflog-Eintrag für den aktuellen Zustand von HEAD. Die Zahl in geschweiften Klammern {} gibt an, wie viele Schritte zurück dieser Eintrag erstellt wurde. {0} ist der neueste Eintrag.
  • HEAD@{1}: Dies ist der vorherige Reflog-Eintrag.
  • commit: Send a message to the future: Dies ist die ausgeführte Aktion (ein Commit) und die Commit-Nachricht.
  • initial commit (master): Dies zeigt den ersten Commit an, als das Repository erstellt wurde.

Das Reflog zeigt eine chronologische Historie der Positionen, an denen sich Ihr HEAD befand. Dies unterscheidet sich von git log, das die Historie der von der aktuellen Branch erreichbaren Commits anzeigt. Das Reflog verfolgt Ihre Aktionen und dient somit als Sicherheitsnetz zum Wiederherstellen verlorener Arbeit.

Das Verständnis des Reflogs ist wie eine detaillierte Karte Ihrer Zeitreise-Abenteuer. Es zeigt Ihnen jeden Ort, den Sie besucht haben, auch wenn Sie seitdem zu einer anderen Zeitlinie (Branch) gewechselt haben.

Suchen im Reflog nach einem Commit-Hash

Im vorherigen Schritt haben wir die Ausgabe von git reflog gesehen. Jeder Eintrag im Reflog entspricht einem bestimmten Zustand des HEAD in Ihrem Repository. Diese Zustände werden durch einen Commit-Hash identifiziert.

Manchmal müssen Sie möglicherweise einen bestimmten Punkt in der Reflog-Historie finden, vielleicht um einen verlorenen Commit wiederherzustellen oder um zu sehen, wie Ihr Repository zu einem bestimmten Zeitpunkt aussah. Sie können den Commit-Hash aus der git reflog-Ausgabe verwenden, um auf diese bestimmten Punkte zu verweisen.

Versuchen wir, den Zustand unseres Repositorys zum Zeitpunkt des ersten Commits anzuzeigen. Aus der git reflog-Ausgabe im vorherigen Schritt sah der Eintrag für den ersten Commit so aus:

a1b2c3d (HEAD -> master) HEAD@{1}: initial commit (master)

Der Commit-Hash für den ersten Commit ist a1b2c3d (Ihr Hash wird anders sein). Wir können diesen Hash mit Git-Befehlen verwenden, um auf diesen bestimmten Zustand zu verweisen.

Beispielsweise können Sie die Commit-Details des ersten Commits anzeigen, indem Sie git show gefolgt vom Hash verwenden. Ersetzen Sie a1b2c3d durch den tatsächlichen Hash aus Ihrer git reflog-Ausgabe für den ersten Commit.

git show a1b2c3d

Sie sollten eine Ausgabe ähnlich der folgenden sehen, die die Details des ersten Commits zeigt:

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
Author: Jane Doe <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

diff --git a/message.txt b/message.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/message.txt
@@ -0,0 +1 @@
+Hello, Future Me

Dies zeigt, wie Sie die Commit-Hashes aus dem Reflog verwenden können, um bestimmte Momente in der Historie Ihres Repositorys zu identifizieren. Dies ist eine wichtige Fähigkeit, um in Git fehlerfrei zu navigieren und Fehler zu beheben.

Denken Sie daran, dass das Reflog Ihr Sicherheitsnetz ist. Selbst wenn ein Commit nicht mehr Teil der Historie eines Branches ist, solange er im Reflog enthalten ist, können Sie ihn normalerweise mithilfe seines Hashes finden und wiederherstellen.

Testen von abgelaufenen Reflog-Einträgen

In diesem Schritt werden wir lernen, wie Git das Reflog verwaltet und wie Einträge schließlich ablaufen können. Standardmäßig behält Git Reflog-Einträge für eine bestimmte Zeitspanne. Erreichbare Einträge (die von einem Branch oder Tag referenziert werden) werden 90 Tage lang aufbewahrt, während nicht erreichbare Einträge (die von nichts referenziert werden) 30 Tage lang aufbewahrt werden. Nach diesen Zeiträumen kann der Garbage-Collection-Prozess von Git diese Einträge entfernen.

Da wir in diesem Lab nicht die Zeitablaufsimulation durchführen können, um zu sehen, wie Einträge natürlich ablaufen, können wir manuell den Garbage-Collection-Prozess von Git mit einer bestimmten Option auslösen, um alte Reflog-Einträge zu bereinigen (zu entfernen).

Wichtig: Das Ausführen dieses Befehls wird ältere Reflog-Einträge basierend auf den konfigurierten Ablaufzeiten entfernen. In der Praxis würden Sie normalerweise diesen Befehl nicht manuell ausführen, es sei denn, Sie haben einen bestimmten Grund, alte Reflog-Einträge zu bereinigen.

Stellen Sie zunächst sicher, dass Sie sich im Verzeichnis my-time-machine befinden:

cd ~/project/my-time-machine

Führen wir nun den Garbage-Collection-Befehl mit der Option zum Bereinigen von Reflog-Einträgen aus. Wir werden eine sehr kurze Ablaufzeit für nicht erreichbare Einträge festlegen, um die Wirkung zu demonstrieren.

git gc --prune=now --aggressive

Dieser Befehl teilt Git, sofort die Garbage Collection auszuführen (--prune=now) und aggressiv (--aggressive) lose Objekte zu bereinigen und nicht erreichbare Reflog-Einträge zu entfernen.

Nachdem der Befehl ausgeführt wurde, überprüfen wir erneut das Reflog:

git reflog

Es ist möglich, dass einige ältere Einträge, insbesondere wenn Sie vor diesem Lab mehr Operationen durchgeführt haben, fehlen. In unserem einfachen Repository mit nur zwei Reflog-Einträgen können beide noch vorhanden sein, da sie relativ neu sind und einer von HEAD und master noch erreichbar ist. Wenn Sie jedoch eine komplexere Historie mit nicht erreichbaren Commits hätten, würde dieser Befehl sie basierend auf den Ablaufeinstellungen bereinigen.

Der wichtigste Punkt hier ist, dass das Reflog nicht für immer dauerhaft ist. Git bereinigt alte Einträge, um Speicherplatz zu sparen. Für typische Entwicklungsworkflows sind die Standard-Ablaufzeiten in der Regel ausreichend, um von den meisten Fehlern wiederherzustellen.

Das Verständnis, dass Reflog-Einträge ein Ablaufdatum haben, hilft Ihnen zu verstehen, wie wichtig es ist, sinnvolle Commits und Branches zu erstellen, um wichtige Punkte in der Projektgeschichte zu bewahren.

Zusammenfassung

In diesem Lab haben wir gelernt, wie man den Befehl git reflog verwendet, um eine chronologische Historie der Positionen des HEAD in einem Git-Repository anzuzeigen. Wir haben gesehen, dass das Reflog wie ein persönliches Tagebuch von Aktionen fungiert, das Commits, Merges, Rebases und andere Operationen aufzeichnet, auch für Commits, die von keinem Branch erreichbar sind. Wir haben die Ausgabe von git reflog untersucht und die Bestandteile wie Commit-Hashes, HEAD-Zeiger, Reflog-Eintragsindizes (z.B. HEAD@{0}) und die ausgeführte Aktion verstanden.

Anschließend haben wir untersucht, wie man im Reflog nach einem bestimmten Commit-Hash sucht, um festzustellen, ob ein bestimmter Commit in der Reflog-Historie vorhanden ist. Schließlich haben wir kurz das Konzept von abgelaufenen Reflog-Einträgen behandelt und verstanden, dass Reflog-Einträge nicht dauerhaft sind und schließlich bereinigt werden. Dieses Lab hat die Stärke von git reflog als wichtiges Werkzeug zum Verständnis der Repository-Historie und zur Wiederherstellung möglicherweise verlorener Arbeit gezeigt.