Kann ich gelöschte Dateien wiederherstellen (ein `git clean -fdx` rückgängig machen)?


119

Ich habe die Anweisungen zum Erstellen von Github-Seiten befolgt und vergessen, in mein Git-Unterverzeichnis zu wechseln. Infolgedessen habe ich gerade ein ganzes Verzeichnis von Dokumenten mit nuked git clean -fdx.
Kann ich diesen schrecklichen Fehler auf irgendeine Weise rückgängig machen?


2
Ich weiß es nicht genau, aber ich denke nicht, dass es mit Git möglich ist. Ein nicht wiederhergestelltes Dienstprogramm für Ihr Dateisystem kann jedoch den Trick ausführen.
static_rtti

9
Interessanterweise schlägt Git Community Book auch git clean -fdxohne Vorwarnung vor, dass der Betrieb so gefährlich ist. Ich frage mich, wie viele Menschen mit diesem scheinbar unschuldigen Vorschlag ihre Akten unwiderruflich zerstört haben.
Katpnose

5
Überprüfen Sie unbedingt, ob Ihre IDE einen "lokalen Verlauf" aufweist, wie dies bei Eclipse- oder IntelliJ-IDEs der Fall ist. Das kann Ihnen bei versehentlichen git cleanAnrufen viel Herzschmerz ersparen . Versuchen Sie auch, sich von der Gewohnheit des Reinigens zu lösen, ohne dies zu überprüfen. Erstellen Sie ein aufrufbares Powershell- oder Bash-Skript, das git clean -fdxnmit einer Bestätigungsaufforderung ausgeführt wird, bevor Sie die unglaublich zerstörerische Bereinigung ausführen .
Josh Burgess

Antworten:


129

Nein, diese Dateien sind weg.

(Nur unter Linux überprüft: Git Clean Callsunlink() und keine Sicherung im Voraus.)


32
Wenn Sie eine erweiterte IDE wie RubyMine, Eclipse usw. verwenden, besteht möglicherweise ein lokaler Verlauf gelöschter Dateien, und Sie können diese möglicherweise wiederherstellen.
Usman

1
@Usman hatte in meinem Fall git cleanversehentlich zurückgestellte Änderungen im .ideaversteckten Ordner gelöscht und der lokale Verlauf hat mich gerettet!
Emkman

2
Toller Tipp von @Usman. Mit Eclipse konnte ich meine Datei mit der Option "Aus lokalem Verlauf
wiederherstellen

1
Eigentlich ist das MÖGLICH, aber mit Hacky-Methode. Siehe diese Antwort: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow

4
In PyCharm können Sie sie auch wiederherstellen. Klicken Sie mit der rechten Maustaste in den Ordner, in dem sie sich befanden, klicken Sie auf Lokaler Verlauf, suchen Sie die Löschung und klicken Sie auf Zurücksetzen.
Juanjo Conti

48
git clean -fdxn

Führt einen Probelauf durch und zeigt Ihnen, welche Dateien gelöscht würden, wenn Sie ausgeführt würden

git clean -fdx

(Dies ist natürlich nur hilfreich, wenn Sie dies im Voraus wissen, aber für das nächste Mal)


7
Funktioniert -nfür die meisten Git-Befehle (und viele andere * nix-Befehle).
Nick McCurdy


18

Nein. "Git clean -fdx" löscht alle Dateien und Verzeichnisse, die git nicht verfolgt, aus Ihrem Arbeitsverzeichnis. Da Git diese Dateien nicht verfolgt, werden keine Sicherungen dieser Dateien erstellt. Zumindest normalerweise nicht.

Wenn Sie vor relativ kurzer Zeit ein 'git add' für eine dieser Dateien durchgeführt haben (aber das Commit abgebrochen haben), besteht die Möglichkeit, dass Sie es mit 'git fsck --lost-found' finden. Es ist einen Versuch wert, aber machen Sie sich keine allzu großen Hoffnungen.

In Zukunft sollten Sie lieber ein paar Mal zu oft als ein paar Mal zu selten festlegen. Auf diese Weise verfügen Sie zumindest über ein lokales Backup, auch wenn Sie diese Commits nicht auf eine Remote übertragen.


Das eigentliche Problem war, dass das Verzeichnis auch kein Repository sein sollte. Wenn ich auf das Protokoll zurückblicke, stellte sich heraus, dass ich vergessen habe, in das neue Repo-Verzeichnis zu wechseln, nachdem ich mkdires gelesen hatte
Eric

1
Kurz nachdem ich diese Frage gelesen hatte, schrieb ich einen Patch an Git, der eine Konfigurationsvariable hinzufügt, um jede gelöschte Datei zu sichern. Vielleicht könnte es für andere nützlich sein? github.com/kusma/git/tree/work/clean-backup
kusma

1
Ich hatte heute Glück !!! Danke an "git fsck --lost-found". Ich habe Folgendes verwendet, um ALLE Änderungen zu erhalten: git fsck | awk '{print $ 3}' | xargs git show | tee searchresults.log Da ich die gesamte Datei haben wollte, die ich hinzugefügt und dann entfernt hatte, konnte ich sie aus dem Protokoll abrufen. :)
Marcello de Sales

11

Wie oben erwähnt, können Sie, wenn Sie Glück haben (falls Sie jemals "git add" gemacht haben), das gesamte Objekt wie folgt extrahieren:

git fsck | awk '{print $3}' | xargs git show | tee searchresults.log

Auf diese Weise werden alle Arten von Chunks gesucht, die gesamten Unterschiede gesammelt und einer Datei hinzugefügt, mit der Sie die verlorene Datei extrahieren können. In meinem Fall hatte ich eine ganze Java-Klasse verloren.


8

Wenn Sie eine Jetbrains-IDE verwenden, können Sie den lokalen Verlauf einer Datei anzeigen. Falls Sie es getan habengit clean , können Sie die Datei neu erstellen, den lokalen Verlauf der Datei überprüfen und von dort aus wiederherstellen.

Arbeitete für mich für eine einzelne Datei. Für ein vollständiges Verzeichnis habe ich keine Ahnung, wie das geht.


Erstellen Sie die Datei am selben Speicherort mit demselben Dateinamen. Klicken Sie in der IDE mit der rechten Maustaste und klicken Sie auf "Verlauf anzeigen". Kopieren Sie den Inhalt einfügen. Exzellenter Rat @Rajesh. Vielen Dank.
Tief

1
Ich bin gerettet. Danke dir.
Scott

Sie müssen den Dateiinhalt nicht kopieren, klicken Sie einfach mit der rechten Maustaste auf die Datei und klicken Sie auf "Zurücksetzen", um sie wieder auf diese Version zurückzusetzen (auch wenn Sie sie gelöscht haben)
n00b

7

Ich hatte heute dieses Problem.

Wie andere gesagt haben, speichert Git die Dateien nicht.

Die einzige Möglichkeit, dies rückgängig zu machen, ist ein Dienstprogramm zum Wiederherstellen. Ich habe "extundelete" verwendet und alles wiederhergestellt, aber Ihr Kilometerstand / Dateisystem kann variieren.


7

Wenn Sie an Eclipse arbeiten, besteht eine der möglichen Lösungen darin, den lokalen Verlauf von Eclipse wiederherzustellen.


2
Ich benutze PyCharm und die lokale Geschichte hat mich gerettet
psychok7

1
Gleiches gilt für IntelliJ IDEA!
Arthurakay

RubyMine hat auch lokale Geschichte. rettete mich!
Usman

Alle IntelliJ-Browser haben einen lokalen Verlauf. Gott sei Dank. Ich habe WebStorm verwendet und hatte fast ein Aneurysma, bevor ich das fand. 12 Tage Arbeitstag waren vergangen, und ich überlegte ernsthaft, eine Flasche Schnaps an meinem Schreibtisch abzustellen.
Josh Burgess

7

Eigentlich ja ! Das ist möglich! Aber ohne Git-Befehle zu verwenden.
Wir brauchen nur ein Tool zur Wiederherstellung von Dateien wie Recuva .
Erwähnen Sie einfach den Pfad, von dem es gelöscht wurde, und lassen Sie die Dateien wiederherstellen.

Hier sind auch einige nützliche Hinweise zur Verwendung dieser App:

  1. Ich würde Ihnen dringend empfehlen, dieses Kontrollkästchen zu aktivieren, bevor Sie Dateien wiederherstellen (wenn gelöschte Dateien im Wiederherstellungsfenster angezeigt werden):
    Advanced Mode-> Options-> Actions->Restore folder structure
    Damit werden alle Ihre Dateien wiederhergestellt, indem Sie die Ordnerstruktur beibehalten, damit es viel einfacher wird Ziehen Sie diesen Ordner einfach per Drag & Drop in den Pfad, aus dem er gelöscht wurde.
  2. Die Installation des Wiederherstellungstools auf einem USB-Gerät ist sehr vorzuziehen (aufgrund der folgenden Warnung).
  3. Vermeiden Sie beim Erwähnen, wo die Dateien wiederhergestellt werden sollen, dasselbe Laufwerk, von dem die Dateien gelöscht wurden (erneut aufgrund der unten genannten Warnung), da die aktuell wiederhergestellte Datei möglicherweise die andere gelöschte Datei überschreibt, die noch nicht wiederhergestellt wurde. Das Wiederherstellen von Dateien auf einem USB-Laufwerk ist dort immer eine gute Lösung.

Warnung! Versuchen Sie, das Laufwerk, von dem aus es gelöscht wurde, nicht zu berühren (Dateien hinzuzufügen / zu bearbeiten), sobald Sie eine Datei verlieren (versehentlich löschen), um die Wahrscheinlichkeit einer erfolgreichen Wiederherstellung zu erhöhen. Andernfalls können Sie diese Datei vollständig verlieren.

Warum es funktioniert: Wenn Sie eine Datei löschen, wird sie tatsächlich nicht gelöscht. Es wird nur als "gelöscht" markiert. Wenn Sie also das nächste Mal Dateien zum selben Laufwerk hinzufügen / aktualisieren, werden diese alten Dateien mit den neuen überschrieben. Aber bis sie überschrieben werden, ist es immer noch möglich, die Dateien zu lesen (und natürlich wiederherzustellen).


1
Danke, dass du mir das Leben gerettet hast. Ich weiß nicht, ob es die richtige Antwort ist, weil ich nicht alles wiederherstellen konnte, aber ich hatte Glück, als ich die kritischsten Dateien bekam, die ich brauchte.
XzaR


1

Ich habe mit einem Code gearbeitet, den ich meinem Repository hinzufügen sollte, und ich habe mit -dfx gereinigt, um die Dateien wiederherzustellen.

Ich habe versucht, Debugfs zu verwenden, nach Inodes, Testdisk und vielen anderen Tools zu suchen und diese zu verknüpfen, und keiner hat das Verzeichnis gefunden, das diese dumme Schrift versehentlich gelöscht hat.

Laden Sie extundelete von sourceforge herunter .
Sie müssen wahrscheinlich das e2fslibs-dev-Paket
Run installieren

$ ./configure 
$ make 

Es wird die Binärdatei für extundelete im src-Ordner generiert. In meinem Fall habe ich einen Ordner fälschlicherweise gelöscht. Nennen wir es FOOBAR

Ich bin gerade gelaufen:

$  sudo ./extundelete --restore-directory <full path to FOOBAR > <the partition> 


und es wurde ein Ordner mit dem Namen RESTORED_FOLDERS erstellt


1

Wenn Sie einen Mac verwenden und mit einem gesichert haben Time Machine, können Sie ihn wiederherstellen


0

Glücklicherweise habe ich diesen Fehler bei der Verwendung von Windows 7 gemacht. Ich bin zum Papierkorb gegangen, habe alle gelöschten Dateien hervorgehoben und auf "Wiederherstellen" geklickt. Getan.


5
Was meinst du? git cleanverschiebt keine Dateien in den Papierkorb.
MEMark

0

Wenn Sie Ihre Änderungen nicht gepusht haben (Git Push), können Sie auch die Informationen von Ihrem Server zurückbringen, die noch nicht aktualisiert wurden. Ich habe filezilla verwendet, um die gelöschten Dateien zurückzubringen und in meine lokalen Dateien zu kopieren. Es ist nicht der beste Weg, aber es funktioniert und vermeidet die Verwendung der Konsole

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.