Gitで特定のファイルを過去のコミットに戻す方法
Gitを利用して開発を行っていると、誤ってファイルを変更してしまったり、ある時点の安定した状態に戻したいケースが出てきます。今回は、特定のファイルだけを過去のコミット時点の状態に戻す方法を、いくつかの手法に分けて説明します。
git checkout
を用いる方法(Git 2.23以前)
1. Git 2.23より前のバージョンでは、git checkout
コマンドを利用して過去の状態のファイルを取得するのが一般的でした。以下の手順で実行します。
-
過去のコミットからファイルを取得する
指定したコミットのハッシュ(例:abc123
)と対象のファイルパス(例:src/config.php
)を指定して、以下のように実行します。git checkout abc123 -- src/config.php
-
変更をコミットする
ワーキングディレクトリで変更が反映されたら、新たなコミットとして履歴に残すために以下を実行します。git commit -m "Revert src/config.php to commit abc123"
注意: Git 2.23以降では、git checkout
はブランチの切り替え用に使われるようになり、ファイルの復元には git restore
を使用することが推奨されています。
git restore
を用いる方法(Git 2.23以降推奨)
2. Git 2.23以降では、ファイルの復元専用コマンドとして git restore
が導入されました。これにより、より直感的な操作が可能となりました。
-
ファイルの復元
以下のコマンドで、特定のコミット(例:abc123
)からファイルを復元します。git restore --source=abc123 -- src/config.php
-
変更をステージングしてコミット
復元したファイルをインデックスに追加し、新しいコミットを作成します。git add src/config.php git commit -m "Restore src/config.php to commit abc123"
git reset
を使う方法
3. git reset
は主にブランチ全体の状態を戻すために使われるコマンドですが、ファイル単位でステージングエリアの状態を戻す用途として利用することも可能です。
たとえば、あるファイルの変更前の状態に戻したい場合は以下のように実行します。
-
対象ファイルの状態をリセット
git reset abc123 -- src/config.php
-
インデックスの状態を確認し、コミット
git add src/config.php git commit -m "Reset src/config.php to commit abc123"
注意: この方法はインデックスの状態(ステージングエリア)を操作するため、ブランチ全体の履歴は変化せず、あくまで作業ディレクトリでの状態を戻す操作です。
git revert
を使う方法
4. 過去のコミットに対する「打ち消し」を行い、新たなコミットとして履歴に反映させたい場合には、git revert
が有効です。
git revert
は、指定したコミットの変更を打ち消す新たなコミットを作成するため、履歴がそのまま残るメリットがあります。
-
対象のコミットを打ち消す
git revert abc123 --no-commit
-
必要なファイルのみをコミット
--no-commit
オプションを使っているため、打ち消し後に対象ファイルだけをステージングし、コミットします。git add src/config.php git commit -m "Revert changes for src/config.php from commit abc123"
どの方法を選ぶべきか?
方法 | 特徴・影響 | 適用シナリオ |
---|---|---|
git checkout / git restore |
対象ファイルを直接過去の状態に戻し、新たにコミット | 過去の状態に戻して、履歴をシンプルに保ちたい場合 |
git reset |
ステージングエリアを過去の状態に戻す | 履歴の変更を伴わずに、作業ディレクトリのみの状態を戻す場合 |
git revert |
打ち消し用のコミットを作成して履歴を保全 | 過去の変更を明示的に取り消し、履歴を追跡可能にしたい場合 |
例えば、単にファイルの内容を元に戻すだけなら git restore
(または古いバージョンの場合は git checkout
)がシンプルでおすすめです。一方、履歴をきちんと記録したい場合は git revert
を選択すると良いでしょう。
まとめ
Gitでは、特定のファイルだけを過去のコミット状態に戻すための複数の方法が用意されています。
-
Git 2.23以降では、
git restore
が直感的で使いやすいです。 -
履歴に残したい場合は、
git revert
を用いて打ち消しコミットを作成しましょう。 -
作業ディレクトリのみの調整が必要な場合は、
git reset
も検討の余地があります。
Discussion