web-dev-qa-db-ja.com

同じ名前のファイルが存在する場合のGit変更ブランチ

私のgitリポジトリには、xyzという名前のファイルがあります。偶然にも、私はxyzという名前のブランチも持っています。現在、私はマスターですが、xyzブランチにチェックアウトします。使用するコマンドは簡単です

$ git checkout xyz

しかし、これはファイルxyzを現在のヘッドにチェックアウトします。ブランチをブランチxyzに変更するにはどうすればよいですか?

54
venky

commit a047faf (git 1.8.4.3+)で示されているように、次のことも試すことができます。

git checkout xyz --

(注: エラーメッセージは、Git 2.21、2019年第1四半期でより明確になります

これは、xyz部分がブランチまたはコミットであることを明確にしますが、--の後のすべてはパスでなければなりません(ここではパスは提供されていません)。二重ハイフン規則については、ここ を参照してください

--」なしで試した場合、「 」のように機能する場合と機能しない場合があります。なぜgit checkout <remote_branchname>が新しい追跡ブランチを作成しないのですか? ":

git checkout nameは:

  • ローカルブランチまたは明示的なリモートブランチの場合は、それに切り替えます。
  • 追跡されたパスの場合はリセットする
  • リモートブランチの場合は、トラッキングブランチを作成して、それに切り替えます。

そして、その動作は常に同じではありません。したがって、 '--'は明確な明確化を提供します。

61
VonC

VonCのソリューションは機能しますが、構文を覚えることはできないため、通常はよりローテクなソリューションを使用します。

$ (cd somedir && git checkout my-branch)

または、サブディレクトリがない場合:

$ (cd .git && git -C .. checkout my-branch)

覚えやすく、うまくいきます;-)

2
Martin Tournoij

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」を作成します 6

Dwimを使用しないユーザーには、_--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 fa7418commit 2957709 (2019年12月30日)を参照してください。
Junio C Hamano-gitster- によって commit d0e70cd に統合、2020年2月5日)

checkout :あいまいな追跡ブランチでファイルを元に戻さない

サインオフ:Alexandr Miloslavskiy

理解を容易にするために、既存の適切なシナリオを以下に示します。

  1. noファイル 'foo'、noローカルブランチ 'foo'、およびsingleリモートブランチ 'foo'
  2. _git checkout foo_は、ローカルブランチfooを作成します。 上記の70c9ac2をコミットここで説明 を参照してください。

そして

  1. aファイル 'foo'、noローカルブランチ 'foo'、およびsingleリモートブランチ 'foo'
  2. _git checkout foo_は文句を言うでしょう、 commit be4908f上記 を参照してください

このパッチは、次のシナリオを防ぎます。

  1. aファイル 'foo'、noローカルブランチ 'foo'およびmultipleリモートブランチ 'foo'
  2. _git checkout foo_は正常に実行されます...ファイルfooの内容を元に戻します!

つまり、別のリモートを追加すると、動作が大幅に変化します。これは、最高の驚きであり、最悪の場合、ユーザーに気付かれない可能性があります。
実際の苦情がいくつかある commit be4908f上記 をご覧ください。

私の理解では、 commit be4908f上記ここで説明 )で修正し、複数のリモートのケースを見落としており、ファイルを元に戻すことにフォールバックする動作全体が意図されていなかった:

  • 上記のコミット70c9ac2 は予期しない動作を引き起こします。
    以前は、not-a-refからpathspecへのフォールバックがありました。これは妥当なフォールバックです。
    その後、あいまいなリモートからパススペックへの別のフォールバックがあります。
    私はそれがコピー&ペーストの見落としだったことを理解しています。

  • commit ad8d51 、「 複数のリモートでチェックアウトできない 」、および ここで説明 は、予期しない動作に気づいたが、代わりにセミドキュメント化することを選択したパッチシリーズの目標が他の何かに焦点を合わせていたため、禁止されています。

  • commit be4908f上記 は、ブランチとファイルのあいまいさが存在する場合にdie()を追加します。
    複数の追跡ブランチのケースは見過ごされているようです。

新しい動作:ローカルブランチがなく、リモート候補が複数ある場合は、die()のみを使用し、ファイルが存在する(予期せぬ事態を防ぐ)かどうかにかかわらず、ファイルを元に戻さない(改善される)エラーメッセージ)

0
VonC