git wiederhergestellte gelöschte Datei wiederherstellen, bei der nach dem Löschen kein Commit durchgeführt wurde

812

Ich habe einige Dateien gelöscht.

Ich habe mich noch NICHT verpflichtet.

Ich möchte meinen Arbeitsbereich zurücksetzen, um die Dateien wiederherzustellen.

Ich habe a git checkout ..

Die gelöschten Dateien fehlen jedoch noch.

Und git statuszeigt:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

Warum wird git checkout .der Arbeitsbereich nicht zurückgesetzt HEAD?

Homan
quelle
16
Wenn Sie Ihre Änderungen nach dem Löschen nicht vorgenommen hätten, git checkout .hätte dies einwandfrei funktioniert.
Faizal
10
@faizal und Sie werden Ihre Änderungen verlieren, wenn Sie das tun.
Vasiliy Yorkin
1
Drücken Sie einfach Strg-J in Git-GUI auf das gelöschte Element.
Ajeh
git checkout - cc.properties store / README store / cc.properties
Vinod Pasi
Siehe diese Antwort: quora.com/…
live-love

Antworten:

787

Die Ausgabe sagt Ihnen, was Sie tun müssen. git reset HEAD cc.propertiesusw.

Dadurch wird die rm-Operation aufgehoben. Danach wird ein Laufen git statuswerden Sie wieder sagen , dass Sie ein tun müssen , um git checkout -- cc.propertiesdie Datei wieder zu bekommen.

Update: Ich habe dies in meiner Konfigurationsdatei

$ git config alias.unstage
reset HEAD

was ich normalerweise benutze, um Sachen zu inszenieren.

Noufal Ibrahim
quelle
5
Wie machen Sie das für mehrere gelöschte Dateien? Das mehrmalige Ausführen von git reset HEAD << Dateiname >> wäre umständlich. Gibt es eine effiziente Möglichkeit, dies zu erreichen?
SubSul
70
git reset HEAD \*und danngit checkout -- .
Noufal Ibrahim
3
aber ich habe Dateien geändert.
Jiang YD
@RauliRajande Es ist wahrscheinlich, dass sich Ihre Situation von der in der ursprünglichen Frage beschriebenen unterscheidet.
Noufal Ibrahim
1
rm -r ./engines- Hoppla. Jetzt git reset engines; git checkout engines.
Kris
209

Sie haben die Löschung so inszeniert, dass Sie Folgendes tun müssen:

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . checkt nur aus dem Index aus, in dem die Löschung bereits durchgeführt wurde.

CB Bailey
quelle
177

Mach einfach git checkout path/to/file-I-want-to-bring-back.txt

seddonym
quelle
8
funktioniert nur, wenn Dateien nicht festgeschrieben und gepusht wurden.
Mahen3d
23
Hat bei mir nicht funktioniert, Git sagte, dass es keine Datei mit diesem Namen kennt, obwohl die Datei verfolgt wird. Ich habe mich auch nicht verpflichtet, sondern nur versehentlich eine Datei über das Kontextmenü von netbeans gelöscht.
Zelphir Kaltstahl
4
@ Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov
@ user3479125 Ich denke, Ihre Datei wurde nie festgeschrieben. Was git statussagt dazu?
Ki92
12
Der Git-Status zeigte grün an. "Delated file.ext" git checkout HEAD -- file.exthalf bei der Wiederherstellung.
Ivan Borshchov
144

So stellen Sie alle nicht bereitgestellten Löschvorgänge automatisch auf einmal wieder her, ohne jeden einzelnen Pfad anzugeben:

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

So stellen Sie alle bereitgestellten Löschvorgänge automatisch auf einmal wieder her, ohne jeden einzelnen Pfad anzugeben:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --
PaoloC
quelle
12
Ich habe versehentlich über 500 Dateien gelöscht und dies war ein Vergnügen, da auch alle meine gültigen Änderungen beibehalten wurden (die erste Zeile ist die, die ich verwendet habe). Vielen Dank.
Guy Lowe
1
Alle Inhalte eines Repos wurden sofort nach einem erfolgreichen Build versehentlich gelöscht. Der erste Befehl rettete meinen Speck.
MonaLisaOverdrive
2
Bevor das für mich funktionieren würde, musste ich rennen git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ian Dunn
1
Sehr nützlich, wollte nicht verfolgte Dateien behalten, aber gelöschte und geänderte Dateien entfernen, nur -d in -m geändert, um die geänderten zu behandeln.
RaisinBranCrunch
5
Beachten Sie, dass dies nicht funktioniert, wenn Ihre Dateinamen / Pfade Leerzeichen enthalten. Ich denke git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --wird funktionieren.
Petersilie72
79

Da Sie a ausführen, scheint git checkout .es, als würden Sie versuchen, Ihren Zweig auf den letzten Festschreibungsstatus zurückzusetzen.

Sie können dies mit einem erreichen git reset HEAD --hard

Warnung

Wenn Sie dies tun, werden möglicherweise alle Ihre neuesten Änderungen entfernt und Ihre Änderungen aufgehoben, z. B. können Sie Arbeit verlieren. Es kann sein, was Sie wollen, aber lesen Sie die Dokumente , um sicherzugehen.

Paul T.
quelle
39
Woww !! Vorsicht damit !!!! Sie haben vielleicht Recht, aber jemand könnte verwirrt sein und seinen gesamten Code in die Luft jagen. Es wäre cool, wenn Sie eine größere Warnung hinzufügen würden.
Santiagobasulto
3
Genau das brauchte ich. Sprengt nicht Ihren gesamten Code in die Luft - bringt Sie einfach zu Ihrem letzten Commit zurück.
Andrew Hendrie
2
Ich hatte an einem Punkt Hunderte fehlender Dateien. Dies ist der einzige praktische Weg, um das Problem zu beheben. Vielen Dank!
Jonathan Benn
66

wenn du benutzt hast

git rm filename

um dann eine Datei zu löschen

git checkout path/to/filename

funktioniert nicht, also in diesem Fall

git checkout HEAD^ path/to/filename

sollte arbeiten

Aurangzeb
quelle
2
Ich mag diese Antwort. Es besteht kein Zweifel, dass Sie nur die bestimmte Datei betreffen , die Sie entfernt haben. 1) Git Checkout Pfad / zu / Dateiname 2) Git Checkout Pfad / zu / Dateiname
Ed of the Mountain
Ausgezeichnet. git checkout HEAD^ path/to/filenamearbeitete für mich, da ich die Datei nicht festgeschrieben hatte.
Moses Ndeda
29

Hier ist der Befehl, der mir auf meinem Mac geholfen hat. Ich habe einige der anderen Lösungen ausprobiert, aber sie haben bei mir nicht funktioniert.

Git-Version unter OSX Mavericks

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

Befehl

git checkout HEAD -- path/to/file/file.cc
Chris Hinshaw
quelle
19
git checkout HEAD -- client/src/pp_web/index.cljs
Dustin Getz
quelle
17

Wenn Sie alle Dateien auf einmal wiederherstellen möchten

Denken Sie daran, den Punkt zu verwenden, da er git anweist, alle Dateien abzurufen.

Dieser Befehl setzt den Kopf zurück und hebt alle Änderungen auf:

$ git reset HEAD . 

Führen Sie dann Folgendes aus, um alle Dateien wiederherzustellen:

$ git checkout .

Wenn Sie dann einen Git-Status ausführen, erhalten Sie:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Casper Wilkes
quelle
Dies ist die einfachste Lösung und funktioniert für eine Reihe von Dateien (nehmen wir an, Sie haben mehrere Dateien / Ordner gelöscht). gute Arbeit Kumpel +
Gkiokan
9

Sie können Sie sehen wollen , diese

Das gilt für Fälle, in denen Sie verwendet haben

git checkout -- .

bevor Sie etwas begehen.

Möglicherweise möchten Sie auch erstellte Dateien entfernen, die noch nicht erstellt wurden. Und du willst sie nicht. Mit:

git reset -- .
Paulo Linhares - Packapps
quelle
Sie haben die kopierte Antwort nicht vollständig gemeldet. Tatsächlich git checkout -- .hilft es nicht, gelöschte Dateien wiederherzustellen, und entspricht dem, was der Fragesteller versucht hat : git checkout .. Der Teil, der funktionieren kann, ist der, den Sie nicht kopiert haben : git checkout <file_path>.
Jean Paul
6

Ich habe diesen Beitrag gefunden, als ich nach Antworten zum Löschen einer Datei gesucht habe, die nach dem Zusammenführen aus einem anderen Zweig in meinem Arbeitsverzeichnis gelöscht wurde. Nach dem Zusammenschluss wurde noch kein Commit durchgeführt. Da es sich um eine laufende Zusammenführung handelt, konnte ich sie nicht einfach wieder hinzufügen, indem ich:

$ git reset <commitid#-where-file.cpp-existed> file.cpp

Ich musste zusätzlich zum Zurücksetzen einen weiteren Schritt ausführen, um die Datei zurückzubringen:

$ git checkout -- file.cpp
user2453404
quelle
4

Wenn Sie keine Änderungen festgeschrieben haben, müssen Sie diese Änderungen nur aufbewahren, und Sie kehren zum letzten festgeschriebenen Festschreiben zurück.

git stash
git stash clear
git clean 
Rick
quelle
Es ist keine Lösung, es auf den Stapel zu legen. Es ist ein Hack.
Robert Dolca
2
Dies ist eine gute Lösung, da Sie es aus dem Vorrat entfernen können. Ob es ein Hack ist oder nicht, es ist Geschmackssache. Die ganze Idee von Stash ist ein kluger Hack.
Eino Mäkitalo
@ EinoMäkitalo froh, dass es Ihnen helfen könnte :)
Rick
Ich mag diesen Ansatz am besten von allen aufgelisteten
ckapilla
3

wenn Sie nach einem gelöschten Verzeichnis suchen.

 git checkout ./pathToDir/*
PPB
quelle
3

Hier sind verschiedene Fälle als Referenz, um anderen zu helfen:

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.

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

Es sollte Ihnen etwas geben wie c46e81aa403ecb8a0f7a323a358068345: Verwenden Sie jetzt commit # hier

$ git checkout <commit>^ -- <file>

So etwas wie das: $ git checkout c46e81aa403ecb8a0f7a323a358068345 -

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

Wenn Sie nur die Liste der Dateien anzeigen möchten:

git log --diff-filter=D --summary | grep "delete mode"
Muhammad Soliman
quelle
2

Für mich hat funktioniert git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

Zum Beispiel git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(wird in dem Zweig ausgeführt, in den die Datei gehen soll)

Nachdem dieser Befehl ausgeführt wurde, befindet sich die wiederhergestellte Datei am ursprünglichen Speicherort (der festgeschrieben werden muss).

Dinis Cruz
quelle
und / oder einfach a, git checkout master path/to/the/file.bindamit Sie diese Datei einfach wiederherstellen, ohne andere Änderungen zu verlieren, die Sie möglicherweise vorgenommen haben. PS: Dies sollte die akzeptierte Antwort sein ...
Edoardo
1

Wenn Sie ToroiseGIT installiert haben, wählen Sie einfach den Menüpunkt "Zurücksetzen ..." für das Popup-Menü des übergeordneten Ordners.

Vasyl Shyrochuk
quelle
1

1.Finden Sie das bestimmte Commit, zu dem Sie zurückkehren möchten, indem Sie Folgendes verwenden:

   git log
This command will give you a list of commits done by you .

2.Rechten Sie auf dieses Commit mit:

    git revert <commit id> 

Jetzt würde Ihre lokale Niederlassung insbesondere alle Dateien haben

Ashutosh S.
quelle
Dies funktioniert, wenn Sie Ihre Änderungen bereits festgeschrieben haben.
Live-Love
1

VORSICHT: Legen Sie alle Arbeiten fest, die Sie zuerst behalten möchten.

Sie können Ihren Arbeitsbereich zurücksetzen (und die gelöschten Dateien wiederherstellen).

git checkout ./*
Henrique Florêncio
quelle
2
Zu Ihrer
Information
Aus diesem Grund verwenden Sie diesen Befehl, um Ihren Arbeitsbereich zurückzusetzen. Ich dachte, das wäre selbsterklärend.
Henrique Florêncio
1
Dieser Befehl funktioniert nicht, da die Datei beim Löschen nicht abgefangen wird ./*.
Jean Paul
@ JeanPaul Vielleicht habe ich ein Missverständnis, aber es hat meinen Arbeitsbereich in den ursprünglichen Zustand versetzt (gelöschte Datei jetzt vorhanden).
Marc
@Marc Es könnte funktionieren, aber nur, wenn es keine sichtbare Datei im Verzeichnis gibt, da es sonst ./*durch Bash erweitert wird, um mit diesen Dateien übereinzustimmen, bevor es an Git gesendet wird.
Jean Paul
0

Ich hatte das gleiche Problem, aber keine der oben genannten Lösungen funktionierte für mich. Am Ende habe ich Folgendes getan:
- eine leere Datei mit demselben Namen erstellen
- diese Datei mit ihrem lokalen Verlauf vergleichen
- den Verlauf in eine leere Datei kopieren.

theEUG
quelle
-1

Ich hatte das gleiche Problem und keine der Antworten, die ich hier versuchte, funktionierte auch für mich. Ich verwende Intellij und habe einen neuen Zweig ausgecheckt git checkout -b minimalExample, um ein "minimales Beispiel" für den neuen Zweig eines Problems zu erstellen , indem ich eine Reihe von Dateien gelöscht und eine Reihe anderer im Projekt geändert habe . Obwohl ich keine der Änderungen im neuen Zweig "Minimales Beispiel" festgeschrieben habe, waren leider alle Änderungen und Löschungen im Zweig "Minimales Beispiel" im Zweig "Minimales Beispiel" im " ursprünglicher "Zweig auch (oder so schien es). Gemäßgit status den gelöschten Dateien waren gerade aus beiden Filialen verschwunden.

Obwohl Intellij mich gewarnt hatte, dass das Löschen dieser Dateien möglicherweise nicht vollständig wiederhergestellt werden kann, konnte ich sie glücklicherweise wiederherstellen (in dem minimalen Beispielzweig, aus dem sie tatsächlich gelöscht wurden), indem ich mit der rechten Maustaste auf das Projekt klickte und Lokaler Verlauf auswählte > Verlauf anzeigen (und dann das zuletzt gewünschte Verlaufselement wiederherstellen). Nachdem Intellij die Dateien im Zweig "Minimales Beispiel" wiederhergestellt hatte, schob ich den Zweig zum Ursprung. Dann wechselte ich zurück zu meinem "ursprünglichen" lokalen Zweig und lief git pull origin minimalExample, um sie auch wieder in den "ursprünglichen" Zweig zu bringen.

geneSummons
quelle