git restoreで特定のファイルだけを過去に戻す方法【git checkoutとの違い】

Git

1つの設定ファイルだけ誤って変更してしまった、あるいは特定のファイルだけを過去の正常な状態に戻したいという場面は開発現場でよくあります。git reset はプロジェクト全体のコミット履歴を巻き戻してしまいますが、git 特定のファイル 戻す操作には git restore を使うのが正解です。この記事では、Git 2.23以降で推奨されるモダンな方法を解説します。

この記事でわかること

  • なぜ古い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 によるファイル復元の代替となる

関連記事

コメント

タイトルとURLをコピーしました