9

通常、次のことができます。

$ echo "Stanley, you must beware of the Drive bee" > file-a
$ echo "What's a Drive bee?" > file-b
$ git init .
$ git add file-b
$ git commit file-b -m "We don't know, but whatever error you make with it could be fatal."
$ git reset --hard HEAD
$ ls
file-a file-b

私は本当に悪いことをしたと思います:

$ echo "What are you doing, you darn ?" > file-a
$ echo "Can't you see I'm trying to drive?" > file-
$ git init .
$ git add -A
$ git commit file- -m "Oh, my God! [It's] the Drive !"
$ git reset --hard HEAD
$ ls
file-

結果: ステージングされたがコミットされていないすべてのファイルが削除されました 0_o

git reset --hard HEAD\^
fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.

削除したばかりのファイルを復元するためにできることはありますか? つまり、git add -Aコマンドが発行される前 (または発行されたとき) の状態に git リポジトリを復元することは可能ですか?

4

3 に答える 3

20

はい、あなたは実際に本当に幸運です。Gitのインデックスに追加したものは、何らかの形でそこにあります。実際、Gitは、ファイルがインデックスに追加されたときに、ファイルごとにblobオブジェクトを既に作成しています。インデックス自体は、ツリーオブジェクトのみを格納します。

そうです、ステージングされたファイル用に作成されたBLOBオブジェクトがありました。失われるのはツリー情報、つまりパスとファイル名だけですが、コンテンツを復元することはできます。

実行git fsckしてみると、ぶら下がっているブロブのリストが表示されます。

Checking object directories: 100% (256/256), done.
dangling blob ac28af8d84fc71eb247ccf665c6d0f4bf1822520
dangling blob 2d152ff9f09cb08ebc495f453da63eddaa9e249f
dangling blob cd9567427762cd8066b4e802e5c170a31a026100

その後、を実行してコンテンツを復元できますgit cat-file -p ac28af8d。たとえば、それをファイルにパイプできます。

git cat-file -p ac28af8d > recovered-file

それらすべてのためにそれをしなさい、そうすればあなたはそれらを取り戻す。

于 2012-07-23T22:35:37.203 に答える
0

関連する Stack Overflow の質問に対するこの回答からの次の解決策が本当に気に入っています。

  1. git log --diff-filter=D --summaryファイルを削除したすべてのコミットと削除されたファイルを取得するために使用します
  2. git checkout $commit~1 filename削除したファイルを復元するために使用します。

簡潔で直感的です。

于 2016-03-06T17:04:08.007 に答える