Frage Git: Wie finde ich eine gelöschte Datei im Projekt-Commit-Verlauf?


Es war einmal eine Datei in meinem Projekt, die ich nun gerne bekommen würde.

Das Problem ist: Ich habe keine Ahnung wann ich es gelöscht habe und auf welchem ​​Weg es war.

Wie kann ich die Commits dieser Datei finden, wenn sie existiert?


856
2017-08-26 10:43


Ursprung


Antworten:


Wenn Sie den genauen Pfad nicht kennen, den Sie verwenden können

git log --all --full-history -- **/thefile.*

Wenn Sie den Pfad der Datei kennen, können Sie Folgendes tun:

git log --all --full-history -- <path-to-file>

Dies sollte eine Liste von Commits in allen Zweigen anzeigen, die diese Datei berührten. Dann können Sie die Version der gewünschten Datei finden und sie mit ... anzeigen.

git show <SHA> -- <path-to-file>

Oder stellen Sie es in Ihrer Arbeitskopie wieder her mit:

git checkout <SHA>^ -- <path-to-file>

Beachten Sie das Caret-Symbol (^), die die Kasse bekommt vorher zu dem einen identifiziert, weil im Moment <SHA> Commit Die Datei wird gelöscht, wir müssen uns das vorherige Commit ansehen, um den Inhalt der gelöschten Datei zu erhalten


1066
2017-08-26 10:46



Rufen Sie eine Liste der gelöschten Dateien ab und kopieren Sie den vollständigen Pfad der gelöschten Datei

git log --diff-filter=D --summary | grep delete

Führen Sie den nächsten Befehl aus, um die Commit-ID dieses Commits zu suchen und die Commit-ID zu kopieren

git log --all -- FILEPATH

Diff der gelöschten Datei anzeigen

git show COMMIT_ID -- FILE_PATH

Denken Sie daran, dass Sie die Ausgabe in eine Datei schreiben können > mögen

git show COMMIT_ID -- FILE_PATH > deleted.diff

302
2018-02-19 04:53



Die angenommene Antwort konnte nicht bearbeitet werden, sodass sie hier als Antwort hinzugefügt wird.

Um die Datei in git wiederherzustellen, verwenden Sie Folgendes (beachten Sie das '^' Zeichen direkt nach dem SHA)

git checkout <SHA>^ -- /path/to/file

35
2018-04-03 15:51



@ Amber gab die richtige Antwort! Nur noch eine Ergänzung, wenn Sie den genauen Pfad der Datei nicht kennen, können Sie Platzhalter verwenden! Das hat für mich funktioniert.

git log --all -- **/thefile.*

21
2018-01-08 16:36



Angenommen, Sie möchten eine Datei namens MyFile, aber sind unsicher in Bezug auf seinen Weg (oder seine Erweiterung, für diese Angelegenheit):

Vorbemerkung: Vermeide Verwirrung, indem du zur Git-Wurzel trittst

Ein nicht-triviales Projekt kann mehrere Verzeichnisse mit ähnlichen oder identischen Namen haben.

> cd <project-root>
  1. Finde den vollständigen Pfad

    git log --diff-filter = D --zusammenfassung | Grep löschen | grep MyFile

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js ist der Pfad und die Datei, nach der Sie suchen.

  1. Ermitteln Sie alle Commits, die diese Datei beeinflusst haben

    git log --oneline --follow - full / Pfad / zu / MyFile.js

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. Überprüfen Sie die Datei

Wenn Sie das zuerst gelistete Commit auswählen (das letzte chronologisch, hier bd8374c), wird die Datei nicht gefunden, da sie in diesem Commit gelöscht wurde.

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

Wählen Sie einfach das vorhergehende (anhängen):

> git checkout bd8374c^ -- full/path/to/MyFile.js

15
2018-03-03 15:35



Versuchen Sie es mit einem der Viewer, z gitk So können Sie den Verlauf durchsuchen, um diese halb erinnerten Datei zu finden. (benutzen gitk --all bei Bedarf für alle Branchen)


14
2017-08-26 12:59



Eines der Dinge, die hier mühsam sind, ist, den Pfad der gelöschten Datei zu erhalten, also habe ich einfach einen einfachen Befehl geschrieben, wo ein Entwickler oder Git-Benutzer einen gelöschten Dateinamen übergeben und den Verlauf erhalten kann:

git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

Wenn jemand, kann den Befehl verbessern, bitte.


11
2018-01-30 18:24