Gitで特定のファイルだけ過去の状態に戻す方法
はじめに
Gitで作業していると、「特定のファイルだけを過去の状態に戻したい」という場面に遭遇することがあります。
例えば、あるファイルだけを誤って変更してしまった、または特定のコミット時点の内容に戻したい、といったケースです。
本記事では、Gitを使って特定のファイルだけを過去の状態に戻す方法を、いくつかのアプローチで解説します。
前提条件
本記事では以下の環境で動作確認をしています。
- Git 2.49.0(※ Git 2.23 以降を推奨)
- ターミナルでの操作が可能であること
また、今回は「ファイルの状態を過去のコミット時点に戻す」ことを目的とし、
コミット履歴を改変する操作(rebase
など) は扱いません。
なお、gitのバージョンを確認するには以下のコマンドを使います。
git --version
git checkout <commit> -- <ファイル名>
を使う
方法1:古いGitのバージョンでは、以下のような方法で特定のファイルを過去の状態に戻すことができます。
git checkout <コミットハッシュ> -- <ファイルパス>
例えば、abc1234 というコミット時点の README.md を戻したい場合:
git checkout abc1234 -- README.md
この操作を行うと、指定ファイルだけが過去の内容に変更され、現在の作業ブランチにその変更が反映されます。
この方法は現在では非推奨となっており、代わりにgit restore
の使用が推奨されています。
git restore --source
を使う(推奨)
方法2:Git 2.23 以降では、より直感的な git restore
コマンドが用意されています。
git restore --source <コミットハッシュ> <ファイルパス>
例えば、abc1234 というコミット時点の README.md を戻したい場合:
git restore --source abc1234 README.md
このコマンドも、指定されたコミットの状態にファイルを戻しますが、
restore
は「元に戻す」という意味が明確で、初心者にもわかりやすい設計になっています。
状況別の注意点
1.変更が未コミットで残っているとき
git restore
は、作業ツリーに変更があるファイルに対しては、
上書きを防ぐためにそのままでは実行されません。
この場合、以下のようなエラーメッセージが表示されることがあります。
error: the following files would be overwritten by restore: README.md
もし、変更内容を破棄しても良い場合、--worktree
オプションを使って上書きすることができます。
git restore --source abc1234 --worktree README.md
さらに、もしそのファイルがステージ(インデックス)に追加されている場合は、--staged
も組み合わせる必要があります。
git restore --source abc1234 --staged --worktree README.md
--worktree
や --staged
を使うと、現在の変更が上書き・消去されます。
必ず git diff
や git status
で確認してから操作してください。
2.間違えた場合
例えば、間違ったファイルを戻してしまった場合は、まだコミットしていなければ以下のコマンドで元に戻せます。
git restore README.md
また、操作履歴を確認したい場合は git status
や git diff
を使いましょう。
git status
git diff
操作前に git log
を使って、どのコミットから戻すかを明確にしておくのがおすすめです。
git log --oneline
3.用語補足:ステージ(インデックス)とは?
Gitではファイルの変更が記録されるまでに、いくつかの段階があります。
-
作業ツリー(Working Directory)
実際にファイルを編集している状態。まだGitには記録されていません。 -
ステージ(インデックス / Staging Area)
git add
を実行すると、変更内容がここに追加されます。
これは「次のコミットに含める準備ができている」状態です。 -
リポジトリ(Repository)
git commit
をすると、ステージの内容が履歴として保存されます。
例えば、以下のような操作をしたとき:
echo "Hello" >> hello.txt
git add hello.txt
この時点では hello.txt
はまだコミットされていませんが、ステージに追加された状態です。
このように、--staged
オプションは「ステージされた状態も過去の内容に戻す」という意味で使われます。
混乱しやすい用語なので、迷ったら git status
で現在の状態を確認するのがおすすめです。
まとめ
Gitで特定のファイルだけを過去の状態に戻すには、以下の2つの方法があります。
-
git checkout <commit> -- <file>
:昔ながらの方法(非推奨) -
git restore --source <commit> <file>
:推奨される方法(Git 2.23以降)
どちらを使うにせよ、「ファイル単位で戻せる」という柔軟さは、Gitの強みの一つです。
状況に応じて使い分けられるようになると、より安心してコード管理ができるようになります。
Git操作で困っている方の一助になれば幸いです。
Discussion