3205 Stimmen

Wie man eine gelöschte Datei in einem Git-Repository findet und wiederherstellt

Angenommen, ich befinde mich in einem Git-Repository. Ich lösche eine Datei und übertrage diese Änderung. Ich arbeite weiter und nehme weitere Übertragungen vor. Dann stelle ich fest, dass ich die Datei wiederherstellen muss.

Ich weiß, dass ich eine Datei auschecken kann mit git checkout HEAD^ foo.bar aber ich weiß nicht genau, wann diese Datei gelöscht wurde.

  1. Wie kann ich am schnellsten den Commit finden, der einen bestimmten Dateinamen gelöscht hat?
  2. Wie kann ich diese Datei am einfachsten wieder in meine Arbeitskopie aufnehmen?

Ich hoffe, dass ich meine Protokolle nicht manuell durchsuchen, das gesamte Projekt für einen bestimmten SHA auschecken und diese Datei dann manuell in meinen ursprünglichen Projekt-Checkout kopieren muss.

43 Stimmen

Beachten Sie, dass der vorangegangene Kommentar die Frage im Titel beantwortet, nicht im Hauptteil - das schließt ein, herauszufinden wenn die Datei wurde gelöscht.

14 Stimmen

So finden Sie die Übertragung, in der eine Datei gelöscht wurde: git log --diff-filter=D -- path/to/file

2 Stimmen

7voto

cb2 Punkte 584

Suchen Sie die Übertragung, die Ihre Datei gelöscht hat:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

Beispielhafte Ausgabe:

4711174

Ab Git 2.23 gibt es tatsächlich eine restore Befehl. Es ist noch experimentell aber um etwas wiederherzustellen, das Sie bei einer Übergabe entfernt haben (in diesem Fall 4711174), können Sie dann eingeben:

git restore --source=4711174^ path/to/file

Beachten Sie die ^ nach der Commit-ID, da wir etwas aus der Commit-Datei wiederherstellen wollen vor derjenige, der die Datei gelöscht hat.

El --source sagt dem Argument restore Befehl, wo die wiederherzustellende(n) Datei(en) zu suchen sind, und das kann jede Übertragung und sogar der Index sein.

Siehe: git-restore-Dokument für git 2.23.0

7voto

rustyMagnet Punkte 2741

Ich hatte die gleiche Frage. Ohne es zu wissen, hatte ich eine gefährlicher Eingriff .

Dangling Commits auflisten

git fsck --lost-found

Überprüfen Sie jede baumelnde Übergabe

git reset --hard <commit id>

Meine Dateien sind wieder aufgetaucht, als ich auf die "Dangling Commit" umgestellt habe.

git status für den Grund:

“HEAD detached from <commit id where it detached>”

5voto

bonyiii Punkte 2733

In unserem Fall haben wir bei einem Commit versehentlich Dateien gelöscht, und einige Commits später haben wir unseren Fehler bemerkt und wollten alle gelöschten Dateien wiederherstellen, nicht aber die geänderten.

In Anlehnung an die ausgezeichnete Antwort von Charles Bailey hier mein Einzeiler:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)

5voto

J. Ceron Punkte 827
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull 
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory

Stellen Sie die gelöschte Datei wieder her:

user@bsd:~/work/git$ git checkout
D       .slides.tex.swp
D       slides.tex
user@bsd:~/work/git$ git checkout slides.tex 
user@bsd:~/work/git$ ls slides.tex
slides.tex

5voto

Rishabh Punkte 329

Pluspunkt: Die unten aufgeführten Methoden funktionieren gut für das Szenario, dass Dateien/Ordner sogar aus Ihrem Papierkorb oder Papierkorb gelöscht wurden.

Dateien/Ordner werden aus dem Arbeitsbaum gelöscht, aber noch nicht übertragen:

I. Wenn Sie Ihre Änderungen noch nicht indiziert haben (git add), können Sie den Inhalt eines Verzeichnisses rückgängig machen:

git restore -- path/to/folder_OR_file

II. Wenn die Löschung bereits indiziert ist, sollten Sie diese zuerst zurücksetzen:

git reset -- path/to/folder_OR_file

dann durchführen, git restore path/to/folder_OR_file

Dateien/Ordner wurden bei einer früheren Übertragung gelöscht:

  1. Verwenden Sie  git log --diff-filter=D --summary  um Details zu den Commits zu erhalten, in denen Dateien/Ordner gelöscht wurden;
  2. Verwenden Sie  git checkout $commit~1 path/to/folder_OR_file  um die gelöschten Dateien/Ordner wiederherzustellen. Wo  $commit  ist der sha-Wert der in Schritt 1 gefundenen Übertragung, z. B. c7578994

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X