こんにちは、かつコーチです。
前回は「ブランチとは何か」を、本線を壊さずに実験できる仕組みとして解説しました。
今回はいよいよ実践編です。
git branch・git switch・git checkoutという3つのコマンドを使って、実際にブランチを作成・切り替える方法を見ていきましょう。
ブランチの作成・切り替えとは
下書き用の新しい紙を用意するイメージ
ブランチを作るというのは、今使っている原稿とは別に、新しい下書き用の紙を用意するようなものです。
そして「ブランチを切り替える」とは、手元で編集する紙を持ち替えることだと考えてください。
mainブランチという清書用の紙はそのまま机の上に置いておき、実験用の新しい紙(トピックブランチ)に持ち替えて自由に書き込む。
書き終わったら、また元の紙に持ち替えて作業を続ける。
この「紙を用意する」「紙を持ち替える」という2つの動作が、それぞれgit branchとgit switch(またはgit checkout)に対応しています。
なぜbranch・switch・checkoutを使い分けるのか
Gitには、ブランチ操作に関わるコマンドが複数存在します。
git branch:ブランチの作成・一覧表示・削除を行うgit switch:ブランチの切り替えに特化した比較的新しいコマンドgit checkout:ブランチの切り替えに加えて、ファイルの復元など多機能なコマンド
実はgit switchは、Git 2.23(2019年)で新しく追加されたコマンドです。
それ以前はgit checkoutがブランチ切り替えとファイル操作の両方を担っていたため、初心者にとって分かりにくいという課題がありました。
この記事では、まず基本のgit branchとgit switchを押さえたうえで、git checkoutとの違いも整理していきます。
git branchでブランチを作成・確認する
新しいブランチを作る
新しいブランチを作るには、git branch ブランチ名を使います。
# 新しいブランチ「feature-login」を作成する
git branch feature-login
このコマンドは、あくまで新しい紙を用意するだけで、まだそちらの紙に持ち替えてはいません。
作業中のブランチ(カレントブランチ)は、mainのままです。
ブランチ一覧を確認する
今どんなブランチがあるかは、引数なしのgit branchで確認できます。
git branch
feature-login
* main
*が付いているのが、今自分がいる(=手に持っている紙の)ブランチです。
ブランチを削除する
不要になったブランチは-dオプションで削除できます。
# マージ済みのブランチを削除する
git branch -d feature-login
まだマージしていないブランチを強制的に消したい場合は、-D(大文字)を使いますが、変更内容が失われるので慎重に使ってください。
git switchでブランチを切り替える
既存ブランチへの切り替え
ブランチを切り替えるには、git switch ブランチ名を使います。
# feature-loginブランチに持ち替える
git switch feature-login
これで、手元の紙がfeature-loginに切り替わりました。
以降のgit addやgit commitは、すべてこのブランチ上の記録として積み重なっていきます。
作成と切り替えを同時に行う(-c)
実務では「ブランチを作って、すぐそこで作業を始める」ケースがほとんどです。
そのため、作成と切り替えを1コマンドでまとめられる-cオプションがよく使われます。
# 新しいブランチを作成し、同時に切り替える
git switch -c feature-signup
git branch feature-signupとgit switch feature-signupを2回に分けて打つ手間が省けるので、私も普段はほぼこの形を使っています。
git checkoutとの違い・使い分け
checkoutの役割は広すぎる
git checkoutは、ブランチの切り替えだけでなく、特定ファイルを直前のコミット状態に戻すためにも使われます。
# ブランチを切り替える(switchと同じ役割)
git checkout feature-login
# ファイルの変更を直前のコミット状態に戻す(switchにはない役割)
git checkout -- sample.txt
同じgit checkoutというコマンドなのに、引数によって「ブランチの切り替え」と「ファイルの復元」というまったく別の処理が実行されてしまうわけです。
switchが導入された理由
この分かりにくさを解消するために生まれたのがgit switch(ブランチ切り替え専用)とgit restore(ファイル復元専用)です。
役割ごとにコマンドが分かれたことで、意図しない操作をしてしまうリスクが減りました。
実務ではどちらを使うべきか
結論としては、新しく学ぶ人はgit switchを基本にするのがおすすめです。
ただし、git checkoutは今でも広く使われており、社内の既存プロジェクトや技術記事ではgit checkout前提の説明も多く残っています。
「switchで書く、checkoutが出てきても読めるようにしておく」くらいの温度感で覚えておくとよいでしょう。
よくあるつまずきポイント
変更を保存せずに切り替えてエラーになる
作業途中のファイルがある状態でブランチを切り替えようとすると、Gitに止められることがあります。
❌ Before:コミットしていない変更を抱えたまま切り替えようとする
git switch main
error: Your local changes to the following files would be overwritten by checkout:
index.php
Please commit your changes or stash them before you switch branches.
私も最初にこのエラーを見たとき、「switchできない=壊れた」と焦ってしまいましたが、これはGitが変更を失わないように守ってくれているメッセージです。
✅ After:先にコミットするか、stashで一時退避してから切り替える
# コミットしてしまう場合
git add .
git commit -m "作業途中だが一旦コミット"
git switch main
# あとで戻したい場合はstashを使う(詳しくは別記事で解説します)
git stash
git switch main
「切り替えられない=作業中の変更をどうするか決めていない」というサインだと理解しておくと、慌てずに対応できます。
detached HEAD状態になってしまう
ブランチ名ではなく、コミットのハッシュ値を直接指定して切り替えると、少し特殊な状態になります。
git switch a1b2c3d
You are in 'detached HEAD' state...
私も最初、このメッセージが出たときに「壊してしまったのでは」と不安になりました。
これは「どのブランチにも属さない、過去のある一点だけを見ている」状態を指すもので、そこでコミットしても、あとでブランチに戻ると変更が見えなくなってしまう可能性があります。
過去のコミット内容を見るだけなら問題ありませんが、そこで作業を続けたい場合は、必ずgit switch -c 新しいブランチ名で新しいブランチを切ってから編集しましょう。
応用・一歩先の使い方
git switch -でひとつ前のブランチに戻る
cd -で直前のディレクトリに戻れるのと同じように、git switch -を使うと、ひとつ前にいたブランチにワンタッチで戻れます。
git switch -
複数のブランチを行き来しながら作業するときに、地味に便利なショートカットです。
リモートブランチとの関係
ここまではローカル内で完結するブランチ操作を扱いましたが、実務ではチームメンバーが作ったリモートのブランチを取得して作業することも多くあります。
その場合のgit fetchやgit pull、リモートブランチの扱い方は、GitHub編でまとめて解説する予定です。
まずはローカルでのブランチ作成・切り替えに慣れておきましょう。
まとめ
この記事のポイント
git branchはブランチの作成・一覧・削除を担当するgit switchはブランチの切り替えに特化したコマンドで、これから学ぶならまずこちらを基本にするgit checkoutは切り替えとファイル復元を兼ねる多機能コマンドで、既存プロジェクトを読むために知っておく- 変更をコミットしていない状態での切り替えはエラーになる(Gitが変更を守ってくれている)
- コミットハッシュを直接指定するとdetached HEAD状態になるので、作業を続けるなら新しいブランチを切る
次に読むべき記事
ブランチを作って作業できるようになったら、次はそのブランチをmainに合流させる「マージ」を学びましょう。
→ 次の記事:git mergeでブランチを合流させる基本
タグ: Git, 初心者向け, ブランチ