【Git】特定のファイルだけ前のコミットに戻す方法|checkoutとrestoreの使い方

【Git】特定のファイルだけ前のコミットに戻す方法|checkoutとrestoreの使い方 Git

Gitを使っていると「あるファイルだけを前の状態に戻したい」という場面に遭遇することがあります。たとえば、コード全体はそのままに、特定の設定ファイルだけを以前のバージョンに戻したい場合などです。

本記事では、Gitで特定のファイルだけを過去のコミットの状態に戻す方法について、git checkoutgit restoreの2つのアプローチを紹介します。

Gitで特定ファイルを戻すとは?

Gitでは、過去のコミット履歴を参照して、特定のファイルだけをその当時の状態に戻すことが可能です。

たとえば、

  • config.php だけを1つ前の状態に戻す
  • README.md を3つ前のコミット時点に復元したい

といったケースに対して、以下のようなコマンドが活用できます。

git checkoutでファイルを戻す方法(Git 2.23未満でも使用可)

git checkoutは、もともとブランチ切り替えやファイル復元に使われていたコマンドです。以下のように指定することで、特定ファイルを過去のコミット状態に戻すことができます。

git checkout <コミットID> -- <ファイル名>

使用例

git checkout HEAD^ -- config.php

この例では、config.php を1つ前(HEAD^)のコミット時点に戻しています。--はファイル名とコミットIDを区別するために必要です。

戻したファイルはステージされていない状態でワークツリーに復元されます。そのため、復元後にコミットすることで変更が反映されます。

git restoreでファイルを戻す方法(Git 2.23以降推奨)

Git 2.23以降では、checkoutの役割を明確に分離するために、git restoreという新しいコマンドが導入されました。ファイルの復元専用のコマンドなので、シンプルで分かりやすくなっています。

git restore --source=<コミットID> <ファイル名>

使用例

git restore --source=HEAD^ config.php

この例も、1つ前のコミット時点のconfig.phpを復元します。なお、--source=HEAD~3のように、3つ前など柔軟に指定可能です。

コミットIDの調べ方(ログの確認)

戻したいファイルの過去の状態を知るには、まずコミット履歴を確認しましょう。

git log -- <ファイル名>

たとえば以下のように表示されます:

commit a1b2c3d4e5f6g7h8i9
Author: Your Name
Date:   2024-05-01

    Update config.php for new API

このcommitの後ろにあるハッシュ(例: a1b2c3d)を使って復元できます。

注意点:ワークツリーが上書きされる

これらの操作を実行すると、作業中のファイルが上書きされます。必要に応じて、復元前に現在の状態を保存しておくことをおすすめします。

以下のように、作業内容を一時退避することも可能です。

git stash push -m "作業内容の退避"

まとめ

特定のファイルだけを前のコミットに戻したい場合、git checkoutgit restoreを活用すれば柔軟に対応できます。Git 2.23以降であれば、より安全で直感的なgit restoreの利用が推奨されます。

  • 古いバージョンを調べるには git log -- <ファイル名>
  • checkout:古いGitでも使える
  • restore:新しいGitでの推奨手法

作業履歴の一部だけを復元するニーズは日常的にあるため、こうしたピンポイントのコマンド操作を覚えておくと開発効率が大きく向上します。