git switch

ブランチを切り替えるコマンド

コマンドの概要

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

コマンドの使い方

// master ブランチに移動
$ git switch master
$ git checkout master

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

// topicブランチを作成しつつ、topicブランチに移動
$ git switch -c topic
$ git checkout -b topic

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

// 変更を破棄して master ブランチに移動する
$ git switch -f master
$ git checkout -f master

git switch の本質は

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

git switch master

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

$ git switch --detach HEAD

とすると?

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

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

Last modified 2020.05.25