私は誤ってgit rm -r .
と言いました。どうすればこれから回復できますか?
私はコミットしませんでした。
私はすべてのファイルが削除の対象としてマークされていて、ローカルのチェックアウトからも物理的に削除されたと思います。
EDIT:最後のコミットに戻ることができます(コマンドを知っていれば)。しかし、git rm -r .
を元に戻すことができれば、はるかに良いでしょう。最後のコミットからgit rm -r .
までの間に何をしたのかがよくわからないからです。
git reset HEAD
やるべきだ。あなたが気にかけているコミットされていない変更がなければ、
git reset --hard HEAD
あなたの最後のコミットにすべてを強制的にリセットするべきです。コミットされていない変更があっても最初のコマンドが機能しない場合は、コミットされていない変更をgit stash
で保存します。
git stash
git reset --hard HEAD
git stash pop
いくつかのファイルをgit-rmして、次のコミットの前に変更を加えました。それらのファイルのいくつかが必要であることに気付いたときです。隠してリセットするのではなく、必要に応じて、見逃した/削除した個々のファイルをチェックアウトすることができます。
git checkout HEAD path/to/file path/to/another_file
これはあなたの他のコミットされていない変更を回避策なしでそのまま残します。
いくつかの単一のファイルやフォルダを取り戻すには、次のようにします。
git reset -- path/to/file
git checkout -- path/to/file
これにより、最初にpath/to/file
のインデックスエントリが再作成され、最後のコミットと同じようにファイルが再作成されます(つまり、.HEAD
)。
ヒント:両方のコマンドにコミットハッシュを渡して古いコミットからファイルを作り直すことができます。詳細はgit reset --help
とgit checkout --help
を参照してください。
更新:
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
コマンドをすべて繰り返す必要があります。
あなたが上記の作業のどれも終わらないならば、あなたはここからの提案を使用してデータを検索することができるかもしれません: http://www.spinics.net/lists/git/msg62499.html
git Prune -n
git cat-file -p <blob #>
変更をコミットしてプッシュした場合は、ファイルを元に戻すためにこれを実行できます。
// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file
元に戻す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 changes
、staged changes but not committed
が含まれます。
良い答えがいくつかありますが、うまく機能するだけでなく、欲しいものを明確に表現する、あまり使用されていない構文を提案することもできます(したがって、怖いことや謎のことではありません)。
git checkout <branch>@{"20 minutes ago"} <filename>
リストコミットを取得
git log --oneline
たとえば、安定コミットにはハッシュがあります:45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git Push -ff Origin master
私は同じ状況を経験しました。私の場合、解決策は次のとおりです。
git checkout -- .