Gitリポジトリで削除されたファイルの検索と復元

私がGitリポジトリにいるとします。あるファイルを削除し、その変更をコミットしました。作業を続け、さらにいくつかのコミットを行いました。そして、そのファイルを復元する必要があることに気づきました。

git checkout HEAD^ foo.bar`でファイルをチェックアウトできることはわかっていますが、そのファイルがいつ削除されたのかはよくわかりません。

1.与えられたファイル名を削除したコミットを見つけるには、どのような方法が一番早いでしょうか? 2.2. そのファイルを私の作業コピーに戻す最も簡単な方法は何でしょうか?

手動でログを参照して、SHAのプロジェクト全体をチェックアウトして、そのファイルを元のプロジェクトのチェックアウトに手動でコピーする必要がないことを望んでいます。

ソリューション

指定されたパスに影響を与えた最後のコミットを検索します。このファイルは、HEADのコミットには含まれていないので、このコミットで削除されたものと思われます。


git rev-list -n 1 HEAD -- 
解説 (20)

1.git log --diff-filter=D --summaryで、ファイルを削除したすべてのコミットと、削除されたファイルを取得します。 2.2.git checkout $commit~1 path/to/file.ext` を使って、削除されたファイルを復元します。

ここで、$commitはステップ1で見つけたコミットの値で、例えばe4cf499627のようになります。

解説 (11)

もしあなたが正気でないなら、git-bisectを使ってください。以下はその方法です。

git bisect start
git bisect bad
git bisect good 

さて、いよいよ自動テストを実行してみましょう。シェルコマンド '[ -e foo.bar ]' は、foo.bar が存在すれば 0 を、そうでなければ 1 を返します。git-bisect` の "run" コマンドは、バイナリ検索を使用して、テストが失敗する最初のコミットを自動的に見つけます。指定された範囲(良いものから悪いものまで)の半分から始めて、指定されたテストの結果に基づいて半分にします。

git bisect run '[ -e foo.bar ]'

これで、このテストを削除したコミットに到達しました。ここから未来にジャンプして、git-revertで変更を元に戻すことができます。

git bisect reset
git revert 

あるいは、1つ前のコミットに戻って手動でダメージを確認することもできます。

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
解説 (4)