ブランチと切り替え — Git Tips
コミット履歴は1本だけではありません。枝を増やして並行に進める単位が ブランチ です。作成・一覧は git branch、移動は git switch です。
参考(公式)
目次
- ブランチが必要な理由
- git branch でブランチの一覧と作成
- git switch で切り替える
- 古い書き方 git checkout との関係
- 不要になったブランチを削除する
- detached HEAD に軽く触れる
- 詰まりやすい点
ブランチが必要な理由
ブランチを使わずに 1 本の履歴だけで作業すると、次のような場面で困ります。
- 新しい機能を試したいが、動くコードを壊したくない
- 2 つの作業(バグ修正と新機能)を同時に進めたいが、混ぜたくない
- 試した内容がうまくいかなかったとき、簡単に元の状態へ戻したい
ブランチは、今のコミットから 新しい枝を伸ばし、その枝の上だけで自由に commit を重ねられる仕組みです。ブランチを切り替えると、作業ツリーの内容もそのブランチの状態に合わせて変わります。
main: A---B---C \feature: D---Emain を触らず feature だけで進め、あとで main に merge する、という使い方が一般的です。作成・切り替え・削除はこの記事の範囲、合流の手順は merge のトピックに任せます。
Git のブランチは、実体としては「あるコミットを指す軽いポインタ」でしかないため、作成も切り替えも高速です。ファイルをコピーして別フォルダを作るような重い操作ではありません。
git branch でブランチの一覧と作成
今あるブランチを一覧表示するには、オプション無しで実行します。
git branch期待する出力(例)
* main* が付いている行が、現在チェックアウトしている(今いる)ブランチです。
新しいブランチを作る(作るだけで、移動はしない)場合は名前を指定します。
git branch feature-logingit branch feature-login* mainfeature-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 mainmain に戻ると、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 a1b2c3dNote: 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 checkout と git switch のどちらを使えばいいか迷う
新しく覚えるなら git switch(ブランチの切り替え)と git restore(ファイルの復元)を使い分ける方が、コマンド名から役割が分かりやすいです。既存の手順書や他の人のメモで git checkout を見かけても、古い書き方 git checkout との関係 の対応表を思い出せば読み替えられます。