Gitで特定のファイルだけ戻す方法!部分的に復元する

git
\ Gitがよく分からない初心者の方へ /
さわっておぼえるGit入門
Gitがよく分からない初心者でも、
この1冊で基本操作を一通り理解できます。
👉 Amazonで詳しく見る
Kindle Unlimitedなら無料で読めます
▶ 無料で読む(Kindle Unlimited)

今回は、Gitで特定のファイルだけ元に戻す方法について解説します。
Gitを使っていると、次のような場面はないでしょうか。

  • 間違ってファイルを編集してしまった
  • 1つのファイルだけ以前の状態に戻したい
  • 他の変更は残したまま特定のファイルだけ復元したい
  • git restoregit checkout の違いが分からない

このような場合は、Gitの「ファイル単位での復元」を使うことで解決できます。
この記事では、特定ファイルだけを元に戻す方法や、過去のコミットから復元する方法について解説します。

Gitで特定のファイルだけ戻す方法

結論から言うと、現在の変更を取り消してファイルを元に戻す場合は、git restore を使用します。

git restore ファイル名

例えば、index.html を元に戻す場合は次のようになります。

git restore index.html

実行すると、そのファイルの変更内容だけが取り消され、最後にコミットされた状態に戻ります。

※以前はgit checkoutが使われていました。
ブランチ切り替え(switch)とファイルの復元(restore)という全く異なる機能が1つのコマンドに同居していて分かりにくかったため、Git 2.23から機能が分割されました。
現在ではgit restoreを使うほうが推奨されています。

実行例

変更前の状態を確認します。

git status
modified: index.html
modified: style.css

index.html のみ戻します。

git restore index.html

再度確認します。

git status
modified: style.css

このように、他のファイルはそのまま残しつつ、指定したファイルだけ最後にコミットした状態に復元できます。

過去のコミットから特定ファイルだけ復元する方法

過去のコミットにあるファイルを現在の作業ブランチへ復元したい場合は、git restore --source を使用します。

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

例えば、1つ前のコミットにあった状態へ戻す場合です。

git restore --source=HEAD~1 index.html

実行すると、index.html だけが1つ前のコミットの内容になります。

コミット履歴を確認する

対象のコミットIDが分からない場合は、先に履歴を確認します。

git log --oneline

実行例です。

a1b2c3d fix header
e4f5g6h update css
i7j8k9l first commit

左の文字列がコミットIDです。
コミットIDを指定して、そのときのコミットからファイルを復元できます。

git restore --source=e4f5g6h index.html

Gitで特定ファイルだけの変更前の最新コミット状態に戻す

ステージング済みのファイルを元に戻したいケースもあります。

例えば次の状態です。

git add index.html

この場合、まずステージングを解除します。

git restore --staged index.html

実行後、変更内容は残ったままステージングだけ解除されます。

git status
modified: index.html

さらに変更内容も破棄したい場合は、続けて実行します。

git restore index.html

一度に変更内容の破棄もしたい場合には、こちらを使うことができます。

git restore --staged --worktree index.html

また、以下のように「復元元(-s)に HEAD コミットを指定する」ことでも、同じようにステージングと変更を同時に最新コミット状態へ戻せます。

git restore -s HEAD index.html

Gitで複数ファイルをまとめて最新コミット状態に戻す

複数ファイルを同時に復元することも可能です。

git restore index.html style.css script.js

指定したファイルのみ元の状態に戻ります。

また、特定ディレクトリごと戻すこともできます。

git restore src/

Gitで特定ファイルだけ戻す際の注意点

Gitで特定ファイルだけ戻す際の注意点についてです。

復元後は元に戻せない

git restore で変更を破棄すると、その変更内容は失われます。
コミットしていない変更は復元できないため、必要な場合は事前に退避しておきましょう。

git stash

コミットを戻すわけではない

git restore はファイルの内容を戻すコマンドです。
コミット履歴そのものは変更されません。

履歴を戻したい場合は、以下の記事を参考にしてください。

古いGitではgit checkoutを使う

Git 2.23以前では git restore が利用できません。

その場合は次のコマンドを使用します。

git checkout -- index.html

Git 2.23以降は、より分かりやすい git restore の利用が推奨されています。

Gitで特定ファイルだけ戻す方法まとめ

Gitで特定のファイルだけ元に戻したい場合は、git restoreを使用します。
現在の変更を破棄する場合はこちらです。

git restore ファイル名

過去のコミットから復元する場合はこちらです。

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

ポイントをまとめると次の通りです。

  • 特定ファイルだけ元に戻せる
  • 他のファイルへの変更はそのまま残せる
  • 過去のコミットから復元することも可能
  • ステージング解除は git restore --staged
  • 古いGitでは git checkout -- ファイル名 を使用する

「1つのファイルだけ戻したい」という場面はGitでよくあります。
まずは git restoreを覚えておくと、多くのケースに対応できるかと思います。

コメント