Was ist der Unterschied zwischen Git Reflog und Log?

158

Die Manpage gibt an, dass das Protokoll die Festschreibungsprotokolle anzeigt und das Reflog die Reflog-Informationen verwaltet. Was genau sind Reflog-Informationen und was hat das Protokoll nicht? Das Protokoll scheint weitaus detaillierter zu sein.

Noich
quelle

Antworten:

221

git logzeigt den aktuellen KOPF und seine Herkunft. Das heißt, es werden die Commit-HEAD-Punkte gedruckt, dann das übergeordnete Element, das übergeordnete Element usw. Es durchläuft die Abstammung des Repos, indem es rekursiv die Eltern jedes Commits nachschlägt.

(In der Praxis haben einige Commits mehr als ein übergeordnetes Element. Um ein repräsentativeres Protokoll anzuzeigen, verwenden Sie einen Befehl wie git log --oneline --graph --decorate.)

git reflogdurchquert die Abstammung von HEAD überhaupt nicht. Das Reflog ist eine geordnete Liste der Commits, auf die HEAD hingewiesen hat: Es macht den Verlauf Ihres Repos rückgängig. Das Reflog ist nicht Teil des Repos selbst (es wird separat zu den Commits selbst gespeichert) und ist nicht in Pushs, Fetches oder Klonen enthalten. es ist rein lokal.

Nebenbei: Wenn Sie das Reflog verstehen, können Sie keine Daten aus Ihrem Repo mehr verlieren, wenn diese festgeschrieben wurden. Wenn Sie versehentlich auf ein älteres Commit zurückgesetzt oder eine falsche Basis neu erstellt haben oder eine andere Operation, die Commits visuell "entfernt", können Sie mithilfe des Reflogs feststellen, wo Sie sich zuvor befanden, und git reset --hardzurück zu diesem Ref, um Ihren vorherigen Status wiederherzustellen. Denken Sie daran, Refs implizieren nicht nur das Commit, sondern die gesamte Geschichte dahinter.

ben_h
quelle
26
Ein Wort der Vorsicht: Manchmal KÖNNEN Sie Daten verlieren, da Reflog-Einträge nicht ewig bestehen bleiben - sie werden unter bestimmten Bedingungen gelöscht. Siehe diese Antwort und die Dokumente für git-reflog und git-gc . Wenn die zerstörerische Operation nicht länger als 2 Wochen zurückliegt, sind Sie im Allgemeinen höchstwahrscheinlich in Sicherheit.
mcmlxxxvi
@mcmlxxxvi Ich habe zwei lokale Ordner für dasselbe Repo. Kann ich die Reflogs für die beiden Ordner zusammenführen?
Tmx
@Tmx, ich verstehe Ihren Fall nicht ganz - was meinen Sie mit zwei lokalen Ordnern für dasselbe Repo ? Wenn Sie zwei Klone desselben Repos haben, die auf dem neuesten Stand sind, und deren Bearbeitungsverlauf "zusammenführen" möchten, haben die .git/logs/refs/<branch>Einträge das Format <old_rev> <new_rev> [...] <timestamp> [...]. Sie können versuchen, nach Zeitstempel zu verketten und zu sortieren. Einige Zeilen new_revstimmen jedoch möglicherweise nicht mit den nächsten überein. old_revIn diesem Fall vermute ich, dass das Reflog ungültig ist. Sie könnten dann versuchen, gefälschte Einträge einzufügen, um die Sequenz zu "reparieren", aber es scheint mir zu mühsam.
mcmlxxxvi
62
  • git log Zeigt das Commit-Protokoll an, auf das über die Refs zugegriffen werden kann (Köpfe, Tags, Fernbedienungen).
  • git reflogist eine Aufzeichnung aller Commits, auf die zu irgendeinem Zeitpunkt in Ihrem Repo verwiesen wird oder wurde.

Aus diesem Grund wird git reflog(eine lokale Aufzeichnung, die standardmäßig nach 90 Tagen gelöscht wird) verwendet, wenn Sie eine "destruktive" Operation ausführen (z. B. das Löschen eines Zweigs), um den SHA1 zurückzugewinnen, auf den dieser Zweig verwiesen hat.
Siehe git config:

gc.reflogexpire
gc.<pattern>.reflogexpire

git reflogexpire entfernt Reflog-Einträge, die älter als diese Zeit sind. Der Standardwert beträgt 90 Tage.
Mit " <pattern>" (zB " refs/stash") in der Mitte gilt die Einstellung nur für die Refs, die mit dem übereinstimmen <pattern>.

Sicherheitsnetz

git reflogwird oft als " Ihr Sicherheitsnetz " bezeichnet

Im Falle von Problemen lautet der allgemeine Ratschlag, wenn Git Log Ihnen nicht zeigt, wonach Sie suchen:

" Bleib ruhig und benutzegit reflog "

Ruhe bewahren, ruhig bleiben

Auch hier ist Reflog eine lokale Aufzeichnung Ihres SHA1.
Im Gegensatz zu git log: Wenn Sie Ihr Repo auf ein Upstream-Repo verschieben , sehen Sie dasselbe git log, aber nicht unbedingt dasselbe git reflog.

VonC
quelle
14

Hier ist die Erklärung reflogaus dem Pro Git-Buch :

Eines der Dinge, die Git im Hintergrund tut, während Sie arbeiten, ist ein Reflog - ein Protokoll darüber, wo sich Ihre HEAD- und Zweigstellenreferenzen in den letzten Monaten befanden.

Sie können Ihr Reflog sehen, indem Sie Folgendes verwenden git reflog:

$ git reflog
734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated
d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive.
1c002dd... HEAD@{2}: commit: added some blame and merge stuff
1c36188... HEAD@{3}: rebase -i (squash): updating HEAD
95df984... HEAD@{4}: commit: # This is a combination of two commits.
1c36188... HEAD@{5}: rebase -i (squash): updating HEAD
7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD

Jedes Mal, wenn Ihr Branchentipp aus irgendeinem Grund aktualisiert wird, speichert Git diese Informationen für Sie in diesem temporären Verlauf. Mit diesen Daten können Sie auch ältere Commits angeben.

Der reflogBefehl kann auch verwendet werden, um zu alte Einträge zu löschen oder Einträge aus dem Reflog abzulaufen. Aus der offiziellen Linux Kernel Git Dokumentation fürreflog :

Der Unterbefehl expirewird verwendet, um ältere Reflog-Einträge zu bereinigen.

Um einzelne Einträge aus dem Reflog zu löschen, verwenden Sie den Unterbefehl deleteund geben Sie den genauen Eintrag an (z git reflog delete master@{2}. B. ).

Gemeinschaft
quelle
Aber git logliefert Ihnen das nicht die gleichen Informationen? Es tut mir leid, wenn es offensichtlich erscheint, ich bin sehr neu in GIT und möchte kurz vor meinem ersten OMG einige Grundlagen erlernen.
Noich
2
Das Git-Protokoll ist eine Aufzeichnung Ihrer Commits . Das Reflog ist, wie im Pro Git-Buch angegeben, eine Aufzeichnung Ihrer Referenzen (im Grunde genommen Ihrer Verzweigungszeiger und Ihres HEADZeigers) und der Commits, auf die sie gezeigt haben. Ist das sinnvoll? logNebenbei bemerkt, kann Ihnen auch Reflog-Informationen anzeigen, aber Sie müssen ein spezielles Optionsflag als Argument übergeben --walk-reflogs.
3
Da Sie ein Git-Anfänger sind, empfehle ich Ihnen dringend, das Pro Git-Buch zu lesen. So habe ich das meiste gelernt, was ich über Git gelernt habe. Ich empfehle die Kapitel 1-3 und 6-6.5. Ich empfehle Ihnen außerdem dringend, zu lernen, wie Sie sowohl interaktiv als auch nicht interaktiv neu aufbauen können.
8

Ich war auch neugierig und möchte nur ein wenig näher darauf eingehen:

  1. git logZeigt einen Verlauf aller Ihrer Commits für den Zweig an, in dem Sie sich befinden. Wenn Sie einen anderen Zweig auschecken, wird ein anderer Commit-Verlauf angezeigt. Wenn Sie sehen möchten, dass Sie den Verlauf für alle Zweige festschreiben, geben Sie ein git log --all.

  2. git reflogzeigt eine Aufzeichnung Ihrer Referenzen, wie Cupcake sagte. Bei jedem Commit oder Checkout gibt es einen Eintrag. Versuchen Sie einige Male zwischen zwei Zweigen hin und her zu wechseln git checkoutund führen Sie sie git reflognach jedem Checkout aus. Der oberste Eintrag wird jedes Mal als "Checkout" -Eintrag aktualisiert. Sie sehen diese Art von Einträgen nicht in git log.

Referenzen: http://www.lornajane.net/posts/2014/git-log-all-branches

Mitchell
quelle
1

Ich stelle mir den Unterschied zwischen Git Log und Reflog gerne als den Unterschied zwischen einem privaten und einem öffentlichen Datensatz vor.

Privat gegen öffentlich

Mit dem Git-Reflog verfolgt es alles, was Sie lokal getan haben. Hast du dich verpflichtet? Reflog verfolgt es. Haben Sie einen Hard-Reset durchgeführt? Reflog verfolgt es. Haben Sie ein Commit geändert ? Reflog verfolgt es. Alles, was Sie vor Ort getan haben, gibt es im Reflog.

Dies gilt nicht für das Protokoll. Wenn Sie ein Commit ändern, wird im Protokoll nur das neue Commit angezeigt. Wenn Sie einen Reset durchführen und einige Commits in Ihrem Verlauf überspringen, werden die von Ihnen übersprungenen Commits nicht im Protokoll angezeigt. Wenn Sie Ihre Änderungen an einen anderen Entwickler oder an GitHub oder ähnliches übertragen, wird nur der im Protokoll verfolgte Inhalt angezeigt. Für einen anderen Entwickler sieht es so aus, als ob die Zurücksetzungen nie stattgefunden haben oder die Änderungen nie stattgefunden haben.

Das Protokoll ist poliert. Das Reflog ist lapidar.

Also ja, ich mag die Analogie "privat gegen öffentlich". Oder vielleicht ist eine bessere Analogie zwischen Log und Reflog "poliert gegen Lapidarium". Das Reflog zeigt alle Ihre Versuche und Fehler. Das Protokoll zeigt nur eine saubere und polierte Version Ihres Arbeitsverlaufs.

Schauen Sie sich dieses Bild an, um den Punkt hervorzuheben. Seit der Initialisierung des Repositorys wurden einige Änderungen und Zurücksetzungen vorgenommen. Das Reflog zeigt alles. Mit dem Befehl log sieht es jedoch so aus, als hätte es bisher nur ein Commit gegen das Repo gegeben:

Holz ist poliert.  Reflog ist lapidar.

Zurück zur Idee des Sicherheitsnetzes

Da das Reflog die von Ihnen geänderten Änderungen festhält und die zurückgesetzten Commits festhält , können Sie diese Commits erneut suchen, da Sie die Commit-IDs erhalten. Angenommen, Ihr Repository wurde nicht von alten Commits gelöscht, sodass Sie Elemente wiederbeleben können, die im Protokoll nicht mehr sichtbar sind. Auf diese Weise rettet der Reflog manchmal die Haut von Personen, wenn sie etwas zurückbekommen müssen, von dem sie dachten, dass sie es versehentlich verloren haben.

Cameron McKenzie
quelle
-6

Tatsächlich ist Reflog ein Alias ​​für

 git log -g --abbrev-commit --pretty=oneline

Die Antwort sollte also lauten: Es ist ein spezifischer Fall.

user10028634
quelle
9
In git log, -gist die Kurzform für --walk-reflogs. Das erklärt also nichts.
Adrian W