1つの設定ファイルだけ誤って変更してしまった、あるいは特定のファイルだけを過去の正常な状態に戻したいという場面は開発現場でよくあります。git reset はプロジェクト全体のコミット履歴を巻き戻してしまいますが、git 特定のファイル 戻す操作には git restore を使うのが正解です。この記事では、Git 2.23以降で推奨されるモダンな方法を解説します。
このシリーズの全記事
- 第1回:プログラミングエラーメッセージの読み方
- 第2回:VSCodeで「command not found: code」が出た時の解決方法
- 第3回:npmのEACCESエラーをsudoなしで安全に解決する方法
- 第4回:git commitでVimが開いたときにコミットをキャンセルする方法
- 第5回:git detached HEAD状態から安全に復帰する方法
- 第6回:git resetとgit revertの違いと使い分け
- 第7回:git restoreで特定のファイルだけを過去に戻す方法【この記事】
- 第8回:VSCodeのマージエディタでgitコンフリクトを解消する手順
- 第9回:.envをGitにコミットしてしまった場合の履歴からの完全削除
この記事でわかること
- なぜ古いgit checkoutではなくgit restoreを使うべきか
- git restore –source で特定ファイルを指定コミットの状態に戻す手順
- git log –で対象ファイルの変更履歴だけを確認する方法
なぜgit checkoutではなくgit restoreを使うのか
Git 2.23(2019年8月リリース)以前は、ブランチの切り替えもファイルの復元も同じ git checkout コマンドで行っていました。このため、コマンドの意味が文脈によって変わり、初学者が混乱する原因となっていました。
Git 2.23以降では役割が明確に分離されました。ブランチの切り替えには git switch、ファイルの復元には git restore を使います。現在のGitの推奨方法として git restore を使用してください(Git 2.23以降で確認済み)。
ポイント
古い技術ブログでは git checkout <コミットハッシュ> -- ファイル名 が紹介されていますが、Git 2.23以降は git restore --source が推奨コマンドです。
git restoreで特定ファイルを過去に戻す手順
手順は2ステップです。まず対象ファイルのコミット履歴を確認し、次に復元したいコミットのハッシュを指定して復元します。
ステップ1:対象ファイルの変更履歴を確認する
git log -- ファイルパス で、そのファイルが変更されたコミットのみを絞り込んで表示できます。
git log --oneline -- config/settings.py
# 出力:
f3a9b12 データベース設定を本番用に変更(取り消したい変更)
d7e4c22 初期設定を追加
1b8a0f5 プロジェクト初期化
d7e4c22(初期設定を追加)の状態に戻したい場合は、そのコミットハッシュをメモします。
ステップ2:git restore –source で復元する
git restore --source d7e4c22 -- config/settings.py
# 出力:(出力なし、ファイルが指定コミットの状態に復元される)
# 変更が適用されたことを確認する
git status
# 出力:
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: config/settings.py
ファイルが復元されてワーキングディレクトリに変更として反映されました。確認後にコミットしてください。
git add config/settings.py
git commit -m "config/settings.pyをd7e4c22の状態に復元"
# 出力:
[main a1b2c3d] config/settings.pyをd7e4c22の状態に復元
1 file changed, 5 insertions(+), 3 deletions(-)
git resetとのスコープの違い
| コマンド | 対象範囲 | 用途 |
|---|---|---|
git reset HEAD~1 |
プロジェクト全体のコミット履歴 | 直前のコミット自体を取り消す |
git restore --source |
指定した特定のファイルのみ | 特定ファイルを過去の状態に戻す |
git restore はプロジェクトの他のファイルやコミット履歴には一切影響を与えません。「設定ファイルだけ元に戻して、他は今の状態を維持する」という外科的な操作が可能です。
現在の作業変更を破棄して最新コミットの状態に戻す
コミット前の変更を破棄して、最後のコミット時点の状態に戻したい場合は --source なしの git restore を使います。
git restore config/settings.py
# 出力:(出力なし、作業中の変更が破棄されて最新コミットの状態に戻る)
注意
git restore ファイル名(–sourceなし)でコミット前の変更を破棄した場合、その変更は取り戻せません。ステージングにも追加していない変更は完全に消えるため、慎重に実行してください。
まとめ
- 特定のファイルのみを過去に戻すには、プロジェクト全体を巻き戻す
git resetではなくgit restore --source <ハッシュ> -- ファイルパスを使う - 対象ファイルのコミットハッシュは
git log --oneline -- ファイルパスで絞り込んで確認する git restoreはGit 2.23以降で推奨されるコマンドで、古いgit checkoutによるファイル復元の代替となる
シリーズナビゲーション:脱・初学者サバイバルガイド


コメント