2019年8月にリリースされた Git 2.23 から,Experimental(実験的機能)として新コマンド git switch と git restore が使える.今までずっと使ってきた git checkout は機能が多すぎたため,機能を分割し git checkout の代替としてリリースされた.個人的にリリースされてから,できる限り git switch と git restore を使うようにしてるけど,まだ無意識に git checkout を使ってしまうこともある.最近 git switch を教える機会があったため,ブログにまとめておく.
なお,以下の検証は Git 2.26.0 を使った.
$ git --version git version 2.26.0
1. git switch を使う
git switch を使って「ブランチ操作」を行なう.ドキュメントを網羅的に紹介するのではなく,よく使う操作を中心に git checkout などと比較しながら紹介する.詳細はドキュメントを参照してもらればと.
ブランチを作る
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 などと比較しながら紹介する.詳細はドキュメントを参照してもらればと.
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 checkout は Staging な状態に戻り,git restore -s は Unstaging な状態に戻るため,単純比較ではなく,注意すること.
$ git checkout ${HASH} . $ git checkout master~2 . $ git restore -s ${HASH} . $ git restore -s master~2 .
まとめ
Git 2.23 から,Experimental(実験的機能)として使えるようになった新コマンド git switch と git restore の中でよく使う操作を中心に紹介した.プログラミング講師の仕事をしていたときに git checkout の説明に苦労した経験もあり,今後は Git 初学者は git switch と git restore から学べば良さそう.