Ich habe eine gelöschte Festschreibung unter vielen gelöschten Festschreibungen, die ich wiederherstellen möchte. Ich habe von dem Befehl fsck --lost-found erfahren. Großartig!
Das Problem ist, dass ich über hundert unerlaubte Commit-Anweisungen mit sehr wenigen Informationen habe.
%Vor%Wenn es den Commit-Namen mit dem sha einfach rausschmeißen könnte, wäre das eine große Hilfe. So wie es ist, muss ich die Git-Show auf jedem einzeln ausführen, um das richtige Commit zu finden. Gibt es einen einfacheren Weg?
Das ist keine Antwort, die das mit git fsck löst, sondern etwas, das in dieser Situation funktionieren könnte.
git reflog
gibt eine Liste vergangener HEADs im Repository aus. Wenn Sie beispielsweise von einem Branch-Master zu einem Zweig devel wechseln, wird ein Reflog-Eintrag mit dem HEAD des Master-Zweiges erzeugt.
Wenn also das Commit zu einem bestimmten Zeitpunkt Teil eines Branches war, sind die Chancen groß, dass Sie es mithilfe einer Kombination aus git reflog
, git log
und ein bisschen Handarbeit wiederherstellen können.
Es gibt einige Fälle:
Starten Sie git reflog
und blättern Sie durch. Wenn es die Commit-Nachricht anzeigt, nach der Sie gesucht haben, ist das großartig! Kopieren Sie die Commit-ID und verwenden Sie sie für beliebige Zwecke (z. B. git cherry-pick
oder speichern Sie sie in einer Verzweigung mit git branch save-my-commit commitid
).
Das Commit ist nicht direkt in git reflog
, aber Sie sehen ein Commit, das Sie nach Commit gemacht haben, das Sie finden möchten (und bevor Sie es löschen). In diesem Fall verwenden Sie die Commit-ID der Commit, die Sie anschließend in git reflog
erstellt haben, und übergeben Sie sie als Argument an git log
: git log commitid
. Blättern Sie durch die Ausgabe und sehen Sie, ob Sie Ihren Commit finden können. Verwenden Sie die Commit-ID wie in Fall 1.
Das Commit ist nicht direkt in git reflog
und Sie finden kein Commit, von dem Sie wissen, dass Sie nach dem Commit, das Sie gelöscht haben, und vor dem Löschen gemacht haben .
Dies ist der langwierigste Fall, in welchem Fall es leichter ist, die anderen Prozesse hier zu durchlaufen. Ich bin mir nicht sicher, ob sie tatsächlich als dangling commits aufgelistet werden, also ist es einen Versuch wert, wenn du deinen commit nicht mit git fsck
finden kannst.
Gehen Sie alle Einträge in git reflog
durch und verwenden Sie die Commit-IDs als Argument für git log
, wie in Fall 2 beschrieben. Versuchen Sie, das Commit zu finden, nach dem Sie suchen.
Viel Glück!
Dies funktioniert auf Linux und Mac:
%Vor% Ich bin mir nicht sicher, ob Sie in der Windows-Git-Shell grep
und xargs
haben.
Erläuterung:
git fsck
findet die Daten grep
reduziert das auf nur die dangling commits cut
lässt nur die Commit-ID xargs
führt den Befehl git show --stat
mit den IDs [EDIT] Dieser Befehl wurde für Fälle, in denen mehrere dangling-Commits auftreten, korrigiert.
Tags und Links git