Gitの基本的な使い方のおさらいをチームのLearning Sessionでやろうかなと思ってドキュメントを眺めてたら、あれ?こんなんあったっけ?と思うコマンドがあった。
git restore と git switch
Git 2.23で導入されたみたい。去年の夏か。
https://github.blog/2019-08-16-highlights-from-git-2-23/
まだExperimentalみたいだけど、面白そうなので触ってみた。今日は git restore の話。git switch はまた気が向いたら。
https://git-scm.com/docs/git-restore
## リストアの前にWorking Treeとかの話をざっくり
GitにはWorking TreeとStaging AreaとGit Directoryという3つの場所がある。
file.txt という名前のファイルがあるとして、Cloneしてきた最初はこんな感じで、全部に同じ情報が入ってるようなイメージ。

ファイルを編集するとこんな感じ。Working Treeの部分。

git add をするとStaging Areaに反映される。

その後に git commit をするとGit Directoryに反映される。

## git restore --staged
じゃリストアしていこう。Staging AreaにaddしたあとにWorking Treeのファイルを編集して、こんな状態になってるとする。

この状態で、次のコマンドを実行すると:
$ git restore --staged file.txt
Staging Areaの file.txt がHEADからリストアされる。

## git restore
もう一度さっきの状態から始めるとして。

$ git restore file.txt
を実行すると、Working Treeの file.txt がStaging Areaからリストアされる。

## 両方一気にリストアしたい場合
$ git restore --source=HEAD --staged --worktree file.txt

ちなみにオプション周りのデフォルトはこんな感じになってる:
--worktreeも--stagedも指定されていない場合は、Working Treeがリストア対象--sourceが指定されていない場合は--stagedが指定されていたら、HEADからリストア- Working Treeが対象の場合は、Staging Areaからリストア
## HEADからWorking Treeをリストアしたい場合
$ git restore --source=HEAD file.txt

## ということで
こんなイメージで覚えておこうかな。

git checkout や git reset でリストアをしてきたけど、これからは git restore を使ってみようかな。