web-dev-qa-db-ja.com

"git rm -r"を元に戻す方法は?

私は誤ってgit rm -r .と言いました。どうすればこれから回復できますか?

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

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

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

342
user89021
git reset HEAD

やるべきだ。あなたが気にかけているコミットされていない変更がなければ、

git reset --hard HEAD

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

git stash
git reset --hard HEAD
git stash pop
432
Brian Campbell

いくつかのファイルをgit-rmして、次のコミットの前に変更を加えました。それらのファイルのいくつかが必要であることに気付いたときです。隠してリセットするのではなく、必要に応じて、見逃した/削除した個々のファイルをチェックアウトすることができます。

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

これはあなたの他のコミットされていない変更を回避策なしでそのまま残します。

231
Jaime Bellmyer

いくつかの単一のファイルやフォルダを取り戻すには、次のようにします。

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

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

ヒント:両方のコマンドにコミットハッシュを渡して古いコミットからファイルを作り直すことができます。詳細はgit reset --helpgit checkout --helpを参照してください。

46
Arne L.

更新:

git rm .はワーキングチェックアウトとインデックス内のthisディレクトリとchildディレクトリにあるすべてのファイルを削除するので、これらの各変更を元に戻す必要があります。

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コマンドをすべて繰り返す必要があります。

27
Alex Brown

あなたが上記の作業のどれも終わらないならば、あなたはここからの提案を使用してデータを検索することができるかもしれません: http://www.spinics.net/lists/git/msg62499.html

git Prune -n
git cat-file -p <blob #>
24
Skippy VonDrake

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

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

元に戻すgm

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

元に戻すgm rm -r

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

元に戻すgm 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が含まれます。

7
song xu

良い答えがいくつかありますが、うまく機能するだけでなく、欲しいものを明確に表現する、あまり使用されていない構文を提案することもできます(したがって、怖いことや謎のことではありません)。

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

リストコミットを取得

git log  --oneline

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

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git Push -ff Origin master
3
Do Nhu Vy

私は同じ状況を経験しました。私の場合、解決策は次のとおりです。

git checkout -- .
1
Artur