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

20voto

Beau Smith Punkte 30969

git undelete path/to/file.ext

  1. Legen Sie dies in Ihr .bash_profile (oder eine andere relevante Datei, die geladen wird, wenn Sie eine Befehlsshell öffnen):

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
  2. Dann verwenden Sie:

    git undelete path/to/file.ext

Dieser Alias sucht zuerst nach dem letzten Commit, bei dem diese Datei existierte, und führt dann einen Git-Checkout des Dateipfads von diesem letzten Commit aus, bei dem diese Datei existierte. Fuente .

19voto

AmerllicA Punkte 22941

Eigentlich geht es bei dieser Frage direkt um Git, aber jemand wie ich arbeitet mit GUI-Tools wie dem WebStorm VCS außer der Kenntnis der Git-CLI-Befehle.

Ich klicke mit der rechten Maustaste auf den Pfad, der die gelöschte Datei enthält, und gehe dann auf Git und klicke auf Geschichte anzeigen .

Enter image description here

Die VCS-Tools zeigen alle Revisionen an und ich kann alle Commits und Änderungen von jedem von ihnen sehen.

Enter image description here

Dann wähle ich die Commits aus, mit denen mein Freund die PostAd.js Datei. siehe jetzt unten:

Enter image description here

Und jetzt kann ich meine gelöschte Wunschdatei sehen. Ich doppelklicke einfach auf den Dateinamen und sie wird wiederhergestellt.

Enter image description here

Ich weiß, meine Antwort ist nicht Git-Befehle, aber es ist schnell, zuverlässig und einfach für Anfänger und professionelle Entwickler. WebStorm Die VCS-Tools sind großartig und perfekt für die Arbeit mit Git und benötigen keine weiteren Plugins oder Tools.

15voto

user1528493 Punkte 431
git checkout /path/to/deleted.file

12voto

Thomas E Punkte 3724

In vielen Fällen kann es sinnvoll sein, die coreutils (grep, sed, etc.) in Verbindung mit Git. Ich kenne diese Werkzeuge bereits recht gut, Git jedoch weniger. Wenn ich nach einer gelöschten Datei suchen wollte, würde ich folgendes tun:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

Wenn ich die Revision/den Commit finde:

git checkout <rev>^ -- path/to/refound/deleted_file.c

Genau wie andere vor mir schon festgestellt haben.

Die Datei wird nun in dem Zustand wiederhergestellt, den sie vor dem Entfernen hatte. Denken Sie daran, sie wieder in den Arbeitsbaum zu übertragen, wenn Sie sie behalten wollen.

7voto

kzar Punkte 2781

Ich musste eine Reihe von gelöschten Dateien aus einer bestimmten Übertragung wiederherstellen und habe es mit zwei Befehlen geschafft:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(Beachten Sie das Leerzeichen am Ende jedes Befehls.)

Die Dateien wurden der Datei .gitignore hinzugefügt und dann mit git rm . Ich musste die Dateien wiederherstellen, dann aber auch wieder entpacken. Ich hatte Hunderte von Dateien wiederherzustellen, und die manuelle Eingabe für jede einzelne Datei, wie in den anderen Beispielen, wäre viel zu langsam gewesen.

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