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

82voto

VonC Punkte 1117238

Mein neuer Lieblingsalias, basierend auf bonyiii 's Antwort (hochgestuft), und meine eigene Antwort über " Übergabe eines Arguments an einen Git-Alias-Befehl ":

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

Ich habe eine Datei verloren, die ich vor ein paar Übertragungen versehentlich gelöscht habe?
Schnell:

git restore my_deleted_file

Die Krise ist abgewendet.

Achtung, mit Git 2.23 (Q3 2019) kommt die Experimentierbefehl namens git restore (!).
Benennen Sie also diesen Alias um (wie unten gezeigt).


Robert Dailey schlägt vor: in den Kommentaren den folgenden Alias:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

Und jegan fügt hinzu. in den Kommentaren :

Um den Alias über die Befehlszeile zu setzen, habe ich diesen Befehl verwendet:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""

76voto

wisbucky Punkte 26902

Wenn Sie den Dateinamen kennen, ist dies ein einfacher Weg mit einfachen Befehlen:

Alle Übertragungen für diese Datei auflisten.

git log -- path/to/file

Die letzte Übertragung (ganz oben) hat die Datei gelöscht. Sie müssen also die vorletzte Übertragung wiederherstellen.

git checkout {second to last commit} -- path/to/file

31voto

Fedir RYKHTIK Punkte 9464

So stellen Sie eine gelöschte und übertragene Datei wieder her:

git reset HEAD some/path
git checkout -- some/path

Es wurde mit der Git-Version 1.7.5.4 getestet.

29voto

Alex Punkte 7851

Ich habe diese Lösung .

  1. Ermitteln Sie die ID der Übertragung, in der die Datei gelöscht wurde, auf eine der folgenden Arten.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* # empfohlen, wenn Sie kaum sich an nichts erinnern
  2. Sie sollten etwas erhalten wie:

commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autor: Alexander Orlov Datum: Thu May 12 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Autor: Alexander Orlov Datum: Thu May 12 22:10:22 2011 +0200

3 . Verwenden Sie nun die Commit-ID bfe68bd117e1091c96d2976c99b3bcc8310bebe7:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Da die Commit-ID auf den Commit verweist, bei dem die Datei bereits gelöscht wurde, müssen Sie auf den Commit kurz vor bfe68b verweisen, was Sie tun können, indem Sie anhängen ^1 . Das bedeutet: Geben Sie mir den Commit kurz vor bfe68b.

25voto

Wenn Sie nur Änderungen vorgenommen und eine Datei gelöscht, aber nicht übertragen haben, und Sie nun Ihre Änderungen nicht mehr benötigen

git checkout -- .

aber Ihre gelöschten Dateien nicht wiederhergestellt wurden, führen Sie einfach den folgenden Befehl aus:

git checkout <file_path>

Und schon ist Ihre Datei wieder da.

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