Suchen und Wiederherstellen einer gelöschten Datei in einem Git-Repository

2802

Angenommen, ich bin in einem Git-Repository. Ich lösche eine Datei und schreibe diese Änderung fest. Ich arbeite weiter und mache weitere Verpflichtungen. Dann muss ich diese Datei wiederherstellen.

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

  1. Was wäre der schnellste Weg, um das Commit zu finden, mit dem ein bestimmter Dateiname gelöscht wurde?
  2. Was wäre der einfachste Weg, um diese Datei wieder in meine Arbeitskopie aufzunehmen?

Ich hoffe, ich muss meine Protokolle nicht manuell durchsuchen, das gesamte Projekt für eine bestimmte SHA auschecken und diese Datei dann manuell in meine ursprüngliche Projektkasse kopieren.

avdgaag
quelle
39
Beachten Sie, dass der vorherige Kommentar die Frage im Titel und nicht im Text beantwortet. Dazu gehört auch, herauszufinden, wann die Datei gelöscht wurde.
Avdgaag
8
Um das Commit zu finden, wurde eine Datei gelöscht in:git log --diff-filter=D -- path/to/file
Titandecoy
54
@hhh git checkout deletedFilewird wiederhergestellt, deletedFilewenn es gelöscht wurde, aber dieses Löschen noch nicht bereitgestellt oder festgeschrieben wurde . Darum geht es hier nicht; In dieser Frage geht es darum, wie eine Datei wiederhergestellt werden kann, deren Löschung vor vielen Commits festgeschrieben wurde.
Mark Amery

Antworten:

3150

Suchen Sie das letzte Commit, das den angegebenen Pfad beeinflusst hat. Da sich die Datei nicht im HEAD-Commit befindet, muss sie durch dieses Commit gelöscht worden sein.

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

Überprüfen Sie dann die Version beim Festschreiben zuvor mit dem ^Symbol caret ( ):

git checkout <deleting_commit>^ -- <file_path>

Oder in einem Befehl, ob $filees sich um die betreffende Datei handelt.

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

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

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
CB Bailey
quelle
94
Das schwierige Bit besteht darin, das Commit VOR dem Auschecken mit dem Suffix ^ auszuchecken. Vielen Dank.
Christian Oudard
4
Aus irgendeinem Grund funktioniert dies in zsh nicht. ± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^ Ich wechselte zu Bash und es funktionierte aber gut.
Zoras
20
Über die Windows-Befehlszeile wurde eine Fehlermeldung angezeigt. error: pathspec <filename> did not match any file(s) known to git.. Die Lösung bestand darin, Git Bash zu verwenden.
Donturner
56
@zoras zsh hat eine eigene Erweiterung für '^', aber Sie können die alternative Syntax von '~ 1' verwenden: git checkout <deleting-commit>~1 -- <file-path> ~ X ermöglicht es Ihnen, X-Commits vor dem angegebenen Commit anzugeben, also ist ~ 1 das Commit vor ~ 2 ist zwei Commits vor, etc
Nils Luxton
22
Bei der Windows-Eingabeaufforderung cmd ist das ^Zeichen das Escape-Zeichen! Daher müssen Sie auf cmd eingeben, ^^um cmd mitzuteilen, dass Sie ein einzelnes Literal ^ möchten und dass Sie danach nicht mehr etwas anderem entkommen. Was vielen Menschen passiert, ist, dass auf das ^ein Leerzeichen folgt. Cmd glaubt also, dass Sie dem Raum entkommen - was einfach einen Raumcharakter ergibt. Wenn Git also die Cli-Argumente erhält, sieht es SHA1und nicht SHA1^ . Es ist wirklich nervig. ~ist kein Fluchtcharakter, deshalb funktioniert das immer noch. (PS. Wenn Sie glauben, dass Googler diese Informationen wollen, stimmen Sie diesen Kommentar bitte ab)
Alexander Bird
875
  1. Verwenden Sie git log --diff-filter=D --summarydiese Option , um alle Commits abzurufen, bei denen Dateien gelöscht und die Dateien gelöscht wurden.
  2. Verwenden Sie git checkout $commit~1 path/to/file.extdiese Option , um die gelöschte Datei wiederherzustellen.

Wo $commitist der Wert des Commits, den Sie in Schritt 1 gefunden haben, ze4cf499627

Robert Munteanu
quelle
10
neugierig, worauf bezieht sich die ~ 1?
Tommy Chheng
7
@tommy - Die Tilde-Spezifikation gibt Ihnen das n-te Enkelkind des genannten Commits. Weitere Informationen finden Sie unter book.git-scm.com/4_git_treeishes.html .
Robert Munteanu
5
Dies ist bei weitem der einfachste und intuitivste Ansatz. git log -- *PartOfMyFileName*. Vielen Dank für die$commit~1
bgs
3
Die git checkout $commit~1 filenameSyntax funktioniert perfekt für einzelne Dateien und auch für ganze Verzeichnisse. dh: um alle gelöschten Bilder in ./images von sha 12345 wiederherzustellen : git checkout 12345~1 images. danke für diese antwort!
Noinput
34
@Alexar $commit~1bedeutet, dass Sie den Namen des Commits hinzufügen sollten. So etwas wie 1d0c9ef6eb4e39488490543570c31c2ff594426cwo $commitist.
Eugene
319

Geben Sie den folgenden Befehl ein, um alle gelöschten Dateien in einem Ordner wiederherzustellen.

git ls-files -d | xargs git checkout --
Manu
quelle
1
Wohin werden die Dateien geleitet? Ich sehe keine Veränderung.
William Grand
21
Dies ist wahrscheinlich die einfachste Methode. Es ist pervers, wie schwierig gitselbst die einfachste Aufgabe gemacht hat.
JWW
git checkout - [Datei] setzt die Änderungen in der [Datei] zurück. Die Pipe ersetzt [Datei] durch den Namen der gelöschten Dateien.
Manu
6
Der ls-filesUnterbefehl ist praktisch, scheint aber nicht für Dateien zu funktionieren, die mit git rmdh inszeniert, geschweige denn festgeschrieben wurden, was das OP verlangt hat.
MarkHu
Das funktionierte die gelöschten Dateien wiederherzustellen, aber wie kann ich die Dateien aktualisieren , die in dem geändert und zeigen sich als M myChangedFilenach git checkout?
Libby
124

Ich bin auf diese Frage gekommen, um eine Datei wiederherzustellen, die ich gerade gelöscht habe, aber die Änderung noch nicht übernommen habe. Für den Fall, dass Sie sich in dieser Situation befinden, müssen Sie lediglich Folgendes tun:

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

Brett
quelle
93

Wenn Sie verrückt sind, verwenden Sie git-bisect. Folgendes ist zu tun:

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

Jetzt ist es Zeit, den automatisierten Test durchzuführen. Der Shell-Befehl '[ -e foo.bar ]'gibt 0 zurück, falls foo.barvorhanden, andernfalls 1. Der Befehl "run" von git-bisectverwendet die binäre Suche, um automatisch das erste Commit zu finden, bei dem der Test fehlschlägt. Es beginnt in der Mitte des angegebenen Bereichs (von gut bis schlecht) und halbiert ihn basierend auf dem Ergebnis des angegebenen Tests.

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

Jetzt sind Sie beim Commit, das es gelöscht hat. Von hier aus können Sie in die Zukunft zurückspringen und git-revertdie Änderung rückgängig machen.

git bisect reset
git revert <the offending commit>

oder Sie können ein Commit zurückgehen und den Schaden manuell untersuchen:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
Josh Lee
quelle
2
Könnten Sie näher darauf eingehen git bisect run '[ -e foo.bar ]'?
Avdgaag
Sie können gut und schlecht auch manuell verwenden, wenn dies nicht automatisch überprüft werden kann. Siehe die Halbierungs-Manpage.
Josh Lee
1
@avdgaag the git bisect runweist Git an, die Halbierung zu automatisieren, indem der Befehl nach dem Wort 'run' ausgeführt wird, wobei der Befehl 0für eine goodVersion zurückgegeben werden muss ( git help bisectEinzelheiten siehe ). Das '[ -e foo.bar ]'ist ein Standardausdruck für die Prüfung , ob die Datei foo.bartut existiert (die Umsetzung ist in die Regel in der Datei /usr/bin/[der in der Regel zu hardlinked /usr/bin/test) und die einzelnen quation Marken eingesetzt , die alle als ein einziges Befehlszeilenargument zu setzen.
Mikko Rantalainen
Großartige Idee. Ich habe diesen Ansatz ausprobiert und er hat vor dem Löschen ein Commit identifiziert, aber nicht das Commit, mit dem die Datei tatsächlich gelöscht wurde. In einem anderen Test wurden 2 Commits vor dem Löschen identifiziert.
Michael Osofsky
Wahnsinnig? Könnte sein. Aber Bisekt ist eine großartige Möglichkeit, um herauszufinden, wo ein Fehler aufgetreten ist, und es ist daher eine wertvolle Fähigkeit, diese zu lernen. Obwohl dies hier vielleicht nicht der "richtige" oder der "richtigste" Weg ist, ist es dennoch eine gute Idee und definitiv eine +1 wert!
Pryftan
77

Mein neues Lieblings alias, basierend auf bonyiii ‚s Antwort (upvoted) und meine eigene Antwort über‚ Übergeben Sie ein Argument für ein 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 vor einigen Commits versehentlich gelöscht wurde.
Schnell:

git restore my_deleted_file

Krise abgewendet.

Achtung, mit Git 2.23 (Q3 2019) kommt der experimentelle Befehl mit dem Namen git restore(!).
Benennen Sie diesen Alias ​​um (wie unten gezeigt).


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

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

Und Jegan fügt in den Kommentaren hinzu :

Zum Festlegen des Alias ​​über die Befehlszeile habe ich diesen Befehl verwendet:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 
VonC
quelle
7
Dadurch wird das gesamte Commit wiederhergestellt, nicht nur die angeforderte Datei.
Daniel Bang
5
Hier ist mein Alias, funktioniert wunderbar:restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
void.pointer
1
@ RobertDailey Das sieht gut aus! Ich habe Ihren Alias ​​in die Antwort aufgenommen, um die Sichtbarkeit zu verbessern.
VonC
1
Zum Festlegen des Alias ​​über die Befehlszeile habe ich diesen Befehl verwendet:git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Jegan
2
Expansion of alias 'restore' failed; '!git' is not a git command
Karl Morrison
55

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

Listen Sie alle Commits für diese Datei auf.

git log -- path/to/file

Das letzte Commit (oberstes) hat die Datei gelöscht. Sie müssen also das vorletzte Commit wiederherstellen.

git checkout {second to last commit} -- path/to/file
wisbucky
quelle
Ich habe gerade diese Lösung verwendet und es gab kein Commit für das Löschen. Ich konnte die Datei jedoch mit der neuesten Festschreibungs-ID wiederherstellen.
Adam
Würde das vorletzte Commit (vorheriges Commit zum Löschen) nicht die neueste Version der gelöschten Datei enthalten? Der vorletzte (der Commit vor dem vorherigen Commit zum Löschen) könnte hoffnungslos veraltet sein.
Suncat2000
1
Dies ist die erste Lösung, die ich gesehen habe und die so einfach ist, dass ich beim nächsten Mal nicht hierher zurückkehren muss, um sie zu finden. Könnte sein.
Eloff
@ Suncat2000 "vorletzter" bedeutet "vorheriges Festschreiben zum Löschen", genau wie "vorletzter". en.wiktionary.org/wiki/penultimate#Synonyms
wisbucky
Vielen Dank für diese Antwort !!!!!
Rakesh Bk
29

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

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

Es wurde auf Git Version 1.7.5.4 getestet.

Fedir RYKHTIK
quelle
1
Das hat bei mir nicht funktioniert. Nach dem Auschecken habe ich error: pathspec 'foo' did not match any file(s) known to git.mich vergewissert, dass der Dateiname korrekt ist. Git Version 2.7.0
wisbucky
-1; das ist falsch. Diese Befehle machen einen Löschvorgang rückgängig, der noch nicht festgeschrieben wurde (der erste löscht den Löschvorgang, wenn er inszeniert ist, und der zweite verwirft nicht bereitgestellte Änderungen an der Datei), aber Sie behaupten hier, dass sie einen festgeschriebenen Löschvorgang wiederherstellen Löschen der Datei, was einfach nicht stimmt und mit einem Fehler wie dem in @ wisbuckys Kommentar oben fehlschlägt.
Mark Amery
@MarkAmery In der Tat, ich denke, dieser Befehl hat gut für diejenigen Entwickler funktioniert, die keine explizite Bereitstellung für das Festschreiben für entfernte Dateien mit durchgeführt haben git add -A, aber die wiederhergestellte Datei befand sich noch in einem nicht festgeschriebenen Stadium.
Fedir RYKHTIK
25

Wenn Sie nur Änderungen vorgenommen und eine Datei gelöscht, aber nicht festgeschrieben haben, haben Sie jetzt mit Ihren Änderungen Schluss gemacht

git checkout -- .

Ihre gelöschten Dateien wurden jedoch nicht zurückgegeben. Führen Sie einfach den folgenden Befehl aus:

git checkout <file_path>

Und schon ist Ihre Datei zurück.

Paulo Linhares - Packapps
quelle
24

Ich habe diese Lösung .

  1. Rufen Sie die ID des Commits ab, bei dem die Datei auf eine der folgenden Arten gelöscht wurde.

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

Commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autor: Alexander Orlov Datum: Do 12. Mai 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: Do 12. Mai 22:10:22 2011 +0200

3 . Verwenden Sie jetzt die Festschreibungs-ID bfe68bd117e1091c96d2976c99b3bcc8310bebe7, um:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

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

Alex
quelle
Dies ist der gleiche Ansatz wie bei der akzeptierten Antwort, jedoch mit einigen weiteren Möglichkeiten, das Lösch-Commit zu finden. Ich mag immer noch den Ansatz in der akzeptierten Antwort, aber dies sind gute Alternativen. Vielen Dank!
Avdgaag
Ich gehe davon aus, dass beim erstmaligen Auschecken der gelöschten Datei und dem anschließenden Festschreiben (ohne sie zu ändern) keine Kopie der Datei erstellt wird. Recht? (Ich muss dies mit Bildern tun, und eine Kopie würde das Repository größer machen)
Stonecrusher
15
git checkout /path/to/deleted.file
user1528493
quelle
Dieser für meine Situation (unbeabsichtigt entfernt) war die einfachste Lösung.
Paulo Oliveira
Eine Erklärung wäre angebracht.
Peter Mortensen
12

git undelete path/to/file.ext

  1. Fügen Sie dies in Ihre .bash_profile(oder eine andere relevante Datei ein, die beim Öffnen einer Befehlsshell geladen wird):

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

    git undelete path/to/file.ext
    

Dieser Alias ​​überprüft zuerst, ob das letzte Commit gefunden wurde, in dem diese Datei vorhanden war, und führt dann eine Git-Überprüfung dieses Dateipfads von dem letzten Commit durch, in dem diese Datei vorhanden war. Quelle .

Beau Smith
quelle
11

In vielen Fällen kann es nützlich sein, Coreutils (grep, sed usw.) in Verbindung mit Git zu verwenden. Ich kenne diese Tools bereits recht gut, Git weniger. Wenn ich nach einer gelöschten Datei suchen möchte, würde ich Folgendes tun:

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

Wenn ich die Revision / Commit finde:

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

Genau wie andere vor mir gesagt haben.

Die Datei wird nun in dem Zustand wiederhergestellt, den sie vor dem Entfernen hatte. Denken Sie daran, es erneut in den Arbeitsbaum zu übernehmen, wenn Sie es behalten möchten.

Thomas E.
quelle
7

Ich musste eine Reihe gelöschter Dateien aus einem bestimmten Commit wiederherstellen und habe es mit zwei Befehlen verwaltet:

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 Gitignore-Datei hinzugefügt und dann mit gelöscht git rm. Ich musste die Dateien wiederherstellen, sie dann aber entfernen. Ich musste Hunderte von Dateien wiederherstellen, und die manuelle Eingabe für jede Datei wie in den anderen Beispielen würde viel zu langsam sein.

kzar
quelle
7

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

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

Dann wähle ich die Commits aus, mit denen mein Freund die PostAd.jsDatei löscht . jetzt siehe unten:

Geben Sie hier die Bildbeschreibung ein

Und jetzt kann ich meinen Wunsch gelöschte Datei sehen. Ich doppelklicke einfach auf den Dateinamen und er wird wiederhergestellt.

Geben Sie hier die Bildbeschreibung ein

Ich weiß, dass meine Antwort keine Git-Befehle sind, aber sie ist schnell, zuverlässig und einfach für Anfänger und professionelle Entwickler. WebStorm VCS-Tools sind fantastisch und perfekt für die Arbeit mit Git und es werden keine anderen Plugins oder Tools benötigt.

AmerllicA
quelle
1
Das ist fantastisch! Vielen Dank. Auf jeden Fall eine einfachere Lösung für diejenigen, die eine der IDEs von JetBrains verwenden.
Fabiano Arruda
Wie stellen wir die Datei wieder her, wenn es sich um ein Image handelt?
Nodirabegimxonoyim
Sehr geehrter @FabianoArruda, JetBrains IDEs sind leistungsstarke Tools für die Entwicklung. Vielen Dank für Ihren schönen Kommentar.
AmerllicA
Vielen Dank, lieber @PeterMortensen, für die Ausgabe.
AmerllicA
6

Ich hatte die gleiche Frage. Ohne es zu wissen, hatte ich ein baumelndes Commit erstellt .

Liste baumelnde Commits

git fsck --lost-found

Überprüfen Sie jedes baumelnde Commit

git reset --hard <commit id>

Meine Dateien wurden wieder angezeigt, als ich zum Dangling Commit wechselte.

git status aus dem Grund:

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

rustyMagnet
quelle
2
Vielen Dank. Sie haben mir geholfen, Tausende von Codezeilen wiederherzustellen.
Ruben
5
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
user1797498
quelle
2
Die Frage betraf das Wiederherstellen einer Datei, nachdem sie gelöscht und die Änderung festgeschrieben wurde. Bei dieser Antwort geht es darum, eine Datei wiederherzustellen, die nur im Arbeitsverzeichnis entfernt wurde.
Akaihola
Das stimmt, und das war es, wonach ich gesucht habe.
Hola Soja Edu Feliz Navidad
4

Wenn Sie das Commit kennen, mit dem die Datei (en) gelöscht wurden, führen Sie diesen Befehl aus. Dabei <SHA1_deletion>handelt es sich um das Commit, mit dem die Datei gelöscht wurde:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

Der Teil vor der Pipe listet alle Dateien auf, die im Commit gelöscht wurden. Sie sind alle aus dem vorherigen Commit ausgecheckt, um sie wiederherzustellen.

Tony Wickham
quelle
4

Suchen Sie das Commit, mit dem Ihre Datei gelöscht wurde:

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

Beispielausgabe:

4711174

Ab Git 2.23 gibt es tatsächlich einen restoreBefehl. Es ist noch experimentell, aber um etwas wiederherzustellen, das Sie in einem Commit entfernt haben (in diesem Fall 4711174), können Sie Folgendes eingeben:

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

Beachten Sie die ^ nach der Commit - ID , wie wir etwas wiederherstellen möchten aus dem Commit vor demjenigen der die Datei gelöscht hat.

Das --sourceArgument teilt dem restoreBefehl mit, wo nach den wiederherzustellenden Dateien gesucht werden soll, und es kann sich um ein beliebiges Commit und sogar um den Index handeln.

Siehe: git-restore doc für git 2.23.0

cb2
quelle
4

In unserem Fall haben wir versehentlich Dateien in einem Commit gelöscht und einige Commits später haben wir unseren Fehler erkannt und wollten alle gelöschten Dateien zurückbekommen, aber nicht diejenigen, die geändert wurden.

Basierend auf Charles Baileys hervorragender Antwort ist 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)
bonyiii
quelle
2

Einfach und präzise

Holen Sie sich zunächst ein aktuelles stabiles Commit, in dem Sie diese Datei haben, indem Sie -

git log 

Angenommen, Sie finden $ commitid 1234567 ... dann

git checkout <$commitid> $fileName

Dadurch wird die Dateiversion wiederhergestellt, die sich in diesem Commit befand.

Sudhanshu Jain
quelle
1

Probieren Sie es aus, um den besten Weg zu finden.


Suchen Sie zunächst die Commit-ID des Commits, das Ihre Datei gelöscht hat. Sie erhalten eine Zusammenfassung der Commits, mit denen Dateien gelöscht wurden.

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

git checkout 84sdhfddbdddf ~ 1

Hinweis: 84sdhfddbdddist deincommit id

Auf diese Weise können Sie alle gelöschten Dateien einfach wiederherstellen.

Ritesh Adulkar
quelle
1

Sie könnten immer git revertIhr Commit, das die Datei gelöscht hat. ( Dies setzt voraus, dass das Löschen die einzige Änderung im Commit war. )

> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <[email protected]>
Date:   Thu May 9 11:11:06 2019 -0700

    deleted readme.md

Wenn Sie die Arbeit fortgesetzt haben und später festgestellt haben, dass Sie dieses Lösch-Commit nicht festschreiben möchten, können Sie es mit folgenden Schritten zurücksetzen:

> git revert 2994bd

Jetzt git logzeigt:

> git log
Author: Dave <[email protected]>
Date:   Thu May 9 11:17:41 2019 -0700

    Revert "deleted readme"

    This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

Und readme.mdwurde im Repository wiederhergestellt.

Dave Baghdanov
quelle
Da die Frage davon ausgeht, dass nach dem Löschen der Datei eine Reihe von Festschreibungen vorgenommen wurden und es keinen Hinweis darauf gibt, dass die nachfolgenden Festschreibungen unerwünscht sind, scheint dies dem OP in der beschriebenen Situation nicht zu helfen.
Jonathan Leffler
1
Ja! Sie können nachfolgende Festschreibungen vornehmen und die Löschüberschreibung dennoch zurücksetzen. Wenn also Commit 111 die Datei löscht und Commit 222, 333, 444 Dinge hinzufügt / ändert, können Sie Commit 111 immer noch zurücksetzen, um das Löschen rückgängig zu machen, und es wird Commit 555
Dave Baghdanov
0

Ich habe auch dieses Problem mit dem folgenden Code, um eine vorherige Datei in ein lokales Verzeichnis abzurufen:

git checkout <file path with name>

Das folgende Beispiel funktioniert für mich:

git checkout resources/views/usaSchools.blade.php

Akbor
quelle
Bitte erwähnen Sie, was das Problem ist
Akbor
Die Löschung wurde bereits festgeschrieben. In diesem Fall müssen Sie das Commit angeben, von dem wiederhergestellt werden soll.
sba
-1
$ git log --diff-filter=D --summary  | grep "delete" | sort
kujiy
quelle
Eine Erklärung wäre angebracht.
Peter Mortensen
-1

Wenn das Löschen nicht festgeschrieben wurde, stellt der folgende Befehl die gelöschte Datei im Arbeitsbaum wieder her.

$ git checkout -- <file>

Mit dem folgenden Befehl können Sie eine Liste aller gelöschten Dateien im Arbeitsbaum abrufen.

$ git ls-files --deleted

Wenn das Löschen festgeschrieben wurde, suchen Sie das Festschreiben dort, wo es stattgefunden hat, und stellen Sie die Datei aus diesem Festschreiben wieder her.

$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>

Wenn Sie nach dem Pfad der wiederherzustellenden Datei suchen, zeigt der folgende Befehl eine Zusammenfassung aller gelöschten Dateien an.

$ git log --diff-filter=D --summary
Muhammad Soliman
quelle
-1

Um alle gelöschten Dateien mit Git wiederherzustellen, haben Sie auch folgende Möglichkeiten:

git checkout $(git ls-files --deleted)

Wobei git ls-files --deletedalle gelöschten Dateien aufgelistet und git checkout $(git command)die Liste der Dateien in einem Parameter wiederhergestellt wird.

Charles Duporge
quelle