中止されたコミットからファイルを回復できる場合があります
@the-malkolm の観察に基づいています。
質問の情報から、コミットはなく、ファイルはいつでも追跡されませんでした。そのため、git は削除されたファイルについて実際には知りません。
とは言え、希望はあります。ファイルを削除する前にファイルをコミットしようとしたという理由だけで、すべてのファイルが含まれた幻のコミットが浮かんでいます。
次に例を示します。
$ git init
Initialised empty Git repository in /tmp/so/.git/
$ echo "find this text" > README.md
$ git add README.md
$ git commit -v
Aborting commit due to empty commit message.
$ git rm -rf .
rm 'README.md'
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
上記は質問のイベントをシミュレートします。通常、これはコードの書き直しを開始するときです。コミットはありません。ファイルはなくなりました。
中止されたコミットを特定する
.git
ただし、リポジトリを検査すると、いくつかの情報が得られます。
$ tree .git/objects/
.git/objects/
├── 91
│ └── 9cdf847a6af7c655c8de1d101385f47f33e0f9
├── d6
│ └── 7d51abe2521dcd00cec138b72f5605125c1e41
├── info
└── pack
コミットがないにもかかわらず、git リポジトリにオブジェクトがあります。2 つのオブジェクトのどちらがツリーであるかを識別する必要があります。
$ git ls-tree 919cdf
fatal: not a tree object
$ git ls-tree d67d51
100644 blob 919cdf847a6af7c655c8de1d101385f47f33e0f9 README.md
$
最初の参照はREADME.md ファイルを表す blob です。リポジトリ内のファイルごとに 1 つの blob があり、この例の 2 番目はツリー参照です。
作業コピーの再作成
ツリー ハッシュが識別されると、それを使用してread-treeでインデックスを再構築できます。
$ git read-tree d67d51abe2521dcd00cec138b72f5605125c1e41
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: README.md
#
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: README.md
$
この時点で、作業コピーは空ですが、失われたファイルはコミットのためにステージングされます。
それらをコミットします。
$ git commit -m "phew"
そして、リポジトリのコミットされた状態に一致するようにチェックアウトします。
$ git checkout .
$ ls
README.md
そして、すべてのファイルが存在し、コミットされています。