はじめに
あれ??以前存在したファイルが消えてしまってる???
前に使ってたファイル消してしまったけど、復元して〜!
なんて事ありませんか?
そんな時の対処法です!!
ファイルが消されたcommitを見つけよう
削除されたファイルを含むコミットを検索
git log --diff-filter=D --summary
-
誰が変更したのかなどを気にする必要がないのであれば、
git log
の後ろに--oneline
を追加すると見やすくなります -
また、ファイル名が明確にわかっているのであれば、
一番最後に-- "ファイル名"
で検索することも可能です(ワイルドカード可)
例: 間違えて消したexample.txt
を復元する
git log --oneline --diff-filter=D --summary -- "*example.txt"
810d535 (HEAD -> main, origin/main) delete example.txt
delete mode 100644 Qiita/example.txt
今回はexample.txtという情報だけを記憶していてどこにあるものだったか忘れていたため*example.txt
としました。
するとQiita/example.txt
を消した履歴が出てきました
ここでいう810d535
が下で言う<コミットハッシュ>
にあたります
ファイルを復元しよう
git checkout
を使用してファイルを復元します。<コミットハッシュ>
には先ほど検索したものを使用してください
git checkout <コミットハッシュ>^ -- <ファイル名>
^
を使用してファイルが削除されたコミットの一つ前のコミットから復元している
例: Qiita/example.txtを復元
git checkout 810d535^ -- Qiita/example.txt
補足
ファイル限定ではなくディレクトリの復元も可能です
例: Qiitaディレクトリを消してしまった。
ディレクトリの中身が下記のようなQiitaディレクトリを消してしまっていたとしましょう
cd Qiita/
ls
example.txt example2.txt example3.txt
ファイルと同様に、ディレクトリを消したコミットを見つけます
git log --oneline --diff-filter=D --summary -- "*Qiita/**"
e382d54 (HEAD -> main, origin/main) Qiita/の削除
delete mode 100644 Qiita/example.txt
delete mode 100644 Qiita/example2.txt
delete mode 100644 Qiita/example3.txt
ファイルを復元
git checkout e382d54^ -- Qiita/
-
実際にgitで追跡されているのはファイルであり、ディレクトリではありません。そのため、空のディレクトリは復元できません
-
ディレクトリが完全に削除されたのではなく、ファイルの一部だけが削除された場合、削除されたファイルのみが復元されます