「あっ!間違ったファイルを消しちゃった…」
プログラミングしていると、こういう冷や汗をかく瞬間ってありますよね。でも安心してください。Gitを使っていれば、削除したファイルはほとんどの場合復元できます。
この記事では、状況に応じたファイルの戻し方を分かりやすく解説していきます。
Gitのファイル復元が可能な理由

Gitは「バージョン管理システム」として、あなたが行ったすべての変更を記録しています。つまり、ファイルを削除しても、その履歴はGitの中に残っているんです。
これは「コミット」という仕組みのおかげなんですね。コミットとは、ある時点のファイルの状態を保存する操作のことです。
履歴として残っているので、過去のある時点に戻ることで削除したファイルを取り戻せるというわけです。
【パターン1】まだgit addしていない場合の復元
ファイルを削除したけど、まだgit addしていない状態なら、とても簡単に戻せます。
git checkoutを使う方法
git checkout ファイル名
たとえばconfig.pyというファイルを削除してしまった場合は、こうします。
git checkout config.py
これだけで、最後にコミットした状態のファイルが復元されます。
git restoreを使う方法(Git 2.23以降)
新しいGitでは、より分かりやすいgit restoreコマンドが使えます。
git restore ファイル名
実例を見てみましょう。
git restore config.py
git checkoutと同じ結果が得られますが、こちらの方が「復元する」という意味が明確ですね。
すべてのファイルを一度に復元したい場合は、ファイル名を省略できます。
git restore .
【パターン2】git addした後の復元
ファイルを削除して、さらにgit addまで実行してしまった場合はどうでしょうか。
この状態を「ステージング済み」と言います。ステージングエリアとは、次のコミットに含める変更を一時的に置いておく場所のことです。
復元の手順
git restore --staged --worktree ファイル名
たとえばindex.htmlを復元するなら、こうなります。
git restore --staged --worktree index.html
ここで使っているオプションの意味を説明しますね。
--staged:ステージングエリアから復元する--worktree:作業ディレクトリ(実際にファイルがある場所)にも反映する
両方のオプションが必要なのは、ステージングと作業ディレクトリの両方から削除されているためです。
【パターン3】コミット後に削除したファイルの復元
コミットまで完了してしまった場合は、少し手順が増えます。でも、心配はいりません。
ステップ1:削除したファイルを含むコミットを探す
まず、どのコミットでファイルが削除されたのかを調べます。
git log --diff-filter=D --summary
このコマンドは、削除(Delete)されたファイルの履歴だけを表示します。
表示された結果の例がこちらです。
commit 5f4bfc3a2e8d9c1b7f6e5d4c3b2a1f0e9d8c7b6a
Author: Tanaka Taro <tanaka@example.com>
Date: Mon Dec 9 14:30:22 2024 +0900
削除: 不要なファイルを整理
delete mode 100644 routes.py
この5f4bfc3a...というのがコミットハッシュ(IDのようなもの)です。
ステップ2:ファイルを復元する
見つけたコミットハッシュを使って、ファイルを復元します。
git checkout コミットハッシュ^ -- ファイル名
先ほどの例でroutes.pyを復元するなら、こうなります。
git checkout 5f4bfc3a^ -- routes.py
ここで重要なポイントがあります。コミットハッシュの後ろに^記号を付けることです。
この^は「1つ前のコミット」という意味なんですね。5f4bfc3aでファイルが削除されたので、その1つ前のコミット(ファイルがまだ存在していた時点)から復元するわけです。
ステップ3:復元したファイルをコミットする
復元したファイルは、まだ新しい変更として扱われています。これをコミットして確定させましょう。
git add routes.py
git commit -m "routes.pyを復元"
リモートリポジトリ(GitHubなど)にも反映させたい場合は、最後にpushします。
git push
いつファイルが削除されたか分からない場合
「このファイル、いつ消えたんだっけ?」という場合は、git rev-listコマンドが便利です。
git rev-list -n 1 HEAD -- ファイル名
このコマンドは、指定したファイルを最後に変更したコミットのハッシュを返してくれます。
実際に使ってみましょう。
git rev-list -n 1 HEAD -- database.py
結果として表示されたコミットハッシュを使って、前述のgit checkoutで復元できます。
git checkout 結果のハッシュ^ -- database.py
複数のファイルを一度に復元する
複数のファイルを間違って削除してしまった場合も、同じ手順で復元できます。
ファイル名を続けて指定するだけです。
git checkout 5f4bfc3a^ -- file1.py file2.py file3.py
または、フォルダごと復元することも可能です。
git checkout 5f4bfc3a^ -- config/
これでconfigフォルダ内のすべてのファイルが復元されます。
削除したファイルの中身を確認してから復元する
「本当にこのファイルで合っているかな?」と不安な場合は、復元する前に内容を確認できます。
git show コミットハッシュ:ファイルパス
例えば、こんな感じですね。
git show 5f4bfc3a:src/utils.py
これでファイルの中身がターミナルに表示されるので、復元すべきファイルか確認してから作業を進められます。
よくある失敗とその対処法
エラー:「pathspec ‘ファイル名’ did not match any file(s)」
このエラーは、ファイルパスが間違っているか、ファイルがその時点で存在していなかったことを意味します。
対処法として、まず正しいファイルパスを確認しましょう。
git log --all --full-history -- ファイルパス
このコマンドで、そのファイルの完全な履歴が分かります。
コミットハッシュに^を付け忘れた
^を付けないと、ファイルが削除された時点のコミットを指定することになり、復元できません。
正しくは、ファイルが存在していた時点(削除される1つ前)を指定する必要があります。
# ❌ 間違い
git checkout 5f4bfc3a -- routes.py
# ✅ 正しい
git checkout 5f4bfc3a^ -- routes.py
まとめ:状況に応じた最適な復元方法
Gitでファイルを復元する方法を、状況別にまとめておきますね。
まだgit addしていない場合
git restore ファイル名またはgit checkout ファイル名
git addした後の場合
git restore --staged --worktree ファイル名
コミット後の場合
git log --diff-filter=D --summaryで削除コミットを探すgit checkout コミットハッシュ^ -- ファイル名で復元git addとgit commitで確定
Gitは履歴を保存してくれているので、慌てなくても大丈夫です。落ち着いて、その時の状況に合った方法を選んで対処しましょう。
バージョン管理システムの素晴らしいところは、こういった「やり直し」ができることなんですね。これからは、安心してコードを書き進められるはずです。


コメント