Nicht besonders einfach - wenn Sie den Zeiger auf die Spitze eines Astes verloren haben, ist es eher so, als würden Sie eine Nadel im Heuhaufen finden. Sie können alle Commits finden, auf die anscheinend nicht mehr verwiesen git fsck --unreachable
wird - dies wird für Sie erledigt -, aber dies schließt Commits ein, die Sie nach einem git commit --amend
alten Commit für Zweige, die Sie neu gegründet haben, usw. usw. weggeworfen haben. Sehen Sie sich also alle diese Commits an Sofort ist es wahrscheinlich viel zu viel Information, um durchzuwaten.
Die flippige Antwort lautet also: Verlieren Sie nicht den Überblick über die Dinge, an denen Sie interessiert sind. Im Ernst, die Reflogs enthalten standardmäßig Verweise auf alle Commits, die Sie in den letzten 60 Tagen verwendet haben. Noch wichtiger ist, dass sie einen Kontext darüber geben, was diese Commits sind .
commit --amend
oder verwaist ist,rebase
und einem Commit, das versehentlich durch die Arbeit mit einem abgetrennten HEAD verwaist ist.git commit --amend
usw., der Sackgassen hinterlässt, verlorene Commits. Ich machte einige Umbasierungen und so weiter und endete mit einigen Commits, die von keinem Zweig aus erreichbar waren, und fühlte mich ein bisschen schmutzig, als ich sie im Repo zurückließ. Jetzt ist der Gedanke nicht mehr ganz so beunruhigend. :)git fsck --unreachable
bietet dies nicht. Ich habe es gerade versucht. Der bessere Ansatz ist die--reflog
Option fürgit log
, wie Kenorb antwortete . Das Schöne daran ist, dass Sie in Kombination mit--graph
einen leicht zu analysierenden visuellen Kontext erhalten, ähnlich dem in der ursprünglichen Frage dargestellten. Versuchen Sie zum Beispiel:git log --graph --all --oneline --reflog
Versuchen:
Hier werden alle Git-Commits aufgelistet, indem vorgetäuscht wird, dass alle von reflogs (
git reflog
) erwähnten Objekte in der Befehlszeile als aufgeführt sind<commit>
.quelle
Wenn ich dieses Problem behebe, verwende ich den folgenden Befehl:
Auf diese Weise kann ich die jüngsten Commits visualisieren, die kopflos geworden sind.
Ich habe dies in einen Skript-Helfer namens eingepackt
~/bin/git-reflog-gitk
.quelle
when the tips of branches and other references were updated in the *local repository*
. Sie können verwenden,git log --reflog
wenn Sie dies für nicht-lokale Ref-Änderungen tun möchtenWas mein Leben gerettet hat, war der folgende Befehl:
Dort finden Sie einen Bildschirm mit Verlaufs-Commits, die für Git wie diesen ausgeführt wurden:
Zu diesem Zeitpunkt müssen Sie nur das finden
HEAD@{X}
, was Sie benötigen, einen temporären Zweig erstellen und wie folgt dorthin wechseln:Auf diese Weise haben Sie einen temporären Zweig mit Ihrem verlorenen Commit, ohne Ihr Git-Repository neu zu gründen oder zu beschädigen.
Hoffe das hilft...
quelle
Wie @Kierans Antwort, aber für die Konsole:
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
quelle
git log --all
. Ein kurzes Beispiel: Nach einemgit reset --hard @^
HEAD @ {0} -Commit befindet es sich nur noch im Reflog. Dagit reflog
dies nicht unterstützt wird--graph
, müssen Sie die Commits übergebengit log --graph
, um eine visuelle Darstellung zu erhalten.--reflog
anstelle von$(git reflog | awk '{print $1}')
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
dazugit log --oneline --all --graph --decorate --reflog
sind sie fast identisch, außer dass --reflog Details wie WIP-Einträge enthielt.reflog
warum nichtlog --reflog
stattdessen verwenden?Wie löse ich dieses Problem? Verwenden
git fsck
und protokollieren!Erstellen Sie zunächst eine Datei mit verlorenen (nicht erreichbaren) Commits und Blobs. (HINWEIS: Wenn Sie so etwas getan haben
git gc
, werden alle festgeschriebenen Commits im Müll gesammelt und Sie werden sie hier nicht finden!)Das gibt Ihnen eine Datei wie diese:
Sie können diese Datei dann mit Ihrem bevorzugten Texteditor öffnen, um die Commit- / Blog-Hashes von dort zu kopieren. (* Husten * Vim-Makros eignen sich hervorragend für diesen * Husten *)
Jetzt können Sie sich mit so etwas wie von diesem Commit zurückmelden
git log --oneline <commit hash>
. Alternativ sollte gitk, tig oder ein anderer git-Viewer funktionieren.In Ihrem Fall, wenn Sie den Hash für Commit F finden, zeigt Ihnen das Protokoll ungefähr Folgendes:
Schnell und einfach! Jetzt können Sie den Kontext hinter all diesen baumelnden Commits finden.
PS Ja, ich weiß, später Beitrag, aber na ja, jemand könnte ihn hier finden und nützlich finden. (Höchstwahrscheinlich ich in 6 Monaten, wenn ich dies wieder google)
quelle
Ich hatte Glück, das Commit wiederherzustellen, indem ich mir das Reflog ansah, das sich bei befand
.git/logs/HEAD
Ich musste dann bis zum Ende der Datei scrollen und fand das Commit, das ich gerade verloren hatte.
quelle
Wir werden
git log
manchmal nicht gut sein, um alle Commits-Details zu erhalten, also sehen Sie sich das an ...Für Mac: Steigen Sie in Ihr Git-Projekt ein und geben Sie Folgendes ein:
um Ihnen alle Commits darin anzuzeigen, oder:
um Ihnen alle Commits darin anzuzeigen,
Dann können Sie in jedem Ihrer Lieblingsbrowser bearbeiten.
quelle
@bsimmons
Erstellen Sie dann für jeden einen Zweig:
Jetzt zeigen Ihnen viele Tools eine grafische Visualisierung dieser verlorenen Commits.
quelle
Wenn Sie die GUI von Git Extensions verwenden, können Sie eine grafische Visualisierung der baumelnden Commits anzeigen, wenn Sie "Ansicht -> Reflog-Referenzen anzeigen" aktivieren. Dies zeigt baumelnde Commits im Baum, genau wie alle anderen, auf die verwiesen wird. Auf diese Weise ist es viel einfacher zu finden, wonach Sie suchen.
Sehen Sie sich dieses Bild zur Demonstration an. Die Commits C2, C3, C4 und C5 im Bild baumeln, sind aber weiterhin sichtbar.
quelle
rettete mich! Ich habe meine beim Zusammenführen von HEAD verloren und konnte nicht feststellen, dass meine Lates sich verpflichten! Wird nicht im Quellbaum angezeigt,
git log --reflog
zeigt jedoch alle meine lokalen Commits anquelle