「git rm -r。」を元に戻す方法は?


378

偶然言ったgit rm -r .。これからどのように回復しますか?

私はコミットしませんでした。

すべてのファイルに削除のマークが付けられ、ローカルチェックアウトから物理的に削除されたと思います。

編集:(コマンドを知っていれば)最後のコミットに戻すことができます。しかし、元に戻すことができれば、はるかに良いでしょうgit rm -r .。なぜなら、最後のコミットの後との前に何をしたのか本当にわからないからですgit rm -r .


3
この特定の質問の場合、reset --hardは良い解決策です...すでにリストされているので、このコメントでgit-reflogのドキュメントを確認することをお勧めします。
ウィリアムパーセル、2010年

8
あなたが供給していないので注意こと-fgit rmなるようGitはどの上演していたファイルやunstaged変更を削除していないだろうgit reset; git checkout .、すべてを回復する必要があります。
CBベイリー

-gitのチェックアウトに注意してください。ステージングされていない変更はすべて消去されます。
PeterB 2011年

1
私はこのようなことをしただけで、ローカルファイルが削除された理由がわかりません(OPのように、まだコミットしていません。)
Xonatron

Gitの2.23+(2019年8月)では、あなたがファイルを復元するでしょうgit restoregit restore -s@ -SW -- .以下の私の答えを参照しください。
VonC

回答:


468
git reset HEAD

それを行う必要があります。気になるコミットされていない変更がない場合は、

git reset --hard HEAD

すべてを最後のコミットに強制的にリセットする必要があります。コミットされていない変更があっても最初のコマンドが機能しない場合は、コミットされていない変更を次のコマンドで保存しますgit stash

git stash
git reset --hard HEAD
git stash pop

22
git reset --hard HEADは、現在の作業ディレクトリの親ディレクトリで行った有用な変更を破棄することに注意してください。
Alex Brown

10
@マイルド:私はまだ冷たい汗をかいています!
ホイポロイ

6
私は反対票を投じなかったが、スタッシュを試み、ハードをリセットし、ポップして、最近の変更をすべて失った。多分私は答えを読み間違えました。
Greg M. Krsak

1
これはめったに機能しません。Dropboxフォルダーで作業できてとてもうれしいです。形は悪いですが、毎回私を救います...
Nuby

3
私がgit stash popを行ったとき、もちろんファイルを再び削除しました。もちろん、私が(誤って)一部のファイルを削除したという事実を隠しているからです。保持したいコミットされていない変更がある場合、この回答は機能しません。
sudo

252

私はいくつかのファイルをgit-rmして、次のコミットの前に変更を加えました。スタッシュしてリセットするのではなく、必要に応じて、見逃したり削除したりした個々のファイルをチェックアウトできます。

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

これにより、他のコミットされていない変更は回避策なしでそのまま残ります。


6
他のコミットされていない変更があったので、これは役に立ちました。
ダン、

4
この回答は、git rm再帰全体ではなく1つに戻すことを目的としてこの質問に出くわした私たちに役立ちますgit rm -r。完全な再帰的削除の場合、削除されるファイルの量によっては、他の解決策の方が適している場合があります。
tresf 2016年

あなた、私の男、賞に値する。
サラミット

できれば、100回クリックします!!!
Wagner Braga

57

いくつかの単一のファイルまたはフォルダを取り戻すには、次を使用できます

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

これにより、最初にのインデックスエントリがpath/to/file再作成され、最後のコミット時と同じようにファイルが再作成されますHEAD

ヒント:両方のコマンドにコミットハッシュを渡して、古いコミットからファイルを再作成できます。詳細についてはgit reset --help、およびgit checkout --helpを参照してください。


ベストアンサー。git rm他のコミットされていない変更を消去することなく、単一の操作を簡単に外科的に「元に戻す」ことができます。
wberry

私を助けた!ベストアンサー。
Akram

28

更新:

以来git rm .取り組んでチェックアウト中だけでなく、指数で、この中に削除すべてのファイルと子ディレクトリ、あなたはこれらの変化のそれぞれを元に戻す必要があります。

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

これはあなたが望むことをするはずです。チェックアウトされたコードまたはインデックスの親フォルダーには影響しません。


なかった古い答え:

reset HEAD

トリックを実行し、ファイルに加えたコミットされていない変更消去しません

その後、git addキューに入れていたコマンドを繰り返す必要があります。


1
申し訳ありませんが、私はいつもチェックアウトを行うgit alias.co="checkout"ように設定してgit coいます。
アレックスブラウン

25

上記のいずれも機能しない場合は、http//www.spinics.net/lists/git/msg62499.htmlの提案を使用してデータを取得できる可能性があります。

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

4年後、まだ命の恩人!
ThievingSix 2016

結果を連結するためにc ++プログラムを作成しました(私のリポジトリには約100個のオブジェクトがぶら下がっていたため、これが必要になりました)。コンパイルして実行し、git repoローカルディレクトリに渡します。raw.githubusercontent.com/bluuman/git-recover-files/master/...
ジェームズのMeas

15

git rmを元に戻す

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

元に戻すgit rm -r

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

元に戻すgit rm -rf

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

Uncommitted changes 含む not staged changesstaged changes but not committed


もちろん、元に戻すことはできません。git rm -rf追跡されていないファイルまたはステージングされた(のみ)ファイルも削除される可能性があるためです。
jpaugh

git rm -rf fileそしてgit rm -rf dir任意の人跡未踏のファイルを削除しません。
ソングxu

10

変更をコミットしてプッシュした場合は、これを行ってファイルを元に戻すことができます

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

これは、「変更がコミットされました:」で機能しましたが、ファイルは古いgit cherry-pickから削除されましたが、まだ必要でした。
mushcraft

7

すでにいくつかの良い答えがありますが、私は、うまく機能するだけでなく、あなたが望むもので非常に明示的である少し怖い使用された構文を提案するかもしれません(そのため、恐ろしくも神秘的でもありません)

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

3

リストコミットを取得する

git log  --oneline

たとえば、安定したコミットにはハッシュがあります: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

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


0

Git 2.23以降(2019年8月)では、ファイル(およびインデックス)を復元するための適切なコマンドを使用する必要があります... git restorereset --hardまたは混乱を招くgit checkoutコマンド

あれは:

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

またはその省略形:

git restore -s@ -SW -- .

-1

私はまったく同じ問題を抱えていました。フォルダの整理、ファイルの再配置と移動でした。入力しました:git rm Enterキーを押します。そして、腸が少し緩むのを感じました。幸い、私はgit commit -m ""をすぐに入力しませんでした。

ただし、次のコマンド

git checkout .

すべてを復元し、私の命を救った。

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