今回は、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 checkoutコマンドについては、下記の記事も参考にしてみてください。
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 resetやgit 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 前)の状態に戻ります。
コメント