Git/GitHub

ブランチと切り替え

8

ブランチと切り替え — Git Tips

コミット履歴は1本だけではありません。枝を増やして並行に進める単位が ブランチ です。作成・一覧は git branch、移動は git switch です。

参考(公式)


目次

  1. ブランチが必要な理由
  2. git branch でブランチの一覧と作成
  3. git switch で切り替える
  4. 古い書き方 git checkout との関係
  5. 不要になったブランチを削除する
  6. detached HEAD に軽く触れる
  7. 詰まりやすい点

ブランチが必要な理由

ブランチを使わずに 1 本の履歴だけで作業すると、次のような場面で困ります。

  • 新しい機能を試したいが、動くコードを壊したくない
  • 2 つの作業(バグ修正と新機能)を同時に進めたいが、混ぜたくない
  • 試した内容がうまくいかなかったとき、簡単に元の状態へ戻したい

ブランチは、今のコミットから 新しい枝を伸ばし、その枝の上だけで自由に commit を重ねられる仕組みです。ブランチを切り替えると、作業ツリーの内容もそのブランチの状態に合わせて変わります。

main:     A---B---C                    \feature:             D---E

main を触らず feature だけで進め、あとで main に merge する、という使い方が一般的です。作成・切り替え・削除はこの記事の範囲、合流の手順は merge のトピックに任せます。

Git のブランチは、実体としては「あるコミットを指す軽いポインタ」でしかないため、作成も切り替えも高速です。ファイルをコピーして別フォルダを作るような重い操作ではありません。


git branch でブランチの一覧と作成

今あるブランチを一覧表示するには、オプション無しで実行します。

git branch

期待する出力(例)

* main

* が付いている行が、現在チェックアウトしている(今いる)ブランチです。

新しいブランチを作る(作るだけで、移動はしない)場合は名前を指定します。

git branch feature-logingit branch
  feature-login* main

feature-login が作られましたが、* はまだ main に付いているため、作業ツリーはまだ切り替わっていません。ブランチを作ってすぐに移動したい場合は、次の git switch で切り替える-c オプションを使う方が手数が少なく済みます。

コマンド 内容
git branch ブランチの一覧を表示
git branch <名前> 新しいブランチを作成(移動はしない)
git branch -v 各ブランチの最新 commit も一緒に表示
git branch -d <名前> 合流済みのブランチを削除

git switch で切り替える

ブランチを移動するには git switch を使います。現在の Git ではこちらが推奨されるコマンドです。

git switch main

新しいブランチを作りながら、そのまま移動する(実務でよく使う書き方)には -c(create の意味)を付けます。

git switch -c feature-login

期待する出力(例)

Switched to a new branch 'feature-login'

このブランチの上でファイルを編集・commit していきます。

echo "ログイン画面を仮実装" > login.mdgit add login.mdgit commit -m "ログイン画面の下書きを追加"

元のブランチに戻るときは、名前を指定して switch するだけです。

git switch main

main に戻ると、login.md は作業ツリーから見えなくなります(消えたわけではなく、feature-login ブランチの中に記録されたままです)。もう一度 git switch feature-login すれば元通り見えるようになります。

コマンド 効果
git switch <ブランチ名> 既存のブランチに切り替える
git switch -c <新しい名前> 新しいブランチを作って、そのまま切り替える
git switch - 直前にいたブランチへ戻る

古い書き方 git checkout との関係

git switch は比較的新しいコマンド(Git 2.23 以降)で、それ以前は git checkout がブランチの切り替えとファイルの復元という 2 つの役割を同時に担っていました。

# 古い書き方(今でも動く)git checkout maingit checkout -b feature-login
目的 新しい書き方 古い書き方
ブランチを切り替える git switch <名前> git checkout <名前>
新しいブランチを作って切り替える git switch -c <名前> git checkout -b <名前>

git checkout は今でも広く使われており、既存のスクリプトやドキュメントで頻繁に見かけます。意味は理解しておく価値がありますが、これから新しく覚えるなら git switch(ブランチ操作)と git restore(ファイルの復元)に役割が分かれた書き方 の方が、コマンド名から目的が読み取りやすく紛れが少ないです。


不要になったブランチを削除する

作業が終わり、main に合流済みのブランチは削除して整理できます。

git branch -d feature-login

期待する出力(例)

Deleted branch feature-login (was a1b2c3d).

-d(小文字)は 安全な削除で、そのブランチの内容がどこか(多くは合流先のブランチ)に取り込まれていない場合は削除を拒否してくれます。

error: The branch 'feature-login' is not fully merged.

このメッセージが出た場合、まだ取り込まれていない commit がそのブランチにしか無い可能性があります。本当に不要であることを確認した上で、大文字の -D を使えば強制的に削除できますが、確認したうえで使うことを推奨します。

git branch -D feature-login

現在チェックアウトしているブランチ自身は削除できません。削除する前に、必ず別のブランチへ git switch してください。


detached HEAD に軽く触れる

ブランチ名ではなく、特定の commit のハッシュを直接指定して移動すると、detached HEAD(切り離された HEAD)という状態になります。ただし git switch は安全のため、既定ではコミットへの直接切り替えを拒否します。detached HEAD にするには --detach を明示します(git checkout <ハッシュ> なら --detach なしでも同状態になります)。

git switch --detach a1b2c3d# またはgit checkout a1b2c3d
Note: switching to 'a1b2c3d'.You are in 'detached HEAD' state...

--detach なしで git switch a1b2c3d を実行すると、fatal: a branch is expected, got commit '...' で止まります。

この状態では、どのブランチにも属さずに過去の commit を眺めている状態になります。ファイルの内容を確認するだけなら問題ありませんが、この状態のまま commit すると、どのブランチからも参照されない孤立した commit を作ってしまうことがあります。あとで別のブランチに切り替えると、その commit を見失いやすくなります。

過去の状態を確認したいだけなら detached HEAD のままでも構いませんが、そこから作業を続けたい場合は、新しいブランチを作ってから進めるのが安全です。

git switch -c fix-from-old-commit

これで、その時点の commit を起点にした新しいブランチとして安全に作業を続けられます。


詰まりやすい点

error: pathspec '<名前>' did not match any file(s) known to git

ブランチ名を間違えているか、そのブランチがまだ存在していません。git branch で正確な名前を確認してください。

error: Your local changes to the following files would be overwritten by checkout

切り替え先のブランチと衝突する未 commit の変更が作業ツリーに残っています。commit してから切り替える、または変更を諦めてよいなら git restore <ファイル名> で戻してから切り替えます。

ブランチを削除できない(is not fully merged

不要になったブランチを削除する の通り、まだ取り込まれていない内容がある可能性があります。本当に不要か確認してから -D を使ってください。

detached HEAD の警告が出て焦った

detached HEAD に軽く触れる の通り、これはエラーではなく状態の通知です。作業を続けたいなら git switch -c <新しい名前> で普通のブランチに移してから進めれば問題ありません。元のブランチに戻るだけなら git switch main などで通常の状態に戻れます。

git checkoutgit switch のどちらを使えばいいか迷う

新しく覚えるなら git switch(ブランチの切り替え)と git restore(ファイルの復元)を使い分ける方が、コマンド名から役割が分かりやすいです。既存の手順書や他の人のメモで git checkout を見かけても、古い書き方 git checkout との関係 の対応表を思い出せば読み替えられます。

シェア