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

3527voto

CB Bailey Punkte 693084

Findet den letzten Commit, der den angegebenen Pfad betrifft. Da die Datei nicht im HEAD-Commit enthalten ist, muss der vorherige Commit sie gelöscht haben.

git rev-list -n 1 HEAD -- <file_path>

Dann checken Sie die Version vor der Übergabe aus, indem Sie das Caret ( ^ ) Symbol:

git checkout <deleting_commit>^ -- <file_path>

Oder in einem einzigen Befehl, wenn $file ist die betreffende Datei.

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

Wenn Sie zsh verwenden und die Option EXTENDED_GLOB aktiviert haben, wird das Caret-Symbol nicht funktionieren. Sie können verwenden ~1 stattdessen.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

1042voto

Robert Munteanu Punkte 64955
  1. Ermittelt alle Commits, die gelöschte Dateien enthalten, sowie die gelöschten Dateien:

    git log --diff-filter=D --summary

    Notieren Sie sich den gewünschten Commit-Hash, z. B. e4e6d4d5e5c59c69f3bd7be2 .

  2. Wiederherstellen der gelöschten Datei von einer vorherigen Übertragung ( ~1 ) mit der oben festgelegten Übergabe ( e4e6d4d5e5c59c69f3bd7be2 ):

    git checkout e4e6d4d5e5c59c69f3bd7be2~1 path/to/file.ext

    Beachten Sie die ~1 .

342voto

Manu Punkte 4021

So stellen Sie alle gelöschten Dateien in einem Ordner wieder her:

git ls-files -d | xargs git checkout --

154voto

Brett Punkte 3906

Wenn Sie eine Datei gelöscht haben, die in der aktuellen HEAD commit, können Sie es mit wiederherstellen:

git checkout HEAD -- path/to/file.ext

101voto

Josh Lee Punkte 159535

Wenn Sie wahnsinnig sind, verwenden Sie git-bisect . Hier ist, was zu tun ist:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

Nun ist es an der Zeit, den automatisierten Test auszuführen. Der Shell-Befehl '[ -e foo.bar ]' wird 0 zurückgeben, wenn foo.bar existiert, andernfalls 1. Der Befehl "run" von git-bisect verwendet die binäre Suche, um automatisch die erste Übertragung zu finden, bei der der Test fehlschlägt. Sie beginnt in der Mitte des angegebenen Bereichs (von "gut" bis "schlecht") und halbiert ihn auf der Grundlage des Ergebnisses des angegebenen Tests.

git bisect run '[ -e foo.bar ]'

Jetzt sind Sie bei dem Commit, der es gelöscht hat. Von hier aus können Sie zurück in die Zukunft springen und mit git-revert um die Änderung rückgängig zu machen,

git bisect reset
git revert <the offending commit>

oder Sie können eine Übertragung zurückgehen und den Schaden manuell überprüfen:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

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