git restore は、working tree や index の内容を前の状態へ戻すための Git コマンドです。
いまの変更を捨ててよいときに、ファイル単位で戻したり、ステージだけ外したりするときに使います。
まず押さえたいポイント
- ファイル内容を戻すためのコマンド
--stagedでステージだけ外せるgit resetより初心者には意図が分かりやすいことが多い
どんな場面で使うか
- 未ステージ変更を捨てたい
- 間違って add したものを外したい
- 一部ファイルだけ前の状態へ戻したい
どんなふうに理解するとよいか
初心者向けには、このファイルを今の変更前へ戻すコマンド と考えると入りやすいです。
変更を残したい場面ではなく、戻してよい と判断できた場面で使うのが基本です。
restore / reset / checkout の使い分け
git restore が分かりにくいのは、同じことが古い git checkout でもできてしまうからです。役割で並べると区別が付きます。
| やりたいこと | コマンド | 触る場所 |
|---|---|---|
| 編集を捨てて最後のコミットに戻す | git restore ファイル |
working tree |
git add を取り消す(変更は残す) |
git restore --staged ファイル |
index |
| 特定のコミットの内容を取り出す | git restore --source コミット ファイル |
指定した場所 |
| ブランチを移動する | git switch ブランチ |
HEAD |
| コミット自体を戻す | git reset |
HEAD・index・working tree |
git checkout はこのうち「ファイルを戻す」と「ブランチを移動する」を兼ねていたため、事故が起きやすい状態でした。restore と switch は、その2つを分けるために用意されたものです。
戻したものは戻せない
いちばん怖いのはここです。git restore で working tree の編集を捨てた場合、その編集はコミットにもスタッシュにも残っていないので、Git からは復元できません。git reset --hard と同じ性質の操作だと考えてください。
- 消していいか自信が無ければ、先に
git stashに退避する - エディタのローカル履歴が残っている場合はそこから拾えることがある
--stagedだけを付けた場合は index を戻すだけなので、編集内容は消えない
押さえておきたい注意点
戻した変更は簡単には戻せないことがあります。
少しでも迷うなら、先に git stash で退避した方が安全です。
実務で見るポイント
git restore path/to/fileはかなり使いやすいgit restore --stagedで index 側だけ触れる全部まとめて戻す前に本当に消してよいか確認した方がよい