Gitで開発を進めていると、機能追加やバグ修正のために複数のブランチを使い分ける場面が頻繁にあります。ブランチとは、メインの開発ラインから分岐した独立した作業領域のことで、ブランチを切り替えることによって異なる作業内容に素早くアクセスできます。
しかし、切り替えに使うコマンドにはgit switchとgit checkoutの2種類があり、どちらを使えばよいのか迷う方も多いです。また、新しいブランチを作成しながら切り替える方法も知っておくと、作業効率が大きく向上します。
この記事では、gitでブランチを切り替える具体的なコマンドと、変更が競合する場合の対処法について解説していきます。
gitでブランチを切り替えるコマンド
gitでブランチを切り替えるには、git switchコマンドまたはgit checkoutコマンドを使用します。git switchはGit 2.23で導入された新しいコマンドで、ブランチ切り替え専用に設計されています。
ブランチの切り替え方法として、以下の3つがあります。
- git switchで切り替える
- git checkoutで切り替える
- ブランチを新規作成して切り替える
それぞれのコマンドには異なる特徴があり、git switchはブランチ操作に特化しているため誤操作のリスクが低く、git checkoutはファイル復元など複数の機能を兼ねています。
それでは各項目について、詳しく解説していきます。
git switchで切り替える
git switchは、Git 2.23以降で使用できるブランチ切り替え専用のコマンドです。git checkoutが持っていた複数の機能を分割する形で導入され、ブランチの切り替え操作だけに特化しています。
git switch ブランチ名
上記のコマンドを実行すると、指定したブランチに作業ディレクトリが切り替わります。たとえば、featureブランチに切り替える場合は以下のように記述します。
git switch feature
切り替えが成功したかどうかは、git branch --show-currentコマンドで現在のブランチ名を確認できます。ターミナルの設定によってはプロンプトにブランチ名が表示される場合もあります。
Git公式ドキュメントでは、git switchの動作について以下のように説明されています。
Switch to a specified branch. The working tree and the index are updated to match the branch. All new commits will be added to the tip of this branch.
出典:Git公式ドキュメント - git-switch
git switchはgit checkoutと比べてファイル復元用途との混同がないため、ブランチ切り替えの意図が明確になりやすいコマンドです。Git 2.23以降の環境であれば、ブランチ切り替えにはgit switchを使用するのが一般的です。
git checkoutで切り替える
git checkoutは、Git 2.23より前から存在する従来のブランチ切り替えコマンドです。現在でも問題なく使用できますが、ブランチ切り替えとファイル復元の両方の機能を持つため、git switchと比べて操作の意図が曖昧になりやすいという特徴があります。
git checkout ブランチ名
たとえば、mainブランチに切り替える場合は以下のように記述します。
git checkout main
git checkoutでもgit switchと同じくブランチの切り替えが実行されます。ただし、git checkoutはブランチ切り替えとファイル復元の両方を担うため、引数の解釈が曖昧になる場合があります。
たとえばdocsという名前のブランチとファイルが両方存在する場合、git checkoutはどちらの操作を意図しているか判別できないことがあります。このような曖昧さを避けるためにも、ブランチ切り替えにはgit switchを使用するのが確実です。
ブランチを新規作成して切り替える
新しいブランチを作成すると同時に、そのブランチに切り替えることもできます。git switchでは-cオプション、git checkoutでは-bオプションを使用します。
# git switchの場合
git switch -c 新しいブランチ名
# git checkoutの場合
git checkout -b 新しいブランチ名
たとえば、hotfixという名前の新しいブランチを作成して切り替える場合は、以下のように記述します。
git switch -c hotfix
上記のコマンドを実行すると、現在のブランチの状態をベースにhotfixブランチが新規作成され、自動的にそのブランチへ切り替わります。Git公式ドキュメントでは、git switch -cについて以下のように説明されています。
Create a new branch named <new-branch> starting at <start-point> before switching to the branch.
出典:Git公式ドキュメント - git-switch
git branchコマンドでブランチを作成してからgit switchで切り替える2段階の操作を、1つのコマンドで完了できるため効率的です。
gitのブランチ切り替えで変更が競合する場合の対処法
gitでブランチを切り替えようとした際に、作業ディレクトリに未コミットの変更がある場合、切り替え先のブランチの内容と衝突するとエラーが発生して切り替えがブロックされます。表示されるメッセージはコマンドや環境によって異なりますが、変更のコミットまたはstashを求められます。
この場合、以下の2つの方法で対処できます。
- git stashで変更を一時退避する
- 変更をコミットしてから切り替える
それぞれの方法には適した場面があり、git stashは作業途中の変更を一時的に保存したい場合に、コミットは区切りのよい変更を確定させたい場合に使用します。
それでは各項目について、詳しく解説していきます。
git stashで変更を一時退避する
git stashは、作業ディレクトリの未コミットの変更を一時的に退避するコマンドです。スタッシュとは「一時保存領域」を意味し、退避した変更は後から復元できるため、作業途中の状態を失わずにブランチを切り替えられます。
なお、git stashはデフォルトでは未追跡ファイル(新規作成したファイル)を退避しません。未追跡ファイルも含めて退避したい場合はgit stash -uを使用してください。
# 変更を一時退避する
git stash
# ブランチを切り替える
git switch feature
# 切り替え先で作業後、元のブランチに戻る
git switch main
# 退避した変更を復元する
git stash pop
上記のコマンドでは、まずgit stashで現在の変更を退避し、ブランチ切り替え後に別ブランチで作業を行い、元のブランチに戻ってからgit stash popで変更を復元しています。git stash popは退避した変更を復元すると同時にスタッシュから削除しますが、復元時にコンフリクトが発生した場合はスタッシュが削除されずに残ります。
復元せずにスタッシュに残しておきたい場合は、git stash applyを使用してください。
変更をコミットしてから切り替える
作業中の変更がある程度まとまっている場合は、コミットしてからブランチを切り替える方法が最もシンプルです。コミットとは、変更内容をGitの履歴として確定させる操作のことで、コミット後は作業ディレクトリがクリーンな状態になるため、未コミットの変更による切り替えブロックを回避できます。
# 変更をステージングする
git add .
# コミットする
git commit -m "作業中の変更を保存"
# ブランチを切り替える
git switch feature
上記のコマンドでは、git addで変更をステージングエリアに追加し、git commitで履歴に記録した後にブランチを切り替えています。ステージングエリアとは、次のコミットに含める変更を選択するための準備領域のことです。
なお、git add .はカレントディレクトリ配下の全変更をステージングするため、意図しないファイルまで含めてしまう場合があります。対象ファイルを明示してgit add ファイル名とする方が安全です。
また、まだ完成していない中途半端な状態でコミットすると、後からコミット履歴が煩雑になる可能性があるため、作業の区切りがよいタイミングでの使用が適しています。
gitのブランチ切り替えに関するよくある質問
git switchとgit checkoutはどちらを使うべきですか?
Git 2.23以降の環境であればgit switchが一般的です。git switchはブランチ操作に用途が絞られているため、ファイル復元との混同が起きません。
| 判断基準 | 使うコマンド |
|---|---|
| Git 2.23以降 | git switch |
| Git 2.23未満 | git checkout |
既存のスクリプトやCI設定でgit checkoutが使われている場合は、無理に書き換える必要はありません。
存在しないブランチに切り替えようとするとどうなりますか?
ローカルに存在しないブランチ名を指定した場合、通常はエラーが表示されて切り替えは実行されません。ただし、リモートに同名ブランチが存在する場合は自動的にローカルブランチが作成されることがあります(詳しくは次の質問を参照してください)。
| 状況 | 結果 |
|---|---|
| ローカル・リモート共になし | エラーで切り替え失敗 |
| リモートに1つだけ存在 | 自動作成して切り替え成功 |
ブランチの一覧を確認するには、ローカルはgit branch、リモートを含む全一覧はgit branch -aを実行してください。
リモートブランチに切り替えるにはどうすればよいですか?
リモートリポジトリにのみ存在するブランチに切り替える場合は、まずgit fetchでリモートの最新情報を取得してからgit switchを実行します。リモートリポジトリとは、GitHubやGitLabなどのサーバー上に配置された共有リポジトリのことです。
git fetch origin
git switch リモートブランチ名
git switchは、ローカルに同名のブランチが存在せず、リモート追跡ブランチが1つのリモートにのみ存在する場合、自動的にローカルブランチを作成して切り替えます。リモート追跡ブランチとは、リモートリポジトリ上のブランチの状態をローカルに記録した参照のことで、origin/mainのような形式で管理されています。
複数のリモートに同名ブランチがある場合はエラーになるため、git switch -c feature origin/featureのように明示的に指定してください。
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
PythonをWebで実行する方法
共通テスト「情報Ⅰ」2年目で変わる、日本の教育と学び方
git cloneでブランチを指定する方法
64GBのメモリが必要な人・不要な人の特徴
PCを再起動するコマンド一覧
CapsLock以外で大文字になる原因【Windows編】
パソコンで大文字になるのを解除する方法
面白いAIの活用事例を業界別に紹介
Gitでcommit(コミット)を取り消す方法
ITやプログラミングに関するニュース
サイボウズがkintone AIを正式提供、β版から約1年を経てクレジット制を導入
ロゼッタのラクヤクAIがCSRドラフト作成期間を90%以上短縮、従来4週間を約2日に
AI CROSSが不動産業界向け生成AI伴走支援を開始、アスコットの業務AI実装を実践サポート
日本情報クリエイトが「オーナー提案AIロボⅡ」売買査定を刷新、月1万円からW査定が回数無制限に
Wur株式会社がAI新規事業診断サービス「MVP事業診断レポート」をリリース、12の質問で事業構想を約10分で分析
バトンズがM&A専門家向け「AI概要書」β版を提供開始、企業概要書のドラフトを最速3分で自動生成
SCSKが観光DXサービス「Connexia」を開発、首里城公園でNFT活用の周遊促進が始動
Verdent AI発表、エンジニア不要でソフトウェアを構築する「AIエンジニアリングチーム」が登場
ゼネラルBREXAテクノロジーが外食・小売向けAIサービス「aimana」を開発、店長の意思決定をデータで支援
田中組がKencopa工程AIエージェント製品版を先行利用開始、建設現場の工程管理属人化を解消へ
