はじめに
Git を使っていると、ブランチを切り替えるときに git checkout と git switch のどちらを使えばいいのか迷うことがあります。両方とも動くのですが、なぜ2つあるのか、どう使い分ければいいのかを整理しておきたいと思います。
なぜ checkout と switch の2つがあるのか
git checkout はもともと1つのコマンドで複数の役割を担っていました。
- ブランチを切り替える
- ファイルの変更を破棄して元に戻す
- 特定のコミットを見に行く(detached HEAD)
「ブランチの操作」と「ファイルの操作」という性質の違う仕事が1つのコマンドに同居していて、特に Git を触り始めた人には分かりにくい状態でした。
そこで Git 2.23(2019年)で、この責務を2つに分けたコマンドが導入されました。
switch はブランチの切り替え、restore はファイルの復元を担当します。名前を見ればどちらの操作か分かるので、意図が明確になります。
checkout と switch / restore の対応表
普段よく使う操作の対応関係は以下のとおりです。
| やりたいこと | 旧(checkout) | 新(switch / restore) |
|---|---|---|
| ブランチを切り替える | git checkout main |
git switch main |
| ブランチを新規作成して切り替える | git checkout -b feature |
git switch -c feature |
| 直前にいたブランチに戻る | git checkout - |
git switch - |
| ファイルの変更を破棄する | git checkout -- file.txt |
git restore file.txt |
| 特定コミットを見る(detached HEAD) | git checkout <commit> |
git switch --detach <commit> |
新規ブランチ作成のフラグが -b から -c(create)に変わっている点だけ注意が必要です。
使い分けの考え方
switch / restore
役割が名前から分かるので、コマンドの意図が読み取りやすくなります。特に効いてくるのがファイルの破棄です。
# ❌ Before: ブランチ切り替えと同じコマンドなので事故りやすい
git checkout -- file.txt
# ✅ After: 「復元」だと名前で分かる
git restore file.txt
git checkout -- file.txt は変更を破棄する破壊的な操作ですが、ブランチ切り替えと同じ checkout なので、-- を忘れるなどしたときに意図しない挙動になりやすい部分でした。restore に分かれていることで、何をする操作なのかがはっきりします。
また git switch はデフォルトでは detached HEAD にならないので、ブランチ名のつもりでコミットを指定してしまう事故も起きにくくなっています。
checkout
git switch / git restore が導入されても、git checkout は非推奨(deprecated)にはなっていません。今も普通に使えますし、既存の資料やチームの手順書、他の人のコマンド履歴では checkout がまだ多く使われています。自分で新しく書くときは switch / restore、読むときは両方分かる、という状態にしておくと安心です。
git switch と git restore は導入当初 experimental(実験的)扱いでしたが、Git 2.51(2025年8月)で experimental ラベルが外れ、正式に安定したコマンドになりました。インターフェースが将来にわたって互換性を保つことが保証されたので、安心して使えます。
まとめ
この記事では git checkout と git switch の違いと使い分けをまとめました。
-
git checkoutは「ブランチ操作」と「ファイル操作」を1つで担っていて分かりにくかった - Git 2.23 でその責務を
git switch(ブランチ)とgit restore(ファイル)に分割した