git restoreの使い方!checkoutとの違いは?

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

今回は、Gitのrestoreコマンドについて解説します。
Gitを使っていると、次のような場面はありませんか?

  • 編集したファイルを元に戻したい
  • ステージした変更を取り消したい
  • git checkoutとの違いが分からない
  • git restoreをいつ使えばいいか知りたい

このようなときはgit restoreコマンドを使用します。
この記事では、git restoreコマンドの基本的な使い方から、checkoutとの違い、ステージした変更を戻す方法などを解説します。

git restoreとは?

git restoreコマンドは、ワークツリーやステージのファイルを元に戻すためのコマンドです。
Git 2.23から追加され、それまでgit checkoutが担っていた「ファイルを元に戻す」という役割が分離されました。

現在では、ブランチの切り替えも分割され、下記コマンドが推奨されています。

  • ブランチを切り替える → git switch
  • ファイルを元に戻す → git restore

git restoreの基本構文

基本的にはコマンドの後に、ファイル名やパスを指定します。

git restore <ファイル名>

例えば、このように実行します。

git restore sample.txt

そうすると、sample.txtの未ステージの変更を破棄し、最後にコミットされた状態へ戻します。

編集したファイルを元に戻す

例えば、次のように編集したとします。(コミット前はHelloの記載のみ)

Hello
Git
restore

まだコミットしていない状態で、下記のgit restoreコマンドを実行します。

git restore sample.txt

そうすると、このように最後のコミット時点の内容へ戻ります。

Hello

ポイント

git restoreコマンドで破棄した変更は、基本的に元へ戻せません。
そのため、実行前に本当に削除して問題ないか確認しましょう。

複数ファイルをまとめて戻す

複数のファイルを指定することで一度に戻せます。

git restore sample1.txt sample2.txt sample3.txt

ディレクトリ全体なら、ディレクトリを指定します。

git restore src/

すべての変更を戻す場合は、下記のコマンドになります。
(※カレントディレクトリ配下の変更すべてになります)

git restore .

ステージした変更を取り消す

git addしたあとでも、ステージだけ取り消すことができます。

git restore --staged sample.txt

例えば、下記のようにsample.txtファイルをステージエリアにのせます。

git add sample.txt

その後に、git restoreコマンドを実行すると、ステージだけ解除されます。

git restore --staged sample.txt

ファイルの内容(編集した作業状態)はそのまま保持され、未ステージ(git add前)の状態に戻ります。

ワークツリーもステージも両方戻す

完全に変更を破棄したい場合は、下記のように2回コマンドを実行するか

git restore --staged sample.txt
git restore sample.txt

オプションを使うことで、一気に取り消すことができます。

git restore --staged --worktree sample.txt

これで、ステージと編集内容の両方を取り消すことが可能です。

特定のコミットの内容へ戻す

特定のコミットの内容へ復元することも可能です。
--sourceを使うと、任意のコミットからファイルを復元できます。

git restore --source=HEAD~1 sample.txt

これは一つ前のコミットの内容を取得しています。(HEAD~1でひとつ前)

コミットIDでも指定できます。

git restore --source=3f6c2a1 sample.txt

git checkoutとの違い

Git 2.23以前では、git checkoutコマンドで変更を戻していました。

git checkout sample.txt

しかしcheckoutには「ブランチ切り替え」・「ファイル復元」という2つの役割があります。
そのため、慣れてない人には分かりづらいという問題がありました。

現在は役割が分離されています。

コマンド 用途
git switch ブランチを切り替える
git restore ファイルを元に戻す
git checkout 従来の両方の機能を持つ

新しくGitを使っていく場合は、間違えなども減るかと思うので
下記コマンドを覚えるのがおすすめです。

  • ブランチ操作 → switch
  • ファイル操作 → restore

git restoreとgit resetの違い

混同しやすいコマンドとしてgit resetがあります。
違いは次の通りです。

コマンド 用途
git restore ファイルを元に戻す
git reset コミットやステージの状態を戻す

例えば、下記のコマンドは特定のファイルだけ戻します。

git restore sample.txt

一方、git resetコマンドはコミット履歴やステージの状態を戻すためのコマンドです。
下記のコマンドを実行すると、直前のコミットを取り消してステージ前の状態に戻せます。
(※オプションを指定しない場合、作業中のファイル内容は保持されます)

git reset HEAD~1

それぞれ、下記のように覚えると分かりやすいでしょう。

  • ファイル操作 → restore
  • 履歴操作 → reset

git restoreコマンドまとめ

やりたいこと コマンド
変更を元に戻す git restore file.txt
ステージ解除 git restore --staged file.txt
すべて戻す git restore .
ディレクトリを戻す git restore src/
特定コミットから復元 git restore --source=HEAD~1 file.txt

よくありそうな質問

よくありそうな質問です。

git restoreはコミット済みの変更も戻せますか?

戻せません。

git restoreはワークツリーやステージの変更を戻すためのコマンドです。
コミット済みの履歴を戻したい場合は、git resetgit revertを使用します。

git checkoutはもう使わないのでしょうか?

現在でも利用できます。
ただしGit公式では、下記の使用が推奨されています。

  • ブランチ操作はgit switch
  • ファイル操作はgit restore

git restoreで消した変更は元に戻せますか?

基本的には戻せません。
そのため、実行前には変更内容をgit diffなどで確認してから実行しましょう。

まとめ

今回はgit restoreについて解説しました。
ポイントをまとめると次の通りです。

  • git restoreはファイルの変更を元に戻すコマンド
  • git restore --stagedでステージだけ解除できる
  • --sourceを使うと特定コミットから復元できる
  • Git 2.23以降はcheckoutよりrestoreの利用が推奨されている
  • ブランチ操作はgit switch、ファイル操作はgit restoreと覚えると分かりやすい

git restoreは日常的によく使うコマンドです。
git checkoutとの違いもあわせて理解しておくことで、Git操作がより分かりやすくなります。ファイルの内容(編集した作業状態)はそのまま保持され、未ステージ(git add 前)の状態に戻ります。

コメント