kakakakakku blog

Weekly Tech Blog: Keep on Learning!

git checkout の代替としてリリースされた git switch と git restore

2019年8月にリリースされた Git 2.23 から,Experimental(実験的機能)として新コマンド git switchgit restore が使える.今までずっと使ってきた git checkout は機能が多すぎたため,機能を分割し git checkout の代替としてリリースされた.個人的にリリースされてから,できる限り git switchgit restore を使うようにしてるけど,まだ無意識に git checkout を使ってしまうこともある.最近 git switch を教える機会があったため,ブログにまとめておく.

github.blog

なお,以下の検証は Git 2.26.0 を使った.

$ git --version
git version 2.26.0

1. git switch を使う

git switch を使って「ブランチ操作」を行なう.ドキュメントを網羅的に紹介するのではなく,よく使う操作を中心に git checkout などと比較しながら紹介する.詳細はドキュメントを参照してもらればと.

git-scm.com

ブランチを作る

git switch -c でブランチを作れる.今までは git checkout -b を使っていた.

$ git checkout -b my-git-checkout

$ git switch -c my-git-switch

ブランチを切り替える

git switch という名前の通り,ブランチ名を指定すると切り替えられる.

$ git checkout master

$ git switch master

1個前のブランチに切り替える

Linux の cd - と同じく,- を使って git switch - とすると,1個前のブランチに切り替えられる.

$ git checkout -

$ git switch -

リモートブランチを取得する

「ブランチを作る」と同じく git switch -c を使って,origin/xxx など,リモートブランチを指定する.

$ git fetch
$ git checkout -b my-github-branch origin/my-github-branch

$ git fetch
$ git switch -c my-github-branch origin/my-github-branch

"強制的に" ブランチを作る

個人的にあまり使う機会はなさそうだし,誤って使うと危険な気もするけど,git switch-C オプション(大文字)もしくは --force-create オプションを使うと,もし同じ名前のブランチが存在していても強制的に作り直す.-c-C は区別しにくそう...!

$ git switch -C my-git-switch

2. git restore を使う

git restore を使って「変更を戻す操作」を行なう.ドキュメントを網羅的に紹介するのではなく,よく使う操作を中心に git checkout などと比較しながら紹介する.詳細はドキュメントを参照してもらればと.

git-scm.com

Unstaging な変更を戻す(git add をする前)

今まで git checkout を使って変更を戻していたけど,git restore で戻せる.とは言え,個人的に1番無意識に使ってしまうのが git checkout . で,今もまだ git restore . には慣れていない.

$ git checkout README.md
$ git checkout .

$ git restore README.md
$ git restore .

実際に git status を使うと,git restore を使うリファレンスも出る.

$ git status

(中略)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   README.md

Staging な変更を戻す(git add をした後)

git add で Staging にした変更を戻す場合,今までは git reset を使っていたけど,git restore --staged を使う.

$ git reset README.md

$ git restore --staged README.md

実際に git add をした後に git status を使うと,git restore --staged を使うリファレンスも出る.

$ git status

(中略)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   README.md

指定した Commit に戻す

指定した Commit に戻す場合は git restore -s を使う.ただし,git checkoutStaging な状態に戻り,git restore -sUnstaging な状態に戻るため,単純比較ではなく,注意すること.

$ git checkout ${HASH} .
$ git checkout master~2 .

$ git restore -s ${HASH} .
$ git restore -s master~2 .

まとめ

Git 2.23 から,Experimental(実験的機能)として使えるようになった新コマンド git switchgit restore の中でよく使う操作を中心に紹介した.プログラミング講師の仕事をしていたときに git checkout の説明に苦労した経験もあり,今後は Git 初学者は git switchgit restore から学べば良さそう.