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?

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.


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.


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>

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.