これからは git restore を使ってみようかな

Gitの基本的な使い方のおさらいをチームのLearning Sessionでやろうかなと思ってドキュメントを眺めてたら、あれ?こんなんあったっけ?と思うコマンドがあった。

git restoregit 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してきた最初はこんな感じで、全部に同じ情報が入ってるようなイメージ。

f:id:bufferings:20200501011212p:plain

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

f:id:bufferings:20200501011224p:plain

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

f:id:bufferings:20200501011238p:plain

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

f:id:bufferings:20200501011253p:plain

## git restore --staged

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

f:id:bufferings:20200501011324p:plain

この状態で、次のコマンドを実行すると:

$ git restore --staged file.txt

Staging Areaの file.txt がHEADからリストアされる。

f:id:bufferings:20200501011356p:plain

## git restore

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

f:id:bufferings:20200501011324p:plain

$ git restore file.txt

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

f:id:bufferings:20200501011446p:plain

## 両方一気にリストアしたい場合

$ git restore --source=HEAD --staged --worktree file.txt

f:id:bufferings:20200501011504p:plain

ちなみにオプション周りのデフォルトはこんな感じになってる:

  • --worktree--staged も指定されていない場合は、Working Treeがリストア対象
  • --source が指定されていない場合は
    • --staged が指定されていたら、HEADからリストア
    • Working Treeが対象の場合は、Staging Areaからリストア

## HEADからWorking Treeをリストアしたい場合

$ git restore --source=HEAD file.txt

f:id:bufferings:20200501011558p:plain

## ということで

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

f:id:bufferings:20200501011630p:plain

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