Anzeigen einer gelöschten Datei in Git

104

Ich habe eine Datei mit Git gelöscht und dann festgeschrieben, sodass die Datei nicht mehr in meiner Arbeitskopie enthalten ist. Ich möchte den Inhalt dieser Datei anzeigen, aber nicht wiederherstellen. Wie kann ich das machen?

Colin Ramsay
quelle

Antworten:

144
git show HEAD^:path/to/file

Sie können eine explizite Festschreibungskennung verwenden oder HEAD~nältere Versionen anzeigen oder wenn seit dem Löschen mehr als eine Festschreibung stattgefunden hat.

CB Bailey
quelle
6
Beachten Sie, dass dies der path/to/filevollständige Pfad vom Anfang des Projekts (oberstes Verzeichnis des Repositorys) ist.
Jakub Narębski
1
Ich habe fatal: Invalid object name 'HEAD^'.(ich muss erwähnen, dass ich nur "Initial Commit" habe)
vladkras
1
Wenn das Löschen bereitgestellt, aber nicht festgeschrieben wird, verwenden Sie HEAD anstelle von HEAD ^ (da es in HEAD vorhanden war). Zum Beispiel dachte ich, ich brauche eine Datei, also fügte ich sie hinzu und verpflichtete mich, meine Arbeit zu speichern. Später löschte ich sie, als ich eine andere Lösung fand. Um die Originaldatei zu sehen, bevor ich sie erneut festschreibe, habe ich HEAD: path / to / file
Tony Wickham
1
Ich denke, es ist auch erwähnenswert, dass dies nur funktioniert, wenn die Datei im letzten Commit gelöscht wurde. Wenn die Datei vor mehreren Commits gelöscht wurde, müssen Sie eine der anderen Antworten verwenden.
Jayhendren
50

Wenn dies eine Datei ist, die Sie vor einiger Zeit gelöscht haben und nicht nach einer Revision suchen möchten , können Sie Folgendes verwenden (die Datei wird fooin diesem Beispiel benannt; Sie können einen vollständigen Pfad verwenden):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

Der rev-listAufruf sucht nach allen Revisionen von foo, listet jedoch nur eine auf. Da rev-listListen in umgekehrter chronologischer Reihenfolge aufgeführt sind, wird die letzte geänderte Revision aufgelistet. Dies foowäre das gelöschte Commit foo. (Dies basiert auf der Annahme, dass git nicht zulässt, dass eine gelöschte Datei geändert wird und dennoch gelöscht bleibt .) Sie können nicht einfach die Revision verwenden, die rev-listunverändert zurückgegeben wird, da sie dort foonicht mehr vorhanden ist. Sie müssen nach der unmittelbar davor stehenden fragen, die die letzte Revision der Datei enthält, daher die ^in git show.

Louis
quelle
2
Möglicherweise müssen Sie das letzte foo in ./foo ändern. Und für diejenigen, die bash nicht verwenden, erhalten Sie die ID mit "git rev-list --max-count = 1 --all - foo" und dann "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" mit der ID (524 .. is die ID)
Dror
1
Gute Antwort. Ich musste ~ anstelle von ^ verwenden. Nicht sicher warum. Und nur damit die Leute sich darüber im Klaren sind, muss 'foo' hier ein vollständiger Weg von der Git-Wurzel sein.
Pedorro
Sie können schreiben, **/foowenn Sie den Pfad nicht kennen (dies funktioniert für den Befehl rev-list, jedoch nicht für den Befehl show. Mit dem Commit aus dem Befehl rev-list können Sie dann den Pfad finden).
Nickolai
10

Da Sie sich möglicherweise nicht an den genauen Pfad erinnern, können Sie stattdessen sha1 aus dem Git-Protokoll abrufen und dann einfach ausgeben

 git cat-file -p <sha1>
pdeschen
quelle
5
Im Namen von Samuel Slund : Eine Möglichkeit, die oben zu verwendende sha1-Summe zu finden, ist: Sie git whatchanged --no-abbrevliefert eine Ausgabe ähnlich der von git (oder svn) log.
Kunstloser Lärm