SYNOPSIS
git checkout [-q] [-f] [-m] [<branch>] git checkout [-q] [-f] [-m] --detach [<branch>] git checkout [-q] [-f] [-m] [--detach] <commit> git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new-branch>] [<start-point>] git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <pathspec>… git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] --pathspec-from-file=<file> [--pathspec-file-nul] git checkout (-p|--patch) [<tree-ish>] [--] [<pathspec>…]
DESCRIPTION
作業ツリー内のファイルを、インデックスまたは指定されたツリー内のバージョンと一致するように更新します。 pathspecが指定されていない場合、 git checkout は HEAD も更新して、指定されたブランチを現在のブランチとして設定します。
-
git checkout [<branch>] -
<branch>での作業の準備をするために、インデックスと作業ツリーのファイルを更新し、HEADをブランチに向けることで、<branch>に切り替わります。作業ツリーのファイルに対するローカルな変更は保持され、<branch>にコミットできるようになります。<branch>が見つからないが、一致する名前を持つ1つのリモート(<remote>と呼びます)に追跡ブランチが存在し、` --no-guess` が指定されていない場合は、以下と同等として扱います$ git checkout -b <branch> --track <remote>/<branch>あなたは
<branch>を省略できます。この場合、コマンドは「現在のブランチをチェックアウトする」ことになり、(もし存在すれば)現在のブランチの追跡情報だけを表示するという、かなり高価な副作用のある、見栄えの良いノー・オペレーション(no-op)となります。 -
git checkout -b|-B <new-branch> [<start-point>] -
-bを指定すると、git-branch(1) が呼び出されてチェックアウトされたかのように新しいブランチが作成されます。 この場合、git branchに渡される--trackまたは--no-trackオプションを使用できます。便利にするために-bのない--trackはブランチの作成を意味します。後述の--trackの説明を参照してください。-Bを指定すると、存在しない場合は<new-branch>が作成されます。 それ以外の場合はリセットされます。これは、以下の取引(transaction)と同等です$ git branch -f <branch> [<start-point>] $ git checkout <branch>つまり、
git checkoutが成功しない限り、ブランチは リセット/作成 されません。 -
git checkout --detach [<branch>] -
git checkout [--detach] <commit> -
<commit>の上で作業する準備をします。その上で、HEADを切り離し(「DETACHED HEAD」セクションを参照)、作業ツリーのインデックスとファイルを更新します。 作業ツリー内のファイルへのローカルの変更は保持されるため、結果の作業ツリーは、コミットに記録された状態と、ローカルの変更になります。<commit>引数がブランチ名の場合、--detachオプションを使用して、ブランチの先端にあるHEADをデタッチできます(git checkout <branch>は、HEADをデタッチせずにそのブランチをチェックアウトします)。<branch>を省略すると、現在のブランチの先端にあるHEADが切り離されます。 -
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <pathspec>... -
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] --pathspec-from-file=<file> [--pathspec-file-nul] -
pathspecにマッチするファイルの内容を上書きします。
<tree-ish>(ほとんどの場合コミット)が指定されていない場合は、作業ツリーをインデックスの内容で上書きします。<tree-ish>が指定された場合、インデックスと作業ツリーの両方を<tree-ish>の内容で上書きします。以前にマージに失敗したため、インデックスがマージされていないエントリを含んでいる可能性があります。デフォルトでは、インデックスからそのようなエントリをチェックアウトしようとすると、チェックアウト操作は失敗し、何もチェックアウトされません。
-fを使用すると、これらのマージされていないエントリは無視されます。マージの特定の側からのコンテンツは、--oursまたは--theirsを使用してインデックスからチェックアウトできます。-mを使用すると、作業ツリーファイルに加えられた変更を破棄して、元の競合するマージ結果を再作成できます。 -
git checkout (-p|--patch) [<tree-ish>] [--] [<pathspec>...] -
これは以前のモードと似ていますが、対話的インターフェイスを使用して「diff」出力を表示し、その結果において使用するハンクを選択できます。
--patchオプションの説明については、以下を参照してください。
OPTIONS
-
-q -
--quiet -
静かにします。フィードバックメッセージを抑制します。
-
--progress -
--no-progress -
--quietが指定されていない限り、進行状況は、端末に接続されている場合、デフォルトで標準エラーストリームに報告されます。 このフラグは、--quietに関係なく、端末に接続されていない場合でも進行状況のレポートを有効にします。 -
-f -
--force -
ブランチを切り替えるとき、インデックスや作業ツリーが
HEADと異なっていても、また、邪魔な未追跡のファイルがあっても進行します。 これは、ローカルの変更や、邪魔な未追跡のファイルやディレクトリを捨てるために使用します。インデックスからパスをチェックアウトするときは、マージされていないエントリでエラーにしないでください。代わりに、マージされていないエントリは無視されます。
-
--ours -
--theirs -
インデックスからパスをチェックアウトするときは、ステージ#2(
ours)または#3(theirs)でマージされていないパスをチェックアウトしてください。注意:
git rebaseとgit pull --rebaseでの作業中、「ours」と「theirs」が入れ替わっているように見える場合があることに注意してください。--oursは、変更がリベースされるブランチからのバージョンを提供し、--theirsは、リベースされる作業を保持するブランチからのバージョンを提供します。これは、リモートでの履歴を共有の正規の履歴として扱うワークフローで
rebaseが使用されているためです。リベースするブランチで行われた作業を、統合されるサードパーティの作業として扱います。そして、あなたは一時的にリベース中に正規の歴史の管理者の役割を引き受けています。正規の履歴の管理者として、リモートからの履歴を「私たち」(ours; つまり、「私達の共有された正規の履歴」)として表示する必要があり、サイドブランチで行ったことは「彼ら」(theirs;つまり「その上での貢献者の作品」)として表示する必要があります。 -
-b <new-branch> -
<start-point>から開始する<new-branch>という名前の新しいブランチを作成し、 作成したブランチをチェックアウトします。 詳細については git-branch(1) を参照してください。 -
-B <new-branch> -
ブランチ
<new-branch>を作成し、 そのブランチを<start-point>から開始します。 すでに存在する場合は、 そのブランチを<start-point>に再設定します。 そして、 結果のブランチをチェックアウトします。 これは、-fを伴ってgit branchを実行し、続いてそのブランチに対してgit checkoutを実行するのと同じです。 詳細については、 git-branch(1) を参照してください。 -
-t -
--track[=(direct|inherit)] -
新しいブランチを作成するときは、「アップストリーム構成」(upstream configuration)をセットアップします。 詳細については、 git-branch(1)の
--trackを参照してください。-b`オプションが指定されていない場合、新しいブランチの名前は、対応するリモート用に構成されたrefspecのローカル部分を調べ、最初の部分を `*まで削除することにより、リモート追跡ブランチから派生させます。これにより、origin/hack(またはremotes/origin/hack、 あるいはrefs/remotes/origin/hack) から分岐するときに、ローカルブランチとしてhackを使用するように指示されます。指定された名前にスラッシュ(/)がない場合、または上記の推測の結果が空の名前になる場合、推測は中止されます。このような場合は、-bを使用して明示的に名前を付けることができます。 -
--no-track -
branch.autoSetupMerge構成変数がtrueであっても、「アップストリーム構成」を設定しないでください。 -
--guess -
--no-guess -
`<branch>`が見つからないが、名前が一致する1つのリモート( `<remote>`と呼びます)に追跡ブランチが存在する場合は、以下と同等としてあつかいます
$ git checkout -b <branch> --track <remote>/<branch>ブランチが複数のリモートに存在し、そのうちの1つが
checkout.defaultRemote構成変数で名付けられている場合、<branch>がすべてのリモートで一意でなくても、曖昧さ回避の目的でそのブランチを使用します。例えばcheckout.defaultRemote=originと設定すると、<branch>があいまいだがoriginリモート上に存在する場合、常にそこからリモートブランチをチェックアウトします。 git-config(1) のcheckout.defaultRemoteも参照してください。--guessがデフォルトの振る舞いです。無効にするには、--no-guessを使用します。デフォルトの振る舞いは、
checkout.guess構成変数を介して設定できます。 -
-l -
新しいブランチのreflogを作成します。詳細については、 git-branch(1) を参照してください。
-
-d -
--detach -
ブランチをチェックアウトして作業するのではなく、検査と破棄可能な実験のためのコミットをチェックアウトします。 これは、
<commit>がブランチ名でない場合の、git checkout <commit>のデフォルトの動作です。 詳細については、以下の「DETACHED HEAD」セクションを参照してください。 -
--orphan <new-branch> -
<start-point>から開始された<new-branch>という名前の新しい「孤立した」(orphan) ブランチを作成し、それに切り替えます。 この新しいブランチで行われた最初のコミットには親がなく、他のすべてのブランチとコミットから完全に切断された新しい履歴のルートになります。インデックスと作業ツリーは、以前に
git checkout <start-point>を実行した場合と同じように調整されます。これにより、 ルート(root)をコミットするために容易にgit commit -a実行をでき、<start-point>と同様のパスのセットを記録する新しい履歴を開始できます。これは、ツリーの完全な履歴を公開せずにコミットからツリーを公開する場合に便利です。これは、現在のツリーが「クリーン」であるが、完全な履歴にはプロプライエタリなコードやその他の邪魔なコードが含まれているプロジェクトの、オープンソースブランチを公開するためにこれを行うことができます。
<start-point>のパスとはまったく異なるパスのセットを記録する切断された履歴を開始する場合は、 作業ツリーの最上位からgit rm -rf .を実行して、 孤立したブランチ(orphan branch)を作成した直後にインデックスと作業ツリーをクリアする必要があります。 その後に、 新しいファイルを準備したり、 作業ツリーを再作成したり、 他の場所からファイルをコピーしたり、 tarballを抽出したりする準備が整います。 -
--ignore-skip-worktree-bits -
スパースチェックアウトモード(sparse checkout mode)では、
git checkout -- <paths>は、<paths>と一致するエントリと、$GIT_DIR/info/sparse-checkoutのスパースパターン(sparse patterns)のみを更新します。このオプションは、スパースパターンを無視し、<paths>内のファイルを追加し直します。 -
-m -
--merge -
ブランチを切り替えるときに、現在のブランチと切り替え先のブランチの間で異なる1つ以上のファイルにローカルの変更がある場合、コマンドは、コンテキストでの変更を保持するためにブランチの切り替えを拒否します。ただし、このオプションを使用すると、現在のブランチ、作業ツリーの内容、および新しいブランチの間の3方向のマージを実行してから新しいブランチに移動します。
マージの競合が発生すると、競合するパスのインデックスエントリはマージされないままになります。競合を解決し、解決されたパスを
git add(またはマージによってパスが削除される場合はgit rm)でマークする必要があります。インデックスからパスをチェックアウトする場合、このオプションを使用すると、指定したパスで競合するマージを再作成できます。
--mergeでブランチを切り替えると、ステージされた変更が失われる可能性があります。 -
--conflict=<style> -
上記の
--mergeオプションと同一ですが、競合するハンクの表示方法を変更し、merge.conflictStyle構成変数をオーバーライドします。 可能な値はmerge(デフォルト)とdiff3とzdiff3です。 -
-p -
--patch -
<tree-ish>(または指定されていない場合はインデックス)と作業ツリーの間の差分でハンクを対話的に選択します。選択されたハンクは、作業ツリー(<tree-ish>が指定されている場合はインデックス)に逆に適用されます。これは、
git checkout -pを使用して、現在の作業ツリーから編集を選択的に破棄できることを意味します。--patchモードの操作方法については、 git-add(1) の「Interactive Mode」セクションを参照してください。注意: このオプションはデフォルトでオーバーレイなしモードを使用します(
--overlayも参照)。現在はオーバーレイモードをサポートしていないことに注意してください。 -
--ignore-other-worktrees -
git checkoutは、必要なrefが別のワークツリーによってすでにチェックアウトされている場合に拒否します。このオプションを使用すると、とにかくrefをチェックアウトできます。つまり、refを複数のワークツリーで保持できます。 -
--overwrite-ignore -
--no-overwrite-ignore -
ブランチを切り替えるときに、無視したファイルを黙って上書きします。これがデフォルトの動作です。新しいブランチに無視したファイルが含まれている場合に操作を中止するには、
--no-overwrite-ignoreを使用します。 -
--recurse-submodules -
--no-recurse-submodules -
--recurse-submodulesを使用すると、スーパープロジェクトに記録されたコミットに従って、すべてのアクティブなサブモジュールのコンテンツが更新されます。サブモジュールのローカル変更が上書きされる場合、-fが使用されない限り、チェックアウトは失敗します。何も使用されていない場合(または--no-recurse-submodules)、サブモジュールの作業ツリーは更新されません。 git-submodule(1) と同様に、これはサブモジュールのHEADを切り離します(detach)。 -
--overlay -
--no-overlay -
デフォルトのオーバーレイモードでは、
git checkoutがインデックスまたは作業ツリーからファイルを削除することはありません。--no-overlayを指定すると、インデックスと作業ツリーには表示されるが、<tree-ish>には表示されないファイルが削除され、<tree-ish>と完全に一致するようになります。 -
--pathspec-from-file=<file> -
pathspecは、コマンドライン引数の代わりに
<file>で渡されます。<file>が正確に-の場合、標準入力が使用されます。pathspec要素は、LFまたはCR/LFで区切られます。pathspec要素は、構成変数core.quotePathで説明されているように、クォートできます(git-config(1) 参照)。--pathspec-file-nulおよび グローバル--literal-pathspecsも参照してください。 -
--pathspec-file-nul -
`--pathspec-from-file`でのみ意味があります。Pathspec要素はNUL文字で区切られ、他のすべての文字は文字通りに解釈されます(改行と引用符を含む)。
- <branch>
-
チェックアウトするブランチ。もしそれがブランチ(つまり、
refs/heads/を前につけたとき、有効なrefである名前)を参照しているなら、そのブランチはチェックアウトされます。そうでない場合、もしそれが有効なコミットを参照していれば、あなたのHEADは "detached" となり、あなたはもはやどのブランチにもいません(詳しくは以下を参照してください)。@{-N}構文を使用して、git checkout `操作を使用してチェックアウトされた最後からN番目ブランチ/コミットを参照できます。 `@{-1}と同義の-を指定することもできます。特殊なケースとして、マージベースが1つしかない場合は、
AとBのマージベースのショートカットとしてA...Bを使用できます。 最大でAとBのどちらかを省略できます。その場合、デフォルトでHEADになります。 - <new-branch>
-
新しいブランチの名前。
- <start-point>
-
新しいブランチを開始するコミットの名前。詳細については、 git-branch(1) を参照してください。デフォルトは
HEADです。特殊なケースとして、マージベースが1つしかない場合は、
AとBのマージベースのショートカットとしてA...Bを使用できます。 最大でAとBのどちらかを省略できます。その場合、デフォルトでHEADになります。 - <tree-ish>
-
チェックアウト元のツリー(パスが指定されている場合)。指定しない場合はインデックスが使用されます。
特殊なケースとして、マージベースが1つしかない場合は、
AとBのマージベースのショートカットとしてA...Bを使用できます。 最大でAとBのどちらかを省略できます。その場合、デフォルトでHEADになります。 -
-- -
これ以降の引数をオプションとして解釈しないでください。
- <pathspec>…
-
操作の影響を受けるパスを制限します。
詳細については、 gitglossary(7) の「pathspec」エントリを参照してください。
DETACHED HEAD
HEAD は通常、名前付きブランチ(master など)を指します。一方、各ブランチは特定のコミットを参照します。3つのコミットがあり、そのうちの1つがタグ付けされており、ブランチ`master` がチェックアウトされているリポジトリを見てみましょう:
HEAD (refers to branch 'master')
|
v
a---b---c branch 'master' (refers to commit 'c')
^
|
tag 'v2.0' (refers to commit 'b')
この状態でコミットが作成されると、新しいコミットを参照するようにブランチが更新されます。 具体的には、 git commit は、親がコミット c である新しいコミット d を作成し、ブランチ master を更新して新しい コミット d を参照します。 HEAD はまだブランチ master を参照しているので、間接的に コミット d を参照するようになりました:
$ edit; git add; git commit
HEAD (refers to branch 'master')
|
v
a---b---c---d branch 'master' (refers to commit 'd')
^
|
tag 'v2.0' (refers to commit 'b')
名前付きブランチの先端にないコミットをチェックアウトしたり、名前付きブランチによって参照されていない新しいコミットを作成したりできると便利な場合があります。 コミット b をチェックアウトするとどうなるか見てみましょう(ここでは、これを行う2つの方法を示します):
$ git checkout v2.0 # or
$ git checkout master^^
HEAD (refers to commit 'b')
|
v
a---b---c---d branch 'master' (refers to commit 'd')
^
|
tag 'v2.0' (refers to commit 'b')
使用するcheckoutコマンドに関係なく、 HEAD はコミット b を直接参照するようになりました。 これは、切り離された HEAD (detached HEAD)状態にあることとして知られています。これは、名前付きブランチを参照するのではなく、単に HEAD が特定のコミットを参照することを意味します。この状態でコミットを作成するとどうなるか見てみましょう:
$ edit; git add; git commit
HEAD (refers to commit 'e')
|
v
e
/
a---b---c---d branch 'master' (refers to commit 'd')
^
|
tag 'v2.0' (refers to commit 'b')
新しいコミット e がありますが、これは HEAD によってのみ参照されます。 もちろん、この状態でさらに別のコミットを追加できます:
$ edit; git add; git commit
HEAD (refers to commit 'f')
|
v
e---f
/
a---b---c---d branch 'master' (refers to commit 'd')
^
|
tag 'v2.0' (refers to commit 'b')
実際、私達は通常のGit操作はすべて実行できます。 しかし、ここで私達が master をチェックアウトするとどうなるか見てみましょう:
$ git checkout master
HEAD (refers to branch 'master')
e---f |
/ v
a---b---c---d branch 'master' (refers to commit 'd')
^
|
tag 'v2.0' (refers to commit 'b')
この時点で、コミット f を指しているものは何もないことを理解することが重要です。最終的に、コミット f (および拡張によりコミット e )は、あなたがルーチンのGitガベージコレクションプロセス前に参照を作成しない限り、ルーチンのGitガベージコレクションプロセスによって削除されます。あなたが、まだコミット`f`から離れていない場合、以下のいずれかがそれへの参照を作成します:
$ git checkout -b foo # or "git switch -c foo" <1>
$ git branch foo <2>
$ git tag foo <3>
-
コミット
fを参照する新しいブランチfooを作成し、次にブランチfooを参照するように`HEAD`を更新します。つまり、このコマンドを実行すると、もはや切り離された`HEAD` (detached HEAD)状態では無くなります。 -
同様に、コミット
fを参照する新しいブランチfooを作成しますが、HEADは切り離されたままにします。 -
新しいタグ
fooを作成します。これは、HEADを切り離したままコミットfを参照します。
私達がうっかり f から離れてしまった場合は、最初にそのオブジェクト名を回復する必要があり(通常は git reflog を使用)、次にそれへの参照を作成できます。 たとえば、 HEAD が参照した最後の2つのコミットを確認するには、以下のいずれかのコマンドを使用できます:
$ git reflog -2 HEAD # or
$ git log -g -2 HEAD
ARGUMENT DISAMBIGUATION(引数の曖昧性解消)
与えられた引数が1つだけで、それが -- ではない場合(例: git checkout abc)や、引数が有効な <tree-ish> (例:ブランチ abc が存在する)や、有効な <pathspec> (たとえば、 "abc" という名前のファイルまたはディレクトリが存在する)な場合、Gitは通常、明確にするように求めます。ただし、ブランチのチェックアウトは非常に一般的な操作であるため、このような状況では、 git checkout abc は "abc" を <tree-ish> と見なします。これらのパスをインデックスからチェックアウトする場合は、 git checkout -- <pathspec> を使用します。
EXAMPLES
1. Paths
以下のシーケンスは、 master ブランチをチェックアウトし、 Makefile のリビジョンを2つ戻し、誤って hello.c を削除したので、 hello.c をインデックスから取得します。
$ git checkout master <1>
$ git checkout master~2 Makefile <2>
$ rm -f hello.c
$ git checkout hello.c <3>
-
ブランチを切り替えます
-
別のコミットからファイルを取り出します
-
インデックスから
hello.cを復元します
あなたがインデックスから「すべての」Cソースファイルをチェックアウトしたい場合は、以下のように言うことができます
$ git checkout -- '*.c'
*.c を囲む引用符に注意してください。 ファイル hello.c も、作業ツリーに存在していなくてもチェックアウトされます。これは、(引用符で囲む事で作業ツリーに対してシェル展開するのではなくて)ファイルグロブがインデックスのエントリを照合するために使用されるためです。
hello.c という名前の不幸なブランチがある場合、このステップはそのブランチに切り替えるための指示として混乱を産みます。あなたは代わりに以下のように書く必要があります。
$ git checkout -- hello.c
2. Merge
間違ったブランチで作業した後、正しいブランチへの切り替えは以下を使用して行います:
$ git checkout mytopic
ただし、あなたの「間違った」ブランチと正しい mytopic ブランチは、ローカルで変更したファイルで異なる場合があります。その場合、上記のチェックアウトは以下のように失敗します:
$ git checkout mytopic
error: You have local changes to 'frotz'; not switching branches.
コマンドに -m フラグを指定すると、3方向のマージを試みます:
$ git checkout -m mytopic
Auto-merging frotz
この3方向マージの後、ローカルの変更はインデックスファイルに登録されないため、 git diff は、新しいブランチの先端以降に行った変更を表示します。
3. Merge conflict
-m オプションを使用してブランチを切り替えるときにマージの競合が発生すると、以下のように表示されます:
$ git checkout -m mytopic
Auto-merging frotz
ERROR: Merge conflict in frotz
fatal: merge program failed
この時点で、 git diff は、前の例のようにきれいにマージされた変更と、競合するファイルの変更を示しています。 競合を編集して解決し、通常どおり git add で解決済みのマークを付けます。
$ edit frotz
$ git add frotz
CONFIGURATION
このセクションの以下のすべては、 git-config(1) ドキュメントの抜粋です。 内容は git-config(1) ドキュメント にあるものと同一です:
- checkout.defaultRemote
-
git checkout <something>またはgit switch <something>を実行し、リモートが1つしかない場合、origin/<something>のチェックアウトと追跡に暗黙的にフォールバックする可能性があります。<something>参照を持つリモートが複数あるとすぐに動作しなくなります。 この設定により、曖昧性解消に関して常に勝利させる優先リモートの名前を設定できます。 典型的なユースケースは、これをoriginに設定することです。現在、これは git-switch(1) と git-checkout(1) によって、
git checkout <something>やgit switch <something>が別のリモート上の<something>ブランチをチェックアウトするときに使われています。また git-worktree(1) はgit worktree addがリモートブランチを参照しているときに使われています。 この設定は、将来、他のチェックアウトのようなコマンドまたは機能に使用される可能性があります。 - checkout.guess
-
git checkoutとgit 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です。
SEE ALSO
GIT
Part of the git(1) suite