削除したファイルを復元できますか( `git clean -fdx`を元に戻します)?


119

私はgithubページ作成するための指示に従っていましたが、私のgitサブディレクトリに移動するのを忘れていました。その結果、ドキュメントのディレクトリ全体をでnukedしましたgit clean -fdx
このひどい間違いを元に戻す方法はありますか?


2
確かではありませんが、gitではそれが可能だとは思いません。ただし、ファイルシステムの削除取り消しユーティリティでうまくいく場合があります。
static_rtti

9
興味深いことに、Git Community Bookgit clean -fdxは警告なしに操作が非常に危険であることを示唆しています。この一見無害な提案のせいで、何人の人がファイルを取り返しのつかないほど破壊したのでしょうか。
catpnosis

5
IDEにEclipseまたはIntelliJ IDEのように「ローカル履歴」があるかどうかを確認してください。それはあなたが不注意なgit clean呼び出しよりあなたに多くの心痛を救うことができます。また、チェックせずに掃除の癖をつけないようにしましょう。信じられないほど破壊的な駆除git clean -fdxnを実際に実行する前に、確認プロンプトで実行される、呼び出せるPowershellまたはBashスクリプトを作成します。
Josh Burgess

回答:


129

いいえ。これらのファイルはなくなりました。

(Linuxでチェックしただけです:git clean呼び出しunlink()、事前に何もバックアップしません。)


32
RubyMine、Eclipseなどの高度なIDEを使用している場合、削除されたファイルのローカル履歴があり、それらを復元できる可能性があります。
Usman

1
私の場合、@ Usmanが隠しフォルダgit clean内の保留された変更を誤って削除し.idea、ローカル履歴が私を救いました!
emkman 2016年

2
@Usmanによる素晴らしいヒント。Eclipseでは、「ローカルヒストリから復元...」オプションを使用してファイルを取り戻すことができました。i.imgur.com
brandizzi

1
実際にはこれは可能ですが、ハックな方法で。:この回答を参照してくださいstackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/...
だけ影

4
PyCharmでは、それらを復元することもできます。それらがあったフォルダを右クリックし、ローカル履歴をクリックし、削除を見つけて元に戻すをクリックします。
Juanjo Conti 2017

48
git clean -fdxn

予行演習を行い、実行した場合に削除されるファイルを示します

git clean -fdx

(もちろん、これが事前にわかっている場合にのみ役に立ちますが、次回は役立ちます)


7
これに追加するには、-nほとんどのgitコマンド(および他の多くの* nixコマンド)で動作します。
Nick McCurdy 2013年


18

いいえ。「git clean -fdx」は、gitが作業ディレクトリから追跡しないすべてのファイルとディレクトリを削除します。Gitはこれらのファイルを追跡しないため、これらのファイルのバックアップはありません。少なくとも通常はそうではありません。

これらのファイルのいずれかで比較的最近 'git add'を実行した場合(ただし、コミットを中止した場合)、 'git fsck --lost-found'でそれを見つけることができる可能性があります。試してみる価値はありますが、期待をあまり上げないでください。

将来的には、めったに数回コミットすることを検討する必要があります。そうすれば、これらのコミットをリモートにプッシュしなくても、少なくともローカルバックアップが作成されます。


実際の問題は、ディレクトリもリポジトリであるはずがないことでした。ログを振り返ると、新しいリポジトリのディレクトリにcdするのを忘れてしまっmkdir
Eric

1
この質問を読んだ直後に、削除された各ファイルをバックアップする構成変数を追加するパッチをGitに書き込みました。おそらくそれは他の人に役立つでしょうか?github.com/kusma/git/tree/work/clean-backup
kusma

1
今日はラッキーでした!!! 「git fsck --lost-found」に感謝します。以下を使用してすべての変更を取得しました:git fsck | awk '{print $ 3}' | xargs git show | tee searchresults.log追加してから削除したファイル全体が必要だったので、ログから取得できました。:)
Marcello de Sales

11

上記の@kusmaのように、運が良ければ(「git add」を実行したことがある場合)、次のコマンドを使用してオブジェクト全体を抽出できます。

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

このようにして、すべてのタイプのチャンクを探し、差分全体を収集して、失われたファイルを抽出できるファイルに追加します。私の場合、Javaクラス全体を失っていました。


8

Jetbrains IDEを使用している場合は、ファイルのローカル履歴を表示するオプションがあります。完了git cleanした場合は、ファイルを再作成し、ファイルのローカル履歴を確認して、そこから復元できます。

単一のファイルのために私のために働いた。完全なディレクトリの場合、その方法はわかりません。


同じ場所に同じファイル名でファイルを作成します。IDEで右クリックして[履歴を表示]をクリックします。内容をコピーして貼り付けます。素晴らしいアドバイス@Rajesh。ありがとう。
深い

1
助かった。ありがとうございました。
スコット

ファイルの内容をコピーする必要はありません。ファイルを右クリックし、[元に戻す]をクリックして、ファイルをそのバージョンに復元します(削除した場合でも)
n00b

7

今日私はこの問題を抱えていました。

他の人が言ったように、gitはファイルを保持しません。

これを元に戻す唯一の方法は、削除取り消しユーティリティを使用することです。私は「extundelete」を使用してすべてを回復しましたが、マイレージ/ファイルシステムは異なる場合があります。


7

Eclipseで作業している場合、考えられる解決策の1つは、Eclipseのローカル履歴から復元することです。


2
私はPyCharmと地元の歴史を使用して私を救った
psychok7

1
IntelliJ IDEAでも同じです!
arthurakay 2015年

RubyMineには地域の歴史もあります。助かりました!
Usman

すべてのIntelliJブラウザーにはローカル履歴があります。ありがたいことに。私はWebStormを使用していましたが、それが見つかる前に動脈瘤にかかっていました。3時間分の12時間の労働日がなくなったので、机にある固い酒1本を真剣に飲むことを真剣に検討しました。
Josh Burgess

7

実はそうです!これは可能です!しかし、gitコマンドを使用しません。
必要なのは、Recuvaのようなファイル回復ツールだけです。
削除された場所からのパスに言及し、ファイルを回復させます。

また、そのアプリを使用するためのいくつかの便利なメモがあります:

  1. ファイルを復元する前にこのチェックボックスをオンにすることを強くお勧めします(削除されたファイルがリカバリウィンドウに表示された場合):
    Advanced Mode->Options -> Actions-> Restore folder structure
    これにより、フォルダ構造を維持することですべてのファイルが復元されるため、はるかに簡単になりますそのフォルダを、削除された場所からパスにドラッグアンドドロップするだけです。
  2. USBデバイスに回復ツールをインストールすることをお勧めします(以下の警告のため)
  3. 現在復元されているファイルがまだ復元されていない他の削除されたファイルを上書きする可能性があるため、ファイルを復元する場所について言及しながら、削除されたファイルの場所から同じドライブを選択しないでください(再度、下記の警告のため)。USBドライブにファイルを復元することは常に良いソリューションです。

警告!ファイルを失った(誤って削除した)場合は、それが削除された元のドライブに触れない(ファイルを追加/編集しない)ようにして、正常な回復の可能性を高めます。そうしないと、そのファイルが完全に失われる可能性があります。

機能する理由: ファイルを削除しても、実際には削除されません。「削除済み」とマークされているだけなので、次回同じドライブにファイルを追加/更新すると、それらの古いファイルは新しいファイルで上書きされます。しかし、それらが上書きされるまでは、ファイルを読み取ること(および当然のことながら回復)は可能です。


1
私の命を救ってくれてありがとう。すべてを回復できなかったので正解かどうかはわかりませんが、必要な最も重要なファイルを入手できて幸運でした。
XzaR 2017年

1

MSBuildでgitを使用している場合、すべてのファイルをコピーしてからコピーするターゲットを作成しましたgit clean -xdf。この方法では、削除したくないものを削除したことがわかった場合に、ファイルを簡単に復元できます。こちらをご覧ください:http : //blog.3d-logic.com/2012/11/04/safe-git-clean-with-msbuild/


1

私は自分のリポジトリに追加するはずのコードを使用し、-dfxを使用してファイルを復元できました。

私はdebugfs、iノード、testdisk、および表示される他の多くのツールからのルックアンドリンクを使用しようとしましたが、この愚かな1つの書き込みが誤って消去したディレクトリは誰も見つかりませんでした。

sourceforgeからextundeleteをダウンロードします。
おそらくe2fslibs-devパッケージ をインストールする必要があり
ます。

$ ./configure 
$ make 

srcフォルダー内にextundeleteのバイナリーが生成されます。私の場合、フォルダーを誤って消去してしまいました。それをFOOBARとしましょう

私はただ走った:

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


そしてRESTORED_FOLDERSという名前のフォルダを作成しました


1

Macを使用していて、Time Machineでバックアップした場合は、復元できます


0

幸いにも、私はWindows 7を使用しているときにこの間違いを犯しました。ゴミ箱に行き、削除されたすべてのファイルをハイライト表示して、「復元」をクリックしました。できました。


5
どういう意味ですか?git cleanファイルをごみ箱に移動しません。
MEMark 2018

0

変更をプッシュしていない場合(git push)、サーバーからまだ更新されていない情報を戻すこともできます。filezillaを使用して、削除したファイルを元に戻し、ローカルファイルにコピーしました。最善の方法ではありませんが、機能し、コンソールの使用を回避します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.