Antworten:
git log
zeigt 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 reflog
durchquert 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 --hard
zurück zu diesem Ref, um Ihren vorherigen Status wiederherzustellen. Denken Sie daran, Refs implizieren nicht nur das Commit, sondern die gesamte Geschichte dahinter.
.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_rev
stimmen jedoch möglicherweise nicht mit den nächsten überein. old_rev
In 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.
git log
Zeigt das Commit-Protokoll an, auf das über die Refs zugegriffen werden kann (Köpfe, Tags, Fernbedienungen).git reflog
ist 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 reflog
expire 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>
.
git reflog
wird oft als " Ihr Sicherheitsnetz " bezeichnet
Im Falle von Problemen lautet der allgemeine Ratschlag, wenn Git Log Ihnen nicht zeigt, wonach Sie suchen:
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
.
Hier ist die Erklärung reflog
aus 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 reflog
Befehl 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
expire
wird verwendet, um ältere Reflog-Einträge zu bereinigen.Um einzelne Einträge aus dem Reflog zu löschen, verwenden Sie den Unterbefehl
delete
und geben Sie den genauen Eintrag an (zgit reflog delete master@{2}
. B. ).
git log
liefert 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.
HEAD
Zeigers) und der Commits, auf die sie gezeigt haben. Ist das sinnvoll? log
Nebenbei bemerkt, kann Ihnen auch Reflog-Informationen anzeigen, aber Sie müssen ein spezielles Optionsflag als Argument übergeben --walk-reflogs
.
Ich war auch neugierig und möchte nur ein wenig näher darauf eingehen:
git log
Zeigt 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
.
git reflog
zeigt 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 checkout
und führen Sie sie git reflog
nach 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
Ich stelle mir den Unterschied zwischen Git Log und Reflog gerne als den Unterschied zwischen einem privaten und einem öffentlichen Datensatz vor.
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.
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:
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.
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.
git log
, -g
ist die Kurzform für --walk-reflogs
. Das erklärt also nichts.