Die Manpage besagt, dass das Protokoll die Commit-Protokolle anzeigt und das Umflog die Informationen zum Umflog verwaltet. Was genau sind Refflog-Informationen und was hat das Protokoll nicht? Das Protokoll scheint viel detaillierter zu sein.
git log
zeigt den aktuellen HEAD und seine Herkunft. Das heißt, es gibt den Commit HEAD aus, dann den übergeordneten, den übergeordneten und so weiter. Es geht zurück durch die Herkunft des Repos, indem es die Eltern jedes Commits rekursiv nachschlägt.
(In der Praxis haben einige Commits mehrere Eltern. Um ein repräsentativeres Protokoll anzuzeigen, verwenden Sie einen Befehl wie git log --oneline --graph --decorate
.)
git reflog
durchläuft die Vorfahren von HEAD überhaupt nicht. Das Reflog ist eine geordnete Liste der Commits, auf die HEAD hingewiesen hat: Es ist die Rückgängig-Historie für Ihr Repo. Der Reflog ist nicht Teil des Repos selbst (er wird separat zu den Commits selbst gespeichert) und ist nicht in Pushes, Fetches oder Clones enthalten. es ist rein lokal.
Abgesehen davon: Wenn Sie den Reflog verstehen, können Sie nicht wirklich Daten aus Ihrem Repo verlieren, wenn er festgeschrieben wurde. Wenn Sie versehentlich auf ein älteres Commit zurückgesetzt oder falsch rebasiert haben oder eine andere Operation, die Commits visuell "entfernt", können Sie das Reflog verwenden, um zu sehen, wo Sie sich zuvor befanden, und git reset --hard
zurück zu diesem Ref, um Ihren vorherigen Zustand wiederherzustellen. Denken Sie daran, dass Verweise nicht nur das Commit, sondern die gesamte Geschichte dahinter implizieren.
git log
zeigt das Commit-Protokoll, auf das über die Refs (Heads, Tags, Remote) zugegriffen werden kann.git reflog
ist ein record aller Commits, auf die jederzeit in Ihrem Repo verwiesen wird oder wurde.Deshalb wird git reflog
(eine local -Aufzeichnung, die standardmäßig nach 90 Tagen bereinigt wird) verwendet, wenn Sie eine "destruktive" Operation (wie das Löschen eines Zweigs) ausführen, um die referenzierte SHA1 zurückzuholen von diesem Zweig.
Siehe git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
expire entfernt ältere Einträge als zu diesem Zeitpunkt; Standardeinstellung ist 90 Tage.
Bei "<pattern>
" (z. B. "refs/stash
") in der Mitte gilt die Einstellung nur für die Refs, die dem<pattern>
entsprechen.
git reflog
wird häufig als " Ihr Sicherheitsnetz " bezeichnet
Im Falle von Problemen lautet der allgemeine Hinweis, dass git log Ihnen nicht zeigt, wonach Sie suchen:
Reflog ist wieder eine lokale Aufnahme Ihres SHA1.
Im Gegensatz zu git log
: Wenn Sie Ihr Repo in ein Upstream-Repo verschieben, wird derselbe git log
angezeigt, jedoch nicht unbedingt derselbe git reflog
.
Hier ist die Erklärung von reflog
aus dem Pro Git Buch :
Eine der Aktionen, die Git im Hintergrund ausführt, während Sie gerade arbeiten, ist die Aktualisierung eines Protokolls, ein Protokoll darüber, wo sich Ihre HEAD und Zweigreferenzen in den letzten Monaten befunden haben.
Sie können Ihren Reflog mit
git reflog
sehen:$ git reflog 734713b... [email protected]{0}: commit: fixed refs handling, added gc auto, updated d921970... [email protected]{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... [email protected]{2}: commit: added some blame and merge stuff 1c36188... [email protected]{3}: rebase -i (squash): updating HEAD 95df984... [email protected]{4}: commit: # This is a combination of two commits. 1c36188... [email protected]{5}: rebase -i (squash): updating HEAD 7e05da5... [email protected]{6}: rebase -i (pick): updating HEAD
Jedes Mal, wenn Ihr Zweig-Tipp aus irgendeinem Grund aktualisiert wird, speichert Git diese Informationen für Sie in diesem temporären Verlauf. Und Sie können auch ältere Commits mit diesen Daten angeben.
Der Befehl reflog
kann auch zum Löschen von Einträgen oder zum Verfallsdatum von Einträgen verwendet werden, die zu alt sind. Aus der offiziellen Linux-Kernel-Git-Dokumentation für reflog
:
Der Unterbefehl
expire
wird verwendet, um ältere Reflog-Einträge zu löschen.Verwenden Sie zum Löschen einzelner Einträge aus dem Reflog den Unterbefehl
delete
und geben Sie den genauen Eintrag an (z. B.git reflog delete [email protected]{2}
).
Ich war auch neugierig darauf und möchte nur ein wenig ausarbeiten und zusammenfassen:
git log
zeigt eine Historie aller Ihrer Commits für den Zweig, in dem Sie sich befinden. Wenn Sie einen anderen Zweig auschecken, wird ein anderer Commit-Verlauf angezeigt. Wenn Sie sehen möchten, dass die Historie für alle Zweige festgeschrieben wird, geben Sie git log --all
ein.
git reflog
zeigt eine Aufzeichnung Ihrer Referenzen, wie Cupcake sagte. Jedes Mal, wenn ein Commit oder eine Prüfung ausgeführt wird, gibt es einen Eintrag. Wechseln Sie einige Male mit git checkout
zwischen zwei Zweigen hin und her, und führen Sie nach jedem Checkout git reflog
aus. Der oberste Eintrag wird jedes Mal als "Checkout" -Eintrag aktualisiert. Diese Eintragstypen werden in git log
nicht angezeigt.
Referenzen: http://www.lornajane.net/posts/2014/git-log-all-branches
Eigentlich ist reflog ein Alias für
git log -g --abbrev-commit --pretty=oneline
die Antwort sollte also lauten: Es handelt sich um einen spezifischen Fall.