webentwicklung-frage-antwort-db.com.de

Was ist der Unterschied zwischen Git Refflog und Log?

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.

120
Noich

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.

171
ben_h
  • 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.

safety net

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:

" Bleib ruhig und benutze git reflog "

keep calm

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.

45
VonC

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}).

12
user456814

Ich war auch neugierig darauf und möchte nur ein wenig ausarbeiten und zusammenfassen:

  1. 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.

  2. 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

4
mitch

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.

0
user10028634