Wie kann man ein "git rm -r" zurücksetzen?


378

Ich sagte aus Versehen git rm -r .. Wie kann ich mich davon erholen?

Ich habe mich nicht verpflichtet.

Ich denke, alle Dateien wurden zum Löschen markiert und auch physisch von meiner lokalen Kasse entfernt.

EDIT: Ich könnte (wenn ich den Befehl kenne) zum letzten Commit zurückkehren. Aber es wäre viel besser, wenn ich das einfach rückgängig machen könnte git rm -r .. Weil ich nicht wirklich sicher bin, was ich nach dem letzten Commit und vor dem gemacht habe git rm -r ..


3
Für diese spezielle Frage ist reset --hard eine gute Lösung ... es ist bereits aufgeführt, daher erwähne ich in diesem Kommentar nur, dass Sie möglicherweise die Dokumentation auf git-reflog überprüfen möchten.
William Pursell

8
Beachten Sie, dass , weil Sie nicht liefern -fzu git rmgit keine Dateien entfernt , die inszeniert hatte oder unstaged Änderungen so ein git reset; git checkout .alles erholen sollte.
CB Bailey

Pass auf - git checkout. löscht alle nicht bereitgestellten Änderungen.
PeterB

1
Ich habe gerade so etwas gemacht und ich verstehe nicht, warum meine lokalen Dateien gelöscht wurden (und wie das OP habe ich noch keine
Festschreibung vorgenommen

Mit Git 2.23+ (August 2019) würden Sie Dateien wiederherstellen mit git restore: git restore -s@ -SW -- .. Siehe meine Antwort unten .
VonC

Antworten:


468
git reset HEAD

Sollte es tun. Wenn Sie keine nicht festgeschriebenen Änderungen haben, die Sie interessieren, dann

git reset --hard HEAD

sollte alles zwangsweise auf Ihr letztes Commit zurücksetzen. Wenn Sie nicht festgeschriebene Änderungen haben, der erste Befehl jedoch nicht funktioniert, speichern Sie Ihre nicht festgeschriebenen Änderungen mit git stash:

git stash
git reset --hard HEAD
git stash pop

22
Beachten Sie, dass git reset --hard HEADalle nützlichen Änderungen, die Sie in übergeordneten Verzeichnissen des aktuellen Arbeitsverzeichnisses vorgenommen haben , zerstört werden.
Alex Brown

10
@Mild: Ich trage immer noch einen kalten Schweiß!
Hoipolloi

6
Ich habe nicht abgestimmt, aber ich habe nur versucht, mich zu verstecken, hart zurückzusetzen, zu knallen und alle meine letzten Änderungen verloren. Vielleicht habe ich die Antwort falsch verstanden.
Greg M. Krsak

1
Das funktioniert bei mir selten und ich bin so froh, dass ich in einem Dropbox-Ordner arbeite. Schlechte Form, aber rettet mich jedes Mal ...
Nuby

3
Als ich git stash pop gemacht habe, hat es die Dateien einfach wieder entfernt, natürlich, weil es die Tatsache versteckt, dass ich (aus Versehen) einige Dateien entfernt habe. Diese Antwort funktioniert nicht, wenn Sie nicht festgeschriebene Änderungen haben, die Sie behalten möchten.
Sudo

252

Ich gab ein paar Dateien heraus und nahm vor meinem nächsten Commit weitere Änderungen vor, als mir klar wurde, dass ich einige dieser Dateien zurück brauchte. Anstatt zu verstauen und zurückzusetzen, können Sie einfach die einzelnen Dateien auschecken, die Sie verpasst / entfernt haben, wenn Sie möchten:

git checkout HEAD path/to/file path/to/another_file

Dadurch bleiben Ihre anderen nicht festgeschriebenen Änderungen ohne Problemumgehungen erhalten.


6
Dies half, weil ich andere nicht festgeschriebene Änderungen hatte.
Dan

4
Diese Antwort hilft denjenigen von uns, die auf diese Frage gestoßen sind und versuchen, eine einzelne git rmstatt einer ganzen rekursiven zurückzusetzen git rm -r. Für ein vollständiges rekursives Löschen sind die anderen Lösungen möglicherweise besser, abhängig von der Anzahl der entfernten Dateien.
Tresf

Sie, mein Mann, verdienen eine Auszeichnung.
Salamit

Wenn ich könnte, würde ich es 100-mal anklicken !!!
Wagner Braga

57

Um einige einzelne Dateien oder Ordner wiederzugewinnen, können Sie Folgendes verwenden

git reset -- path/to/file
git checkout -- path/to/file

Dadurch werden zuerst die Indexeinträge für path/to/fileneu erstellt und die Datei wie beim letzten Festschreiben neu erstellt, d HEAD. H.

Hinweis: Sie können einen Commit-Hash an beide Befehle übergeben, um Dateien aus einem älteren Commit neu zu erstellen. Siehe git reset --helpund git checkout --helpfür Details.


Beste Antwort. Einfaches chirurgisches "Rückgängigmachen" einer einzelnen git rmOperation, ohne andere nicht festgeschriebene Änderungen zu löschen.
Wberry

Hat mir geholfen! beste Antwort.
Akram

28

Aktualisieren:

Da git rm .alle Dateien in diesem und untergeordneten Verzeichnissen an der Arbeitskasse sowie im Index gelöscht werden, müssen Sie jede dieser Änderungen rückgängig machen:

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD

Dies sollte tun, was Sie wollen. Es hat keine Auswirkungen auf übergeordnete Ordner Ihres ausgecheckten Codes oder Index.


Alte Antwort, die nicht war:

reset HEAD

wird den Trick machen und keine nicht festgeschriebenen Änderungen löschen, die Sie an Ihren Dateien vorgenommen haben.

Danach müssen Sie alle git addBefehle wiederholen , die Sie in die Warteschlange gestellt haben.


1
Entschuldigung, ich habe immer git alias.co="checkout"so eingerichtet, dass git coes zur Kasse geht.
Alex Brown

25

Wenn am Ende keine der oben genannten Funktionen ausgeführt wird, können Sie möglicherweise Daten mithilfe des Vorschlags von hier abrufen: http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>

4 Jahre später immer noch ein Lebensretter!
ThievingSix

Ich habe ein C ++ - Programm geschrieben, um die Ergebnisse zu verketten (ich hatte ungefähr 100 Objekte in meinem Repo, was dies notwendig machte). Einfach kompilieren und ausführen und dann in Ihrem lokalen Git Repo-Verzeichnis übergeben. raw.githubusercontent.com/bluuman/git-recover-files/master/…
James Meas

15

git rm rückgängig machen

git rm file             # delete file & update index
git checkout HEAD file  # restore file & index from HEAD

git rm -r rückgängig machen

git rm -r dir          # delete tracked files in dir & update index
git checkout HEAD dir  # restore file & index from HEAD

git rm -rf rückgängig machen

git rm -r dir          # delete tracked files & delete uncommitted changes
not possible           # `uncommitted changes` can not be restored.

Uncommitted changesbeinhaltet not staged changes, staged changes but not committed.


Natürlich kann nichts rückgängig gemacht werden git rm -rf, da dadurch auch nicht verfolgte oder bereitgestellte (nur) Dateien gelöscht werden können.
Jpaugh

git rm -rf fileund git rm -rf dirlöscht keine nicht verfolgten Dateien.
Lied xu

10

Wenn Sie die Änderungen festgeschrieben und übertragen haben, können Sie dies tun, um die Datei wiederherzustellen

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file

Dies funktionierte für 'Änderungen, die festgeschrieben werden sollten:', wo eine Datei aus einem alten Git-Cherry-Pick gelöscht wurde, den ich noch brauchte. Ich hatte versucht, den Git-Reset HEAD ~ <Nummer> <Datei> zurückzusetzen, was nicht funktionierte.
Mushcraft

7

Es gibt bereits einige gute Antworten, aber ich könnte eine wenig verwendete Syntax vorschlagen, die nicht nur großartig funktioniert, sondern auch sehr explizit in dem ist, was Sie wollen (daher nicht beängstigend oder mysteriös).

git checkout <branch>@{"20 minutes ago"} <filename>

3

Liste festschreiben

git log  --oneline

Zum Beispiel hat Stable Commit Hash: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master

1

Ich hatte eine identische Situation. In meinem Fall war die Lösung:

git checkout -- .

0

Bei Git 2.23+ (August 2019) wäre der richtige Befehl zum Wiederherstellen von Dateien (und des Index) die Verwendung von ... git restore(nicht reset --hardoder der verwirrende git checkoutBefehl )

Das ist:

git restore -s=HEAD --staged --worktree -- .

Oder seine abgekürzte Form:

git restore -s@ -SW -- .

-1

Ich hatte genau das gleiche Problem: Ich habe meine Ordner aufgeräumt, Dateien neu angeordnet und verschoben. Ich trat ein: git rm . und drücken Sie die Eingabetaste. und dann spürte ich, wie sich mein Darm etwas lockerte. Zum Glück habe ich git commit -m nicht sofort eingegeben.

Allerdings der folgende Befehl

git checkout .

stellte alles wieder her und rettete mein Leben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.