Git
英語 ▾ トピック ▾ 最新バージョン ▾ git-switch は 2.44.0 で最後に更新されました

名前

git-switch - ブランチを切り替える

概要

git switch [<options>] [--no-guess] <branch>
git switch [<options>] --detach [<start-point>]
git switch [<options>] (-c|-C) <new-branch> [<start-point>]
git switch [<options>] --orphan <new-branch>

説明

指定されたブランチに切り替えます。作業ツリーとインデックスはブランチに一致するように更新されます。すべての新しいコミットはこのブランチの先頭に追加されます。

オプションで、-c-Cを使用して新しいブランチを作成したり、同じ名前のリモートブランチから自動的に作成したり(--guessを参照)、--detachを使用して作業ツリーを任意のブランチから切り離したり、切り替えと同時に実行できます。

ブランチの切り替えには、クリーンなインデックスと作業ツリー(つまり、HEADとの違いがない)は必要ありません。ただし、--discard-changesまたは--mergeで指示されない限り、操作によってローカルの変更が失われる場合は、操作は中止されます。

このコマンドは実験的です。動作が変更される可能性があります。

オプション

<branch>

切り替えるブランチ。

<new-branch>

新しいブランチの名前。

<start-point>

新しいブランチの開始点。<start-point>を指定すると、現在のHEADが指している場所とは異なる履歴上の他の場所に基づいてブランチを作成できます。(または、--detachの場合、他の場所を検査して切り離すことができます。)

「git switch」または「git checkout」操作を使用して切り替えた最後のN番目のブランチ/コミットを参照するには、@{-N}構文を使用できます。「-」は@{-1}と同義です。これは、2つのブランチ間をすばやく切り替えたり、誤ってブランチの切り替えを元に戻したりするのによく使用されます。

特殊なケースとして、マージベースが正確に1つ存在する場合は、A...BABのマージベースのショートカットとして使用できます。ABのいずれか、または両方省略できます。その場合、デフォルトでHEADになります。

-c <new-branch>
--create <new-branch>

ブランチに切り替える前に、<start-point>から始まる<new-branch>という名前の新しいブランチを作成します。これは、以下のトランザクションと同等です。

$ git branch <new-branch>
$ git switch <new-branch>

つまり、ブランチは「git switch」が成功するまでリセット/作成されません(たとえば、ブランチが別のワークツリーで使用されている場合、現在のブランチは同じままですが、ブランチも開始点にリセットされません)。

-C <new-branch>
--force-create <new-branch>

--createに似ていますが、<new-branch>が既に存在する場合は、<start-point>にリセットされます。これは、以下の便利なショートカットです。

$ git branch -f <new-branch>
$ git switch <new-branch>
-d
--detach

検査と破棄可能な実験のためにコミットに切り替えます。git-checkout[1]の「DETACHED HEAD」セクションで詳細を確認してください。

--guess
--no-guess

<branch>が見つからないが、正確に1つのリモート(<remote>と呼びます)に一致する名前の追跡ブランチが存在する場合は、以下と同等に扱います。

$ git switch -c <branch> --track <remote>/<branch>

ブランチが複数のリモートに存在し、そのうちの1つがcheckout.defaultRemote構成変数で指定されている場合は、すべてのリモートで<branch>が一意でない場合でも、あいまいさを解消するためにそのリモートを使用します。たとえば、checkout.defaultRemote=originに設定すると、<branch>があいまいだがoriginリモートに存在する場合は、常にそこからリモートブランチをチェックアウトします。git-config[1]checkout.defaultRemoteも参照してください。

--guessはデフォルトの動作です。無効にするには--no-guessを使用します。

デフォルトの動作は、checkout.guess構成変数で設定できます。

-f
--force

--discard-changesのエイリアス。

--discard-changes

インデックスまたは作業ツリーがHEADと異なる場合でも続行します。インデックスと作業ツリーの両方が、切り替え先のターゲットと一致するように復元されます。--recurse-submodulesが指定されている場合、サブモジュールのコンテンツも切り替え先のターゲットと一致するように復元されます。これは、ローカルの変更を破棄するために使用されます。

-m
--merge

現在のブランチと切り替えるブランチの間で異なるファイルにローカルな変更がある場合、変更をコンテキストで維持するために、コマンドはブランチの切り替えを拒否します。ただし、このオプションを使用すると、現在のブランチ、作業ツリーの内容、新しいブランチ間の3方マージが行われ、新しいブランチに移動します。

マージの競合が発生すると、競合するパスのインデックスエントリはマージされずに残され、競合を解決し、git add(またはマージの結果としてパスが削除される場合はgit rm)を使用して解決されたパスをマークする必要があります。

--conflict=<style>

上記の--mergeオプションと同じですが、merge.conflictStyle構成変数をオーバーライドして、競合するハンクの表示方法を変更します。可能な値は「merge」(デフォルト)、「diff3」、および「zdiff3」です。

-q
--quiet

静か、フィードバックメッセージを抑制します。

--progress
--no-progress

--quietが指定されていない限り、ターミナルに接続されている場合、標準エラーストリームに進行状況の状態がデフォルトで報告されます。このフラグは、ターミナルに接続されていない場合でも、--quietに関係なく、進行状況の報告を有効にします。

-t
--track [direct|inherit]

新しいブランチを作成するときに、「upstream」構成を設定します。-cが暗黙的に指定されます。git-branch[1]--trackで詳細を確認してください。

-cオプションが指定されていない場合、新しいブランチの名前は、対応するリモートに設定されているrefspecのローカル部分を見て、先頭の「*」までの部分を削除することで、リモート追跡ブランチから導出されます。これにより、origin/hack(またはremotes/origin/hack、あるいはrefs/remotes/origin/hack)から分岐する場合に、ローカルブランチとしてhackを使用することがわかります。指定された名前にスラッシュがない場合、または上記の推測の結果名前が空になる場合は、推測は中止されます。そのような場合は、-cで明示的に名前を指定できます。

--no-track

branch.autoSetupMerge構成変数がtrueの場合でも、「upstream」構成を設定しません。

--orphan <new-branch>

<new-branch>という名前の新しい未作成ブランチを作成します。追跡されているすべてのファイルが削除されます。

--ignore-other-worktrees

目的のrefが別のワークツリーで既にチェックアウトされている場合、git switchは拒否します。このオプションを使用すると、とにかくrefをチェックアウトできます。つまり、複数のワークツリーでrefを保持できます。

--recurse-submodules
--no-recurse-submodules

--recurse-submodulesを使用すると、スーパープロジェクトに記録されているコミットに従って、アクティブなすべてのサブモジュールのコンテンツが更新されます。何も使用しない(または--no-recurse-submodulesを使用しない)場合、サブモジュールの作業ツリーは更新されません。git-submodule[1]と同様に、これによりサブモジュールのHEADが切り離されます。

次のコマンドは、「master」ブランチに切り替えます。

$ git switch master

間違ったブランチで作業した後、正しいブランチに切り替えるには、以下を使用します。

$ git switch mytopic

ただし、「間違った」ブランチと正しい「mytopic」ブランチは、ローカルで変更したファイルが異なる場合があり、その場合、上記の切り替えは次のように失敗します。

$ git switch mytopic
error: You have local changes to 'frotz'; not switching branches.

コマンドに-mフラグを指定すると、3方マージが試行されます。

$ git switch -m mytopic
Auto-merging frotz

この3方マージの後、ローカルの変更はインデックスファイルに登録されません。そのため、git diffを使用すると、新しいブランチの先頭以降に行った変更が表示されます。

mytopicに切り替える前(つまり「master」ブランチ)の前のブランチに戻るには

$ git switch -

任意のコミットから新しいブランチを成長させることができます。たとえば、「HEAD~3」に切り替え、「fixup」ブランチを作成します。

$ git switch -c fixup HEAD~3
Switched to a new branch 'fixup'

同名のリモートブランチから新しいブランチを作成する場合

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'

新しいブランチを作成せずに、一時的な検査や実験のためにコミットHEAD~3をチェックアウトする場合

$ git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'

行った変更が保存する価値があると判断した場合、いつでも新しい名前を作成できます(ブランチを切り替える必要はありません)。

$ git switch -c good-surprises

設定

このセクションのこの行以下の内容は、git-config[1]ドキュメントから選択的に含まれています。内容はそちらにあるものと同じです。

checkout.defaultRemote

git checkout <something>またはgit switch <something>を実行し、リモートが1つしかない場合、暗黙的にorigin/<something>などのチェックアウトとトラッキングにフォールバックすることがあります。これは、<something>参照を持つリモートが2つ以上になると機能しなくなります。この設定により、あいまいさを解消する際に常に優先されるリモートの名前を設定できます。一般的なユースケースとしては、これをoriginに設定することです。

現在、これはgit checkout <something>またはgit switch <something>が別のリモート上の<something>ブランチをチェックアウトする場合のgit-switch[1]git-checkout[1]、そしてgit worktree addがリモートブランチを参照する場合のgit-worktree[1]で使用されています。この設定は、将来的に他のチェックアウトのようなコマンドや機能で使用される可能性があります。

checkout.guess

git checkoutgit switch--guessまたは--no-guessオプションのデフォルト値を提供します。git-switch[1]git-checkout[1]を参照してください。

checkout.workers

作業ツリーの更新時に使用する並列ワーカーの数です。デフォルトは1、つまりシーケンシャル実行です。1未満の値に設定すると、Gitは使用可能な論理コア数と同じ数のワーカーを使用します。この設定とcheckout.thresholdForParallelismは、チェックアウトを実行するすべてのコマンドに影響します。例:checkout、clone、reset、sparse-checkoutなど。

注:並列チェックアウトは、SSD上またはNFS経由のリポジトリで通常はより優れたパフォーマンスを提供します。回転ディスク上またはコア数の少ないマシン上のリポジトリの場合、デフォルトのシーケンシャルチェックアウトの方がパフォーマンスが優れていることがよくあります。リポジトリのサイズと圧縮レベルも、並列バージョンのパフォーマンスに影響を与える可能性があります。

checkout.thresholdForParallelism

少量のファイルで並列チェックアウトを実行する場合、サブプロセスの生成とプロセス間通信のコストが並列化による利点を上回る可能性があります。この設定により、並列チェックアウトを試行するファイルの最小数を定義できます。デフォルトは100です。

Git

git[1]スイートの一部

scroll-to-top