2012-02-28 17 views
54

私は何か非常に愚かなものを作った。 git commit(ファイルの編集+新しいファイル)(C)を使ってコミットしました。 最後にコミットを修正しました。 その後、私はすべてのファイルを再帰的に削除しました(!)git rm -r そして、別のgit commit(C)を行いました。GITで元に戻す削除

 
A-B-C 
    ↑ 
    master 

ファイルを元に戻す方法はありますか?最初のコミットで行った変更はそのままですか? (C) 私はむしろ(B)に戻りません。 私はgit reset --soft head ^を試しました。だから、git statusは削除したファイルをリストしていますが、git checkoutを実行しましたが、まだ運がありません。私はそれが可能かどうかも知らない。

+0

あなたはコミットAのファイルを元に戻したいですか? – uday

+1

いいえ、私はまだC上にいますが、ファイルを削除しないで、私のファイルの編集とファイルだけを追加します。私は自分の作業ツリーにファイルを持っていないので、削除されています。 – Nately

答えて

158

は自分を支持を行うと、他の答えが示唆ようgit checkout <hash>を行い、多くの問題になりません。あなたの作業ディレクトリからファイルを削除し、まだ変更をコミットしていない場合は

は、実行します。

git checkout -f 

注意:このコマンドを実行する前にコミットされていないファイルをコミットし、そうでなければ、それらをすべてを失うことになるだろう

削除されたファイルは、再びバックする必要があります。

あなたが望む(Cなど - あなたの質問が明確ではない)場合は、git reflogからgit reset --hard <hash from reflog>とすれば、すべて設定する必要があります。

+3

1あなたはの問題を説明するために、(http://stackoverflow.com/questions/3965676/why-did-git-detach-my-head/3965714#3965714のように)外しヘッドの質問へのリンクを追加することができますgit checkout SHA1の答えです。 ORIG_HEAdはこの場合に役立つでしょうか? (http://stackoverflow.com/questions/964876/head-and-orig-head-in-git/964927#964927) – VonC

+1

だから、この答えは実際には良いです。リセット - へ私は私の枝に私を残し、私は '離脱した頭'の状態に残っていない。私の紛失したデータを検索する場合は、Sashaの回答も良かったです。 – Nately

+2

私のお尻を今すぐ保存していただきありがとうございます。 – Seth

5

私が正しくあなたを理解している場合、あなたは、元のコミットだからC.コミット書き直​​した、のは、C1は、あなたのコミットグラフからはアクセスできませんが、それは(gitのはしばらくの間、すべてのコミットを保持します)まだそこにある、それを呼び出してみましょう。コミットハッシュを取得するにはgit reflogを使用し、古い状態C1にするにはgit checkout <hash>または別の適切なコマンドを使用します。

+0

私の神!大変ありがとう!コミットはそこにあった。あなたは3週間の仕事を保存しました(最後のコミット以降)。ありがとうございました! – Nately

+0

もう1つ質問があります。今、私は「分離されたHEAD」状態にいると言います。私の「マスター」支店に戻るにはどうすればいいですか? – Nately

+0

ようこそ。しかし、私は下票を理解していません。 git reset -hard は潜在的にははるかに危険です。ポスターが元のコミットCを修正していたかどうかは明らかではありませんでした。 – Sascha