私のgitリポジトリには、xyzという名前のファイルがあります。偶然にも、私はxyzという名前のブランチも持っています。現在、私はマスターですが、xyzブランチにチェックアウトします。使用するコマンドは簡単です
$ git checkout xyz
しかし、これはファイルxyz
を現在のヘッドにチェックアウトします。ブランチをブランチxyz
に変更するにはどうすればよいですか?
commit a047faf (git 1.8.4.3+)で示されているように、次のことも試すことができます。
git checkout xyz --
(注: エラーメッセージは、Git 2.21、2019年第1四半期でより明確になります )
これは、xyz
部分がブランチまたはコミットであることを明確にしますが、--
の後のすべてはパスでなければなりません(ここではパスは提供されていません)。二重ハイフン規則については、ここ を参照してください 。
「--
」なしで試した場合、「 」のように機能する場合と機能しない場合があります。なぜgit checkout <remote_branchname>
が新しい追跡ブランチを作成しないのですか? ":
git checkout name
は:
- ローカルブランチまたは明示的なリモートブランチの場合は、それに切り替えます。
- 追跡されたパスの場合はリセットする
- リモートブランチの場合は、トラッキングブランチを作成して、それに切り替えます。
そして、その動作は常に同じではありません。したがって、 '--
'は明確な明確化を提供します。
VonCのソリューションは機能しますが、構文を覚えることはできないため、通常はよりローテクなソリューションを使用します。
$ (cd somedir && git checkout my-branch)
または、サブディレクトリがない場合:
$ (cd .git && git -C .. checkout my-branch)
覚えやすく、うまくいきます;-)
Git 2.21(2019年第1四半期、4年以上後)はエラーメッセージを明確にし、提案します
"_git checkout frotz
_"( 最初に提案した二重ダッシュなし )は、 'frotz
'がリビジョンとして、また、同時にパス。
この安全性は、リモートからリモートトラッキングブランチ 'frotz
'からローカルブランチ 'frotz
'を作成するために dwimming を作成するときに、リモートで一意のリモートトラッキングブランチ 'frotz
'もチェックするように更新されました。
注: "dwim"(以下で使用)は "意味"です 、コンピューターシステムがユーザーの意図を予測しようとするとき、ユーザーの明示的ではあるが潜在的に不正確な可能性のある実行ではなく、些細なエラーを自動的に修正します入力。
NguyễnTháiNgọcDuy(pclouds
) による commit be4908f (2018年11月13日)を参照してください。
( Junio C Hamano-gitster
- in commit 8d7f9db によってマージされ、2019年1月4日)
checkout
:dwimトラッキングブランチとローカルファイルを明確にするチェックアウトdwimが commit 70c9ac2 に追加されると、特定の条件が満たされた場合にのみdwimに制限され、それ以外の場合はデフォルトのチェックアウト動作にフォールバックします。
フォールバックは混乱を招く可能性があることがわかりました。
曲がる条件の一つ
_git checkout frotz
_に
_git checkout -b frotz Origin/frotz
_
frotz
がファイルとして存在していてはいけないということです。しかし、ユーザーが "_
git checkout frotz
_"がブランチ "frotz
"を作成することを期待し、 "frotz
"という名前のファイルが存在する場合、gitはサイレントに "frotz
"ファイルの内容を元に戻します役に立たない。
これは Gitメーリングリスト で報告され、 他の場所での「Gitは悪い」の例 としても使用されます。通常は正しいことをしようとしますが、「正しいこと」が複数ある場合は、ユーザーに任せて決定するのが最善です。
このケースを確認し、明確にするようにユーザーに依頼します。
- 「_
git checkout -- foo
_」はパス「foo」をチェックアウトします- 「_
git checkout foo --
_」は、dwimしてブランチ「foo
」を作成します 6Dwimを使用しないユーザーには、_
--no-guess
_を使用します。 「_git checkout --no-guess foo --
_」は失敗するだけなので、この特定のケースでは役に立ちません。
しかし、スクリプトによって使用される可能性があります。
_git checkout
_ のmanページに以下が含まれるようになりました:
_--no-guess:
_同じ名前のリモートトラッキングブランチが存在する場合は、ブランチを作成しないでください。
Git 2.26(2020年第1四半期)より前は、「 _git checkout X
_ 」は、X
がローカルブランチではないが、が複数のリモート追跡に名前を付けることができる場合、正しく失敗しませんでした修正されたbranchs(つまり、対応するローカルブランチを作成するための開始点として調整される)。
Alexandr Miloslavskiy(SyntevoAlex
) による commit fa7418 、 commit 2957709 (2019年12月30日)を参照してください。
( Junio C Hamano-gitster
- によって commit d0e70cd に統合、2020年2月5日)
checkout
:あいまいな追跡ブランチでファイルを元に戻さないサインオフ:Alexandr Miloslavskiy
理解を容易にするために、既存の適切なシナリオを以下に示します。
- noファイル '
foo
'、noローカルブランチ 'foo
'、およびsingleリモートブランチ 'foo
'- _
git checkout foo
_は、ローカルブランチfoo
を作成します。 上記の70c9ac2をコミット 、 ここで説明 を参照してください。そして
- aファイル '
foo
'、noローカルブランチ 'foo
'、およびsingleリモートブランチ 'foo
'- _
git checkout foo
_は文句を言うでしょう、 commit be4908f上記 を参照してくださいこのパッチは、次のシナリオを防ぎます。
- aファイル '
foo
'、noローカルブランチ 'foo
'およびmultipleリモートブランチ 'foo
'- _
git checkout foo
_は正常に実行されます...ファイルfoo
の内容を元に戻します!つまり、別のリモートを追加すると、動作が大幅に変化します。これは、最高の驚きであり、最悪の場合、ユーザーに気付かれない可能性があります。
実際の苦情がいくつかある commit be4908f上記 をご覧ください。私の理解では、 commit be4908f上記 ( ここで説明 )で修正し、複数のリモートのケースを見落としており、ファイルを元に戻すことにフォールバックする動作全体が意図されていなかった:
上記のコミット70c9ac2 は予期しない動作を引き起こします。
以前は、not-a-refからpathspecへのフォールバックがありました。これは妥当なフォールバックです。
その後、あいまいなリモートからパススペックへの別のフォールバックがあります。
私はそれがコピー&ペーストの見落としだったことを理解しています。commit ad8d51 、「 複数のリモートでチェックアウトできない 」、および ここで説明 は、予期しない動作に気づいたが、代わりにセミドキュメント化することを選択したパッチシリーズの目標が他の何かに焦点を合わせていたため、禁止されています。
commit be4908f上記 は、ブランチとファイルのあいまいさが存在する場合に
die()
を追加します。
複数の追跡ブランチのケースは見過ごされているようです。新しい動作:ローカルブランチがなく、リモート候補が複数ある場合は、
die()
のみを使用し、ファイルが存在する(予期せぬ事態を防ぐ)かどうかにかかわらず、ファイルを元に戻さない(改善される)エラーメッセージ)。