Es war einmal eine Datei in meinem Projekt, die ich jetzt gerne bekommen würde.
Das Problem ist: Ich habe keine Ahnung, wann ich es gelöscht habe und auf welchem Pfad es war.
Wie kann ich die Commits dieser Datei finden, wenn sie vorhanden war?
Es war einmal eine Datei in meinem Projekt, die ich jetzt gerne bekommen würde.
Das Problem ist: Ich habe keine Ahnung, wann ich es gelöscht habe und auf welchem Pfad es war.
Wie kann ich die Commits dieser Datei finden, wenn sie vorhanden war?
Antworten:
Wenn Sie den genauen Pfad nicht kennen, können Sie ihn verwenden
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ührt haben. Anschließend können Sie die gewünschte Version der Datei finden und mit ...
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 ( ^
), das die Prüfung vor dem identifizierten Symbol erhält , da zum Zeitpunkt des <SHA>
Festschreibens die Datei gelöscht wird. Wir müssen uns das vorherige Festschreiben ansehen, um den Inhalt der gelöschten Datei zu erhalten
git log -- <path>
hat keine Ausgabe, wenn Sie sich in einem Zweig befinden, in dem die Datei nie existiert hat. Sie sollten immer verwenden git log --all -- <path>
, um sicherzustellen, dass Sie keine Änderungen verpassen, die in anderen Zweigen vorgenommen wurden. Der Befehl git log -- <path>
kann sehr gefährlich sein, wenn Sie mehr als einen Zweig haben und dazu neigen, Pfade und Zweige (wie ich) zu vergessen, und er ist auch gefährlich, wenn Sie mit anderen Entwicklern zusammenarbeiten.
--all
(danke Philip ) git log
, damit die Leute keine Änderungen und Dateien in anderen Zweigen verpassen. Es würde vergesslichen Menschen wie mir viel Kummer ersparen.
git checkout <SHA>^ -- <path-to-file>
(beachten Sie das Symbol ^), da zum Zeitpunkt des
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 Festschreibungs-ID dieses Festschreibens zu ermitteln, und kopieren Sie die Festschreibungs-ID
git log --all -- FILEPATH
Diff der gelöschten Datei anzeigen
git show COMMIT_ID -- FILE_PATH
Denken Sie daran, dass Sie die Ausgabe mit >
like in eine Datei schreiben können
git show COMMIT_ID -- FILE_PATH > deleted.diff
unknown revision or path not in the working tree
.
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }
und jetzt können Sie einfach Folgendes tun:git-grep-latest some_text
linux pipes
.. das wird Ihnen gefallen.
Die akzeptierte Antwort konnte nicht bearbeitet werden. Fügen Sie sie hier als Antwort hinzu.
Verwenden Sie Folgendes, um die Datei in git wiederherzustellen (beachten Sie das Zeichen '^' direkt nach dem SHA).
git checkout <SHA>^ -- /path/to/file
<SHA>~1
sollte genauso funktionieren, ohne dass Anführungszeichen erforderlich sind.
Angenommen, Sie möchten eine aufgerufene Datei wiederherstellen MyFile
, sind sich jedoch ihres Pfads (oder ihrer Erweiterung) nicht sicher:
Prelim.: Vermeiden Sie Verwirrung, indem Sie zur Git-Wurzel treten
Ein nicht triviales Projekt kann mehrere Verzeichnisse mit ähnlichen oder identischen Namen haben.
> cd <project-root>
Finde den vollständigen Pfad
git log --diff-filter = D --summary | grep delete | grep MyFile
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
ist der Pfad und die Datei, die Sie suchen.
Bestimmen Sie alle Commits, die diese Datei betroffen haben
git log --oneline --follow - full / path / to / 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.
Überprüfen Sie die Datei
Wenn Sie das zuerst aufgeführte 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 Commit (Caret anhängen) aus:
> git checkout bd8374c^ -- full/path/to/MyFile.js
git log --diff-filter=D --summary | find "delete" | find "MyFile"
Beachten Sie in Schritt 3 die Anführungszeichen um den Hash:git checkout "bd8374c^" -- full/path/to/MyFile.js
@ 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 bei mir funktioniert.
git log --all -- **/thefile.*
Im Folgenden finden Sie einen einfachen Befehl, mit dem ein Entwickler oder ein Git-Benutzer einen gelöschten Dateinamen aus dem Repository-Stammverzeichnis übergeben und den Verlauf abrufen kann:
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
Wenn jemand den Befehl verbessern kann, tun Sie dies bitte.
Versuchen Sie es mit einem der Viewer, z. B. gitk
damit Sie im Verlauf nach der halb gespeicherten Datei suchen können. ( gitk --all
bei Bedarf für alle Filialen verwenden)
--all
Option ist sowohl für Ihre Antwort als auch für die akzeptierte Antwort von entscheidender Bedeutung.
Zusammenfassung:
Sie durchsuchen den vollständigen Pfad Ihrer Datei im Verlauf gelöschter Dateien git log --diff-filter=D --summary | grep filename
Sie stellen Ihre Datei aus dem Commit wieder her, bevor sie gelöscht wurde
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
Hier ist meine Lösung:
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>