Gitチェックアウトの二重ダッシュの意味


274

このgitコマンドでファイル名の前にある二重ダッシュの意味は何ですか?

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

それらは必須ですか?同等ですか

git checkout --ours path/to/file.txt
git checkout --theirs path/to/file.txt


15
@iltempo:Gitの場合は少し異なります。Gitの場合、ツリーとパスが同じように見える可能性がある場合に、ツリーをパスから分離します。
ディートリッヒエップ

@Dietrich_Epp。そうですか。明確にしていただきありがとうございます。
iltempo


3
これは重複ですが、この重複は少なくとも「git double dash」というクエリでグーグル可能です。
ソーン̈2014

回答:


376

path/to/file.txt私のGitリポジトリーに名前の付いたファイルがあり、その変更を元に戻したいとします。

git checkout path/to/file.txt

ここで、ファイルの名前がmaster...

git checkout master

おっと!代わりにブランチが変更されました。は--、チェックアウトするツリーとチェックアウトするファイルを分離します。

git checkout -- master

また、いくつかのfreakoが-fリポジトリに名前が付けられたファイルを追加した場合にも役立ちます。

git checkout -f      # wrong
git checkout -- -f   # right

これはgit-checkout:Argument Disambiguationに記載されています。


12
これは、gitコマンドだけでなく、多くのbashコマンドにも当てはまります。
NHDaly 2013年

40
@NHDaly:はい、そうです。ただし、用語の注記:「Bash」にはいくつかのコマンド(おそらく20程度)しかなく、ほとんどのコマンドはBashとは別のプログラムです。これは実際にはPOSIX標準の一部で--あり、他の引数からオプションを分離するために使用できるため、cpand mv(Bashの一部ではない)などのコマンドで表示されます。
ディートリッヒエップ2013年

6
この構文がcheckoutコマンドドキュメントに適切に記述されていない理由はありますか?
TanguyP 2016年

4
@DietrichEppいくつかの場所では、checkoutコマンドへの可能なパラメーターのようにリストされていますが、ドキュメントはそれが何をするか、なぜそれが使用されるのかを説明していません...
クリス

7
@DietrichEpp正解ですが、スタックオーバーフローに行く前に構文(および例)を読んでも、なぜを使用するのか、または使用したくないのかがまだわかりませんでした--。Linuxのバックグラウンドを持っていない人として、それが何をするのかは明らかではありません。私には、それはgitに固有の構文であるように見え、その機能的な目的の説明はありませんでした。他のオプションのように短い説明を付けるか、少なくともLinuxのmanページへのリンクを付けたほうがよいと思います
クリス

109

二重ダッシュ「-」は「コマンドラインフラグの終わり」を意味します。つまり、コマンドラインオプションの後に来るものを解析しないように前のコマンドに指示します。


2
明確にするgitために、はこれ以上のものを意味します。これは、の後の引数を--ブランチ名にする--ことはできず、暗黙的に前の引数をファイルパスにすることもできないことを意味します。
ジェムテイラー

0

Git 2.5(2015年第2四半期)以降--、引数にワイルドカード(*)が

git <cmd> <revs> <pathspec>誤って入力されたパスをキャッチするための " "コマンドライン規則を支援するヒューリスティックは、コマンドラインの後の部分のすべての非revパラメータが作業ツリー内のファイルの名前であることを確認することですが、これgit grep $str -- \*.cは常に" " " --"で曖昧さをなくしました。なぜなら、誰も正気ではなく、名前がアスタリスク-ドット-シーであるファイルを作成するからです。

Git 2.5は、ヒューリスティックを緩めて、ワイルドカード文字列を使用して、ユーザーがパススペックを提供することを意図していることを宣言します。

git checkout 'a*'
# same as
git checkout -- 'a*'

Duy Nguyen()によるcommit 28fcc0b(2015年5月2日)を参照してください。(による合併Junio C浜野- -949d167コミット、2015年5月19日)をnguyenlocduy
gitster

pathspec:の必要性を避けます--ワイルドカードが使用されている場合 "

--コマンドラインに" "がなく、コマンドがrevとパスの両方を取得できる場合、引数が拡張SHA-1とパスの両方と見なせる場合、 " --"が必要であるか、gitが続行を拒否します。
現在、次のように実装されています。

  • (1)引数がrevの場合、ワークツリーに存在してはならない
  • (2)それ以外の場合、ワークツリーに存在する必要があります
  • (3)それ以外の場合、「--」が必要です。

これらのルールはリテラルパスに対して機能しますが、非リテラルパス仕様が関係する場合、ほとんどの場合、ユーザーは " --" を追加する必要があります。失敗するため(2)と(1)が実際に満たされることはほとんどありません(*.c例: "1) " *.c" という名前の参照が存在する場合に満たされます。

このパッチは、*「ワークツリーに存在する」有効な()ワイルドカードパス指定を考慮することにより、ルールを少し変更します。
ルールは次のようになります。

  • (1)argがrevの場合、ワークツリーに存在するか、有効なワイルドカードパス仕様ではないかのいずれかでなければなりません。
  • (2)それ以外の場合は、ワークツリーに存在するか、ワイルドカードパス指定です
  • (3)それ以外の場合、「--」が必要です。

新しいルールで--は、ワイルドカードパススペックが含まれている場合、ほとんどの場合" "は必要ありません。


Git 2.26(2020年第1四半期)では、リビジョンとパス指定を区別するための明確化ロジックが調整され、バックスラッシュでエスケープされたglob特殊文字が「ワイルドカードはパス指定」ルールに含まれないようになりました。

Jeff King(によるコミット39e21c6(2020年1月25日)を参照してください。(合併によりJunio C浜野- -341f8a6コミットし、2020年2月12日)をpeff
gitster

verify_filename():「ワイルドカードはパス指定です」ルールでバックスラッシュを処理します

報告者:DavidBurström
署名者:ジェフキング

コミット28fcc0b71apathspec--ワイルドカードが使用されている場合、 " " の必要性を回避、2015-05-02)許可:

git rev-parse '*.c'

ダブルダッシュなし。

ただし、ワイルドカードをチェックするために使用するルールは、実際にはグロブスペシャルを探します。
これは、「a\b」のように実際にワイルドカード照合を行わないパターンがパス指定と見なされることを意味するため、過度に自由です。

そのようなファイルがディスク上にある場合、それはおそらくあなたが望んでいたことです。
しかし、そうでない場合、結果は混乱します。「there's no such path a\b」と言うのではなく、何も一致しない(または少なくとも意図したものとは一致しない)可能性のあるパス仕様として静かに受け入れます。
同様に、パス " a\*b"を検索しても、検索はまったく拡張されません。単一のエントリ " a*b" しか見つかりません。

このコミットは、グロブメタキャラクターが検索を拡張する場合にのみトリガーするようにルールを切り替えます。つまり、これらの両方のケースでエラーが報告されます(--もちろん、" " を使用して曖昧さをなくすことができます。もちろん、DWIMヒューリスティックを強化しています)。

DWIM:私の意味すること

28fcc0b71aの元の機能はまったくテストしていません。
したがって、このパッチはこれらのまれなケースをテストするだけでなく、既存の動作の回帰テストも追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.