誤って上書きしてしまったファイルや、過去の特定時点の内容に戻したいファイルだけを復元したい場面はGit運用でよくあります。
本記事では、リポジトリ全体ではなく特定ファイルだけを過去の状態に戻す方法を、git checkout
とgit restore
の両方で解説します。
バージョン管理を活用すれば、無駄な作業を繰り返すことなく安全に元の状態へ戻せます。
過去バージョンのコミットハッシュを調べる
まずは戻したいファイルの過去の状態が含まれるコミットを特定します。
git log
に--
オプションを付けると、特定ファイルに関する履歴だけを確認できます。
# 特定ファイルの履歴を表示
git log --oneline -- path/to/file.txt
出力例:
e3f1a2b Fix typo in file.txt
7b9c8d4 Update file.txt content
1a2b3c4 Initial commit of file.txt
この場合、戻したい状態のコミットハッシュをメモします(例では7b9c8d4
)。
方法1:git checkoutで特定ファイルを復元
旧来の方法ではgit checkout <commit> -- <file>
を使います。
これにより、指定コミット時点の内容が作業ツリーに展開されます。
# コミット7b9c8d4時点のfile.txtを復元
git checkout 7b9c8d4 -- path/to/file.txt
この時点ではまだコミットされていないので、変更内容を確認してからgit add
し、必要ならコミットします。
git add path/to/file.txt
git commit -m "Revert file.txt to state from commit 7b9c8d4"
方法2:git restoreで特定ファイルを復元
Git 2.23以降では、git restore
が推奨されています。構文はcheckout
より分かりやすく、ファイル復元に特化しています。
# コミット7b9c8d4時点のfile.txtを復元
git restore --source 7b9c8d4 path/to/file.txt
こちらも作業ツリーだけが変更されるため、内容を確認してからステージングとコミットを行います。
git add path/to/file.txt
git commit -m "Restore file.txt from commit 7b9c8d4"
方法3:最新コミット時点の状態に戻す
もし直近の変更だけを取り消して、最後にコミットした状態に戻したい場合は、コミットハッシュを指定せずに実行できます。
# checkoutで最新コミット状態に戻す
git checkout -- path/to/file.txt
# restoreで最新コミット状態に戻す
git restore path/to/file.txt
この場合はステージングは不要で、作業ツリーが直接更新されます。
注意点と安全策
過去コミットの内容を反映すると、それ以降の変更は作業ツリーから失われます。
念のためgit stash
で現在の変更を退避してから実行すると安全です。
# 現在の変更を退避
git stash push -m "temp-backup"
# 復元後、必要ならstashを戻す
git stash pop
おわりに
Gitでは、ファイル単位で過去の内容を復元することで、必要な部分だけをピンポイントで修正できます。
旧来のcheckout
と新しいrestore
の両方を知っておくと、バージョンや環境に応じて柔軟に対応可能です。
復元前には必ずコミット履歴を確認し、必要に応じて作業内容を退避してから実行することが安全運用のポイントです。