git switch

コマンドの概要

ブランチを切り替えるコマンド。を指定することでブランチを切り替える。

コマンドの使い方

main ブランチに移動

1$ git switch main
2$ git checkout main

新しくブランチを作成しつつ、ブランチを移動するには

topicブランチを作成しつつ、topicブランチに移動

1$ git switch -c topic
2$ git checkout -b topic

コミットしていない変更がワーキングツリー、インデックスにあるときは、これをどうにかしないとブランチは移動できない。
その場合、git stashにより変更を別に退避させるか、変更を破棄してブランチを移動する。

変更を破棄して main ブランチに移動する

1$ git switch -f main
2$ git checkout -f main
この機能は git checkout により実装されていたが、git checkout を git switch と git restore に機能を分割。わかりやすくなった。

git switch の本質は

git switch(というより git checkout) の本質は任意のコミットに HEAD を移動させるコマンド。

1git switch main

は main ブランチが指し示すコミットに HEAD を移動させる、という意味である。
ブランチとはコミットの集合体ではなく、特定のコミットへのポインタであるので、main ブランチが示しているコミットと HEAD が示しているコミットは同じコミット。
では、

1$ git switch --detach HEAD

とすると?

HEAD は同じコミットを指していることには変わりがないが、main ブランチとの親子関係がない状態になる。(detached HEAD)
この状態でコミットを重ねていくことはできるが、ガベージコレクションに回収されてしまう。 detached HEADを解消したい場合は、コミット後であっても新たにブランチを作成、必要なブランチでマージすれば良い。

git checkoutではブランチを指定するのではなくコミットを参照するとdetached HEADになってしまうが、git switchでは--detachオプションを使わないとコミットを指定できないようになっており、意図的に作り出さないかぎりdetached HEADにならないようになっている。