ショートアンサー(TL; DR)
「Tree-ish」は、最終的に(サブ)ディレクトリツリーにつながる識別子( Gitリビジョンのドキュメントで指定されている)を指す用語です(Gitはディレクトリを「ツリー」および「ツリーオブジェクト」と呼びます)。
元の投稿者の場合、foo
は彼が指定したいディレクトリです。Gitで(サブ)ディレクトリを指定する正しい方法は、次の「ツリーっぽい」構文を使用することです(Gitリビジョンドキュメントの項目#15 )。
<rev>:<path>
、例えばHEAD:README
、、:README
master:./README
接尾辞の:
後にパスが続くと、コロンの前の部分によって名前が付けられたツリー風のオブジェクト内の指定されたパスにあるブロブまたはツリーに名前が付けられます。
つまり、master:foo
は正しい構文であり、ではありませんmaster/foo
。
その他の「ツリーっぽい」(プラスコミットっぽい)
コミットっぽい識別子とツリーっぽい識別子の完全なリストは次のとおりです(Gitリビジョンのドキュメントから、それを指摘してくれたLopSaeに感謝します):
----------------------------------------------------------------------
| Commit-ish/Tree-ish | Examples
----------------------------------------------------------------------
| 1. <sha1> | dae86e1950b1277e545cee180551750029cfe735
| 2. <describeOutput> | v1.7.4.2-679-g3bee7fb
| 3. <refname> | master, heads/master, refs/heads/master
| 4. <refname>@{<date>} | master@{yesterday}, HEAD@{5 minutes ago}
| 5. <refname>@{<n>} | master@{1}
| 6. @{<n>} | @{1}
| 7. @{-<n>} | @{-1}
| 8. <refname>@{upstream} | master@{upstream}, @{u}
| 9. <rev>^ | HEAD^, v1.5.1^0
| 10. <rev>~<n> | master~3
| 11. <rev>^{<type>} | v0.99.8^{commit}
| 12. <rev>^{} | v0.99.8^{}
| 13. <rev>^{/<text>} | HEAD^{/fix nasty bug}
| 14. :/<text> | :/fix nasty bug
----------------------------------------------------------------------
| Tree-ish only | Examples
----------------------------------------------------------------------
| 15. <rev>:<path> | HEAD:README, :README, master:./README
----------------------------------------------------------------------
| Tree-ish? | Examples
----------------------------------------------------------------------
| 16. :<n>:<path> | :0:README, :README
----------------------------------------------------------------------
識別子#1〜14は、すべてコミットにつながるため、すべて「コミットっぽい」ですが、コミットはディレクトリツリーも指すため、最終的にはすべて(サブ)ディレクトリツリーオブジェクトになり、「ツリー」としても使用できます。 -Hは"。
#15は、(サブ)ディレクトリを参照するときにツリー風として使用することもできますが、特定のファイルを識別するためにも使用できます。それがファイルを参照するとき、それがまだ「ツリーっぽい」と見なされるのか、それとも「ブロブっぽい」のように機能するのかはわかりません(Gitはファイルを「ブロブ」と呼びます)。
長い答え
最も低いレベルでは、Gitは4つの基本的なオブジェクトを使用してソースコードを追跡します。
- コミットを指す注釈付きタグ。
- プロジェクトのルートディレクトリツリーを指すコミット。
- ディレクトリとサブディレクトリであるツリー。
- ファイルであるブロブ。
Linus TorvaldsはGitをコンテンツアドレス可能なファイルシステムのように設計したため、これらの各オブジェクトには独自のsha1ハッシュIDがあります。つまり、ファイルはコンテンツに基づいて取得できます(sha1 IDはファイルコンテンツから生成されます)。Pro Gitの本は、この例の図を示しています。
多くのGitコマンドは、コミットおよび(サブ)ディレクトリツリーの特別な識別子を受け入れることができます。
「Commit-ish」は、最終的にコミットオブジェクトにつながる識別子です。例えば、
tag -> commit
「Tree-ish」は、最終的にツリー(つまりディレクトリ)オブジェクトにつながる識別子です。
tag -> commit -> project-root-directory
コミットオブジェクトは常にディレクトリツリーオブジェクト(プロジェクトのルートディレクトリ)を指すため、「コミットっぽい」識別子は、定義上、「ツリーっぽい」でもあります。つまり、コミットオブジェクトにつながる識別子は、(サブ)ディレクトリツリーオブジェクトにつながるためにも使用できます。
ただし、Gitのバージョン管理システムではディレクトリツリーオブジェクトがコミットを指すことはないため、(サブ)ディレクトリツリーを指すすべての識別子を使用してコミットを指すこともできるわけではありません。言い換えると、「コミットっぽい」識別子のセットは、「ツリーっぽい」識別子のセットの厳密なサブセットです。
ドキュメントで説明されているように(私がそれを見つけるのを手伝ってくれたTreborに感謝します):
<tree>
ツリーオブジェクト名を示します。
<commit>
コミットオブジェクト名を示します。
<tree-ish>
ツリー、コミット、またはタグオブジェクト名を示します。引数を取るコマンドは、<tree-ish>
最終的にはオブジェクトを操作したいのですが、を指すオブジェクトを<tree>
自動的に逆参照<commit>
します。<tag>
<tree>
<commit-ish>
コミットまたはタグオブジェクト名を示します。引数を取るコマンドは、<commit-ish>
最終的にはオブジェクトを操作したいのですが、を指すオブジェクトを<commit>
自動的に逆参照します。<tag>
<commit>
commit-ishとして使用できないtree-ish識別子のセットは
<rev>:<path>
、オブジェクトをコミットするのではなく、ディレクトリツリーに直接つながります。たとえば、HEAD:subdirectory
。
ディレクトリツリーオブジェクトのSha1識別子。