Gitを使っていると、こんな場面に遭遇することがあります。
- 「このファイルだけ、以前の状態に戻したい」
- 「リポジトリ全体は戻したくない」
- 「特定のコミット時点の内容をピンポイントで復元したい」
本記事では、Gitで特定のファイルだけを、あるコミット時点の状態に戻す方法を、実務でそのまま使える形で解説します。
よくある誤解:reset や checkout だけでは不十分?
Gitで「戻す」と聞くと、次のコマンドを思い浮かべる人も多いと思います。
git resetgit checkoutgit revert
しかし、これらは基本的に リポジトリ全体 や コミット単位 で履歴を操作するため、
「特定のファイルだけを、ある時点の内容に戻したい」
というケースには、少しオーバースペックまたは不向きです。
解決策:指定コミットの内容を「そのファイルだけ」取り出す
Gitには、あるコミット時点のファイル内容だけを、現在のワークツリーに復元する方法があります。
ここでは、最も安全で分かりやすい方法を紹介します。
方法①:git restore を使う(推奨)
※ Git 2.23 以降で利用可能
基本形
git restore --source <commit-hash> -- path/to/file
例
git restore \
--source 74930128s1d887ea7051bf6c4448613d34d2 \
-- assets/js/common.min.js
ポイント
--source
→ 戻したい コミットID--
→ オプションとファイルパスの区切り- 指定したファイルだけが置き換わる
- 他のファイルや履歴には影響しない
- この時点ではコミットされない
方法②:旧来の git checkout を使う方法
Gitが古い環境では、以下でも同じことができます。
git checkout <commit-hash> -- path/to/file
例:
git checkout 74930128s1d887ea7051bf6c4448613d34d2 -- \
assets/js/common.min.js
※ 現在は git restore のほうが意図が明確なため推奨されます。
差分を確認してからコミットする
ファイルを戻したあとは、必ず内容を確認しましょう。
git diff assets/js/common.min.js
問題なければ、通常通りコミットします。
git add assets/js/common.min.js
git commit -m "common.min.js を 74930128 の状態に戻す"
このようにすることで、
- 「いつ」
- 「どのファイルを」
- 「どの時点に戻したか」
が 履歴として明確に残る のが大きなメリットです。
どのコミットに戻すか分からない場合
ファイル単位で履歴を確認すると便利です。
git log -- path/to/file
これで、そのファイルに関係するコミットだけが表示されます。
注意点
- ワークツリーに未コミットの変更がある場合、上書きされる可能性があります
→ 必要ならgit stashで退避 - あくまで「ファイルの内容を過去に戻す」だけ
→ 履歴を書き換える操作ではない - チーム開発では、必ず新しいコミットとして戻すのが安全
まとめ
- Gitでは 特定のファイルだけを過去の状態に戻せる
- 推奨コマンドは
git restore --source - リポジトリ全体を操作せず、安全に修正可能
- 差分確認 → 通常コミット、という流れがベスト
「全部戻したいわけじゃない」「このファイルだけ直したい」
そんなときに、ぜひ活用してみてください。


コメント