Git

【Git】ブランチ切り替え【switch】

概要

以前は git 操作でブランチを移動するとき、git checkout が使われていたと思います。

昔から触れている方からすれば何の違和感も無いのかもしれませんが、私が初学者の頃、checkout という単語と実際にできることに乖離を感じて色々と調べているたとき、どこかの記事にgit switch という見慣れないコマンドを見つけました。

このコマンドは主にブランチ間の移動、コミット間の移動に使われるもので、2019 年 8 月にリリースされた Git 2.23 から使えるようになっていたようです。

結構前の話題になりますが、知らなかったという声を時々耳にするので、今回はこのコマンドについて解説していきます。

この記事で分かること

  • git switch の使い方

git switch の使い方

基本構文

switch は次のように使います。

git switch [<options>] [<branch>]

options ... オプションを指定する必要があれば指定します
branch ... 移動先のブランチ名やコミットハッシュを指定します

既存のブランチに移動する

以下のように main ブランチにいる状態から、既存の develop ブランチに移動する場合を考えます。

$ git br
  develop
* main

この場合は、以下コマンドで移動できます。

$ git switch develop

新規ブランチを作成し、移動する

新しく test ブランチを切って、そこに移動する場合は以下のように-c オプションを使うことで一括操作できます。

$ git switch -c test
$ git switch -c test
Switched to a new branch 'test'

$ git branch
  develop
  main
* test

ただし、このコマンドは既に作成したい名前のブランチがある場合以下のようにエラーになってしまいます。

$ git switch -c test
fatal: A branch named 'test' already exists.

こんなときに役立つのが-C(大文字)オプションです。
このオプションを指定すると、既に作成したいブランチ名が使われていてもそのブランチを上書きする形で強制的にブランチを作成して、そのブランチに移動できます。

$ git switch -C test
Switched to and reset branch 'test'

過去のコミットに一時的に戻る

以下のような状態で、一つ目のコミット(first commit)に戻りたいとします。

0ed5fd2 (HEAD -> test) main commit 1
cedc58b (origin/main, origin/HEAD) first commit

この場合は-dオプションを指定します。

$ git switch -d cedc58b
HEAD is now at cedc58b first commit

ログやブランチを確認すると移動できていることが分かりますね。

$ git log --oneline
cedc58b (HEAD, origin/main, origin/HEAD) first commit

$ git br
* (HEAD detached at cedc58b)
  develop
  main
  test

直近いたブランチやコミットに戻る

main ブランチ →develop ブランチに移動した状態でまた main ブランチに戻りたいときは次のように移動できます。

git switch -
$ git switch develop
Switched to branch 'develop'

$ git switch -
Switched to branch 'main'

過去のコミットに一時的に戻った後、元いたブランチ(位置)に戻るときにも使えます。

$ git switch -d 4ca4c46
HEAD is now at 4ca4c46 Merge branch 'develop'

$ git switch -
Previous HEAD position was 4ca4c46 Merge branch 'develop'
Switched to branch 'main'

ただし、前回いた場所が過去コミットだった場合には-dオプションも合わせて指定してやる必要があります。

$ git switch -  // これだとエラーになる
fatal: a branch is expected, got commit 'b380348f1419597b3cee1d369dffee9df9fd1ad7'

$ git switch -d -
HEAD is now at b380348 main commit 2

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

リモートブランチをローカルにチェックアウトする際にも switch が使えます。

まず最初に、リモートの追跡ブランチを更新します。(test2 ブランチをリモートに作成しています。)

$ git fetch --all
Fetching origin
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
Unpacking objects: 100% (3/3), 681 bytes | 170.00 KiB/s, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
From github.com:hiroya232/test
 * [new branch]      test2      -> origin/test2

あとは、通常通り移動するだけです。

$ git switch test2
Branch 'test2' set up to track remote branch 'test2' from 'origin'.
Switched to a new branch 'test2'

このとき、ローカルに test2 ブランチは無いので-cが必要そうに見えますがリモート追跡ブランチに同名のブランチがある場合はそのブランチが使用されます。

-Git