Einführung
Das Reflog zeichnet jede Änderung an HEAD und an jeder Branch-Spitze auf Ihrer lokalen Maschine auf. Es ist lokal, pro Klon, und wird nicht gepusht. Nahezu jeder "verlorene" Commit kann darüber gerettet werden.
Anzeigen
git reflog # HEAD-Reflog
git reflog show main # Reflog von main
git reflog --date=iso
git log -g --oneline # Log-Lauf durch das Reflog
Jeder Eintrag hat eine Sequenz (HEAD@{0}, HEAD@{1}, ...), eine Aktion (commit, reset, merge, rebase, ...) und einen Ziel-SHA.
Einen verlorenen Commit wiederherstellen
git reflog
# 9f8a1c2 HEAD@{0}: reset: moving to HEAD~3
# a1b2c3d HEAD@{1}: commit: Important work
git switch -c rescued a1b2c3d
Oder direkt:
git reset --hard HEAD@{1}
Zeitbasierte Syntax
git show HEAD@{2.hours.ago}
git diff main@{yesterday} main
Git interpretiert @{...} entweder als Zähler oder als Datum.
Reflog-Ablauf
Standardmäßig laufen erreichbare Reflog-Einträge nach 90 Tagen ab, unerreichbare nach 30:
git config gc.reflogExpire 90.days
git config gc.reflogExpireUnreachable 30.days
Bis zum Ablauf bleiben selbst hard-resettete Commits wiederherstellbar.
Pro-Ref-Reflogs
Jeder Branch hat ein eigenes Reflog unter .git/logs/refs/heads/<name>. Stash hat ebenfalls eines (refs/stash):
git reflog show stash
Reflog beschneiden
git reflog expire --expire=now --all
git gc --prune=now
Nur verwenden, wenn Sie Daten dauerhaft löschen müssen; dies entfernt das Sicherheitsnetz.
Reflog vs. git log
git log durchläuft den Commit-Graphen über Eltern-Zeiger; das Reflog läuft aufgezeichnete Bewegungen einer Ref ab. Nach einem Force-Reset zeigt git log die aufgegebenen Commits nicht mehr, das Reflog aber schon.
Pro-Ref-Reflog-Inspektion
Jede Ref führt ein eigenes Reflog. Inspizieren Sie das Reflog eines bestimmten Branches, um zu sehen, wie sich seine Spitze bewegte:
git reflog show feature/login
git log -g feature/login --oneline
cat .git/logs/refs/heads/feature/login
Nützlich beim Untersuchen von "wer hat diesen Branch bewegt?" auf einem lokalen Klon. Das Reflog-Dateiformat ist eine Zeile pro Änderung mit altem SHA, neuem SHA, Committer, Zeitstempel und einer textuellen Nachricht. Kombiniert mit git blame auf der Datei ergibt es einen vollständigen lokalen Audit-Trail; denken Sie daran, dass Reflogs nicht gepusht werden, daher deckt der Trail nur Ihre Maschine ab.
Häufige Fehler
In Panik vergessen, dass das Reflog existiert, und Stunden Arbeit wiederholen, die leicht wiederherstellbar gewesen wäre. Prüfen Sie immer zuerst git reflog. Während der Wiederherstellung pushen und annehmen, das Reflog liege auf dem Server; tut es nicht, nur Ihr lokaler Klon hat es. git gc --prune=now aus einem "Aufräumen"-Instinkt ausführen und das Sicherheitsnetz für jeden unreferenzierten Commit zerstören. Und schließlich: Reflog-Einträge als ewig behandeln; lange gelöschte Refs altern aus. Taggen oder branchen Sie alles, was Sie behalten wollen, bevor 30 Tage vergehen.