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
にならないようになっている。