Git-Reflog
Definition
Der Befehl git reflog zeichnet Aktualisierungen an lokalen Referenzen wie Branches, HEAD und Stashes auf. Er ermöglicht es Ihnen, zu Commits zurückzukehren, auch zu solchen, die von keinem Branch oder Tag referenziert werden. Nach dem Umschreiben der Historie enthält das Reflog Informationen über den vorherigen Zustand von Referenzen und macht es möglich, bei Bedarf zu diesem Zustand zurückzukehren.

Es gibt mehrere Git-Befehle, die einen Referenzparameter (einen „Ref“) akzeptieren, um auf einen bestimmten Commit zu verweisen. Der Reflog-Mechanismus verfolgt die Aktualisierungshistorie dieser Refs im lokalen Repository.
Die grundlegende Verwendung des git reflog-Befehls
Im Allgemeinen wird git reflog so verwendet:
git reflog
git reflogEs ist eine Abkürzung für:
git reflog show HEAD
git reflog show HEADDer obige Befehl gibt das HEAD-Reflog aus. Die Ausgabe sieht wie folgt aus:
git reflog command
a32556a HEAD@{0}: commit: migrating content
ab371fd HEAD@{1}: commit: adding git reflog outline
23a491a HEAD@{2}: checkout: moving from stage to feature/solver
7b119cb HEAD@{3}: checkout: moving from feature/solver to stage
56a183a HEAD@{4}: commit: changing color scheme
7a2aa71 HEAD@{5}: commit: adding more color palettes
a56322b HEAD@{6}: commit: adding color tool packageReflog-Referenzen
Standardmäßig gibt git reflog das Reflog der HEAD-Referenz aus, die auf den aktuell aktiven Branch zeigt. Sie können auf einen Git-Ref mit der Syntax name@{qualifier} zugreifen.
Führen Sie den folgenden Befehl aus, um das gesamte Reflog aller Referenzen abzurufen:
git reflog show --all
git reflog show --allÜbergeben Sie den Namen des aktuellen Branches an git reflog show, wenn Sie das Reflog dafür sehen möchten. Im folgenden Beispiel zeigen wir ein Reflog für den Branch test_branch an.
git reflog show branch
git reflog show test_branch
#32a591f test_branch@{0}: commit: add snippets
#23bae4a test_branch@{1}: commit (initial): initial commitMit dem folgenden Befehl wird ein Reflog für einen git stash: ausgegeben:
git reflog stash
git reflog stash
#0d44de3 stash@{0}: WIP on git_reflog: a567574 adding Vue.jsZeitbasierte Reflogs
Jeder Reflog-Eintrag hat einen zugehörigen Zeitstempel. Diese können als Qualifier in der Git-Ref-Pointer-Syntax verwendet werden, sodass Sie Git-Reflogs nach Zeit filtern können. Hier sind einige Beispiele für Zeit-Qualifier:
- 1.minute.ago
- 1.hour.ago
- 1.day.ago
- yesterday
- 1.week.ago
- 1.month.ago
- 1.year.ago
- 2011-05-17.09:00:00
Sie können Zeit-Qualifier auch kombinieren (z. B. 1.week.3.hours.ago) und Pluralformen verwenden (z. B. 5.hours.ago). Die Refs mit Zeit-Qualifiern können an andere Git-Befehle übergeben werden, etwa so:
timed reflogs
git diff master@{0} master@{1.week.ago}Dieser Befehl zeigt einen Diff des aktuellen Master-Branches gegenüber dem Master von vor 1 Woche.
Unterbefehle von git reflog
Git reflog akzeptiert mehrere Argumente, die als Unterbefehle fungieren. Diese werden unten beschrieben.
Show - Unterbefehl git reflog show
Der Unterbefehl git reflog show ist ein Alias für git log -g --abbrev-commit --pretty=oneline. Das ist das Standardverhalten. Im folgenden Beispiel sind die beiden Befehle gleichwertig:
git reflog show equivalence
git reflog master@{0}
git reflog show master@{0}Expire - Unterbefehl git reflog expire
Der Unterbefehl git reflog expire wird verwendet, um alte oder nicht erreichbare Reflog-Einträge zu bereinigen. Aufgrund des Risikos eines Datenverlusts wird dieser Unterbefehl normalerweise nicht direkt von Benutzern verwendet; Git nutzt ihn intern. Standardmäßig laufen Reflog-Einträge nach 90 Tagen ab. Sie können eine benutzerdefinierte Ablaufzeit mit dem Argument --expire angeben:
git reflog expire example
git reflog expire --expire=1.day.agoDelete - Unterbefehl git reflog delete
Der Unterbefehl git reflog delete ist dafür gedacht, bestimmte Reflog-Einträge zu entfernen. Endanwender vermeiden diesen Befehl im Allgemeinen wegen des Risikos eines Datenverlusts, ähnlich wie git reflog expire. Um einen bestimmten Eintrag zu löschen, können Sie seine Referenz übergeben:
git reflog delete example
git reflog delete HEAD@{1}Verlorene Commits wiederherstellen
Commits gehen in Git nie wirklich verloren, selbst bei Operationen zum Umschreiben der Historie. Sehen wir uns ein Beispiel für git log --pretty=oneline an, das so aussieht:
Recovering lost commits
2b43ceab309da94256db8fb1f35b1678fb74abd4 changes in content
c32557493a95185997c87e0bc3a9481715279351 adding Vue.js
abc234f986d270d7f97c77618314a06f024c4563 migrating content
a5673cd762d8ef2e146d7f0226e81a92f91956b1 adding git reflog outline
2bce4a4404c42128bee8468a9517418ed0ea412 initial commitNehmen wir nun an, wir committen einige neue Änderungen an dieses Repository und führen Folgendes aus:
the git reflog command
#make changes to HEAD
git commit -am "API changes"Infolgedessen sieht das Log jetzt so aus:
git reflog definition
37656e19d4e4f1a9b419f57850c8f1974f871b07 API changes
2b43ceab309da94256db8fb1f35b1678fb74abd4 changes in content
c32557493a95185997c87e0bc3a9481715279351 adding Vue.js
abc234f986d270d7f97c77618314a06f024c4563 migrating content
a5673cd762d8ef2e146d7f0226e81a92f91956b1 adding git reflog outline
2bce4a4404c42128bee8468a9517418ed0ea412 initial commitIn diesem Stadium müssen wir, um ein interaktives Rebase gegen den Master-Branch durchzuführen, Folgendes ausführen:
git reflog example
git rebase -i origin/masterWährend des Rebasings markiert der Rebase-Unterbefehl s Commits zum Squashen in den zuletzt erstellten Commit „API changes“. Durch das Squashen der Commits sieht die Ausgabe von git log nun so aus:
git reflog usage
40d8a1237656e19d4e4f1a9b419f57850c8f1974 API changes
35aee4a4404c42128bee8468a9517418ed0eb3dc initial commitJetzt scheint es, als wären die gesquashten Commits verschwunden. Wenn Sie an einem gesquashten Commit arbeiten müssen, können Sie das Reflog nutzen.
git reflog description
git reflog
37656e1 HEAD@{0}: rebase -i (finish): returning to refs/heads/git_reflog
37656e1 HEAD@{1}: rebase -i (start): checkout origin/master
37656e1 HEAD@{2}: commit: API changesEs gibt Reflog-Einträge für den Start und das Ende des Rebase, und davor steht der Commit „API changes“. Die Reflog-Referenz kann an git reset übergeben werden, um auf einen Commit vor dem Rebase zurückzusetzen.
git reset HEAD
git reset HEAD@{2}Dieser Befehl verschiebt HEAD zu diesem Commit mit „API changes“ und stellt die anderen gesquashten Commits wieder her.
Practice
Was sind die richtigen Aussagen über den Befehl `git reflog`, wie er im W3Docs Git-Tutorial beschrieben wird?