git add .
少し手間がかかるかもしれませんが、インデックスに追加したすべてのファイルを元に戻すことができるはずです (たとえば、あなたの状況のように)。ファイルをインデックスに追加するために、git はそのファイルをオブジェクト データベースに追加します。つまり、ガベージ コレクションがまだ行われていない限り、そのファイルを復元できます。Jakub Narębski's answer hereに、これを行う方法の例があります。
ただし、テスト リポジトリでそれを試してみたところ、いくつかの問題があり--cached
まし--cache
た.git/lost-found
。ただし、次の手順でうまくいきました。
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
これにより、参照、インデックス、またはreflogを介して到達できないオブジェクトデータベース内のすべてのオブジェクトが出力されます。出力は次のようになります。
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
...そして、これらのブロブごとに、次のことができます。
git show 907b308
ファイルの内容を出力します。
出力が多すぎますか?
以下のseheのコメントに応じて更新します。
そのコマンドの出力に多くのコミットとツリーがリストされていることがわかった場合は、参照されていないコミットから参照されているオブジェクトを出力から削除することをお勧めします。(通常、とにかくreflog経由でこれらのコミットに戻ることができます.インデックスに追加されたオブジェクトに興味があるだけですが、コミット経由では決して見つけることができません.)
まず、コマンドの出力を次のように保存します。
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
これらの到達不能なコミットのオブジェクト名は、次の方法で見つけることができます。
egrep commit all | cut -d ' ' -f 3
したがって、インデックスに追加されたが、どの時点でもコミットされていないツリーとオブジェクトだけを見つけることができます。
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
$(egrep commit all | cut -d ' ' -f 3)
これにより、考慮しなければならないオブジェクトの数が大幅に削減されます。
更新:以下の Philip Oakleyは、考慮すべきオブジェクトの数を削減する別の方法を提案しています.git/objects
。これらは次の方法で見つけることができます。
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
(私はそのfind
呼び出しをここで見つけました。) そのリストの最後は次のようになります:
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
その場合、これらのオブジェクトを次のように表示できます。
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a
/
(オブジェクト名を取得するには、パスの末尾にあるを削除する必要があることに注意してください。)