Gitのcommit-ishとtree-ishとは何ですか?


117

質問

Gitでのコミットっぽい、ツリーっぽい具体的な例は何ですか?

Stack Overflowの質問「gitでtree-ishはどういう意味ですか?」特にツリーっぽいものを扱っていますが、両方についてもっと理解したいと思います。

バックグラウンド

ドキュメントでの使用

Gitのドキュメントでは、「commit-ish」と「tree-ish」をいくつか参照しています。たとえば、Gitのソースコードを調べている場合

$ git grep --files-with-matches --extended-regexp "commit(-)*ish"
config.txt
git-describe.txt
git-fast-import.txt
git-name-rev.txt
git-push.txt
git-rebase.txt
git-rev-parse.txt
git.txt
gitcli.txt
glossary-content.txt
howto/revert-branch-rebase.txt
revisions.txt

そして

$ git grep --files-with-matches --extended-regexp "tree(-)*ish" | \
$ grep --invert-match RelNotes
diff-format.txt
diff-generate-patch.txt
git-archive.txt
git-cat-file.txt
git-checkout.txt
git-diff-index.txt
git-diff-tree.txt
git-ls-files.txt
git-ls-tree.txt
git-merge-tree.txt
git-read-tree.txt
git-reset.txt
git-svn.txt
git.txt
gitcli.txt
gittutorial-2.txt
glossary-content.txt
revisions.txt

定義

Gitのドキュメントでは、「commit-ish」と「tree-ish」が何であるかを定義しています

<tree>

ツリーオブジェクト名を示します。

<commit>

コミットオブジェクト名を示します。

<tree-ish>

ツリー、コミット、またはタグのオブジェクト名を示します。<tree-ish> 引数を取るコマンドは、最終的には<tree>オブジェクトを操作したいが、を指すオブジェクト<commit><tag>オブジェクトを自動的に逆参照します<tree>

<commit-ish>

コミットまたはタグのオブジェクト名を示します。<commit-ish> 引数を取るコマンドは、最終的には<commit>オブジェクトを操作したいが、<tag>を指すオブジェクトを自動的に逆参照します<commit>

ドキュメントは十分に明確ではありません

上記のドキュメントは「コミットっぽい」と「ツリーっぽい」とは何かを定義していますが、それでもあいまいで不明確であることがわかります。

「コミットっぽい」「ツリーっぽい」の具体例は何ですか?

回答:


156

短い答え(TL; DR)

コミットっぽいとツリーっぽい識別子の完全なリストは次のとおりです(Gitリビジョンのドキュメントから):

----------------------------------------------------------------------
|    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.txt, master:sub-directory/
----------------------------------------------------------------------
|         Tree-ish?         |                Examples
----------------------------------------------------------------------
| 16. :<n>:<path>           | :0:README, :README
----------------------------------------------------------------------

識別子#1-14はすべて「コミットっぽい」です。これらはすべてコミットにつながるためですが、コミットもディレクトリツリーを指すため、最終的にはすべて(サブ)ディレクトリツリーオブジェクトにつながり、したがって「ツリー」としても使用できます。 -Hは"。

#15は(サブ)ディレクトリを参照するときにツリーのように使用することもできますが、特定のファイルを識別するために使用することもできます。それがファイルを参照するとき、それがまだ「ツリーっぽい」と見なされているのか、それとも「ブロブっぽい」(Gitがファイルを「ブロブ」と呼ぶ)のように振る舞うのかはわかりません。

長い答え

Gitのコミットとディレクトリツリー

最低レベルでは、Gitは4つの基本オブジェクトを使用してソースコードを追跡します。

  1. コミットを指す注釈付きタグ。
  2. プロジェクトのルートディレクトリツリーを指すコミット。
  3. ツリーは、ディレクトリとサブディレクトリです。
  4. ファイルであるブロブ。

Linus TorvaldsはGitをコンテンツアドレス可能なファイルシステムのように設計したため、これらの各オブジェクトには独自のsha1ハッシュIDがあります。つまり、ファイルはコンテンツに基づいて取得できます(sha1 IDはファイルコンテンツから生成されます)。Pro Gitブックには、次の図の例が示されています。

図9-3 Pro Gitブック

コミットっぽいvsツリーっぽい

多くのGitコマンドは、コミットおよび(サブ)ディレクトリツリーの特別な識別子を受け入れることができます。

  • 「コミットっぽい」とは、最終的にコミットオブジェクトにつながる識別子です。例えば、

    tag -> commit

  • 「ツリーっぽい」は、最終的にツリー(ディレクトリ)オブジェクトにつながる識別子です。

    tag -> commit -> project-root-directory

commitオブジェクトは常にディレクトリツリーオブジェクト(プロジェクトのルートディレクトリ)を指すため、「commit-ish」である識別子はすべて、定義上は「tree-ish」でもあります。言い換えると、コミットオブジェクトにつながる任意の識別子を使用して、(サブ)ディレクトリツリーオブジェクトにつながることもできます

ただし、Gitのバージョン管理システムではディレクトリツリーオブジェクトがコミットをポイントしないため、(サブ)ディレクトリツリーをポイントするすべての識別子を使用してコミットをポイントできるわけではありません。言い換えると、「commit-ish」識別子のセットは、「tree-ish」識別子のセットの厳密なサブセットです。

commit-ishとして使用できないツリーっぽい識別子のセットは、

  1. <rev>:<path>オブジェクトをコミットするのではなく、ディレクトリツリーに直接つながります。たとえば、HEAD:subdirectory

  2. ディレクトリツリーオブジェクトのSha1識別子。


3
を忘れないでくださいstash@{0}。それがこのすべてのどこに当てはまるか知りたいのですが。スタッシュ(my-thing@{0})などの他に何かありますか?隠し場所は単なる<refname>ですか?
2015

ツリーっぽい識別子がコミットっぽい識別子よりも具体的な識別子のように見えることは明確には明らかにされていません。多分私は変ですが、それがIMOを説明する唯一の賢明な方法です-IMO
Steven Lu

29

英語を母国語としない[sic!]スピーカーに関する注意:「-ish」は形容詞に適用できる接尾辞であり、「次のような性質を持つ」または「やや」を示すために使用できます。http://chambers.co.ukを参照してください。 / search /?query = ish&title = 21st

したがって、「ツリーっぽい」-「ツリー」のように....「コミットっぽい」-「コミット」のように

たとえば、「火星は赤みがかった星のように見えます」(「d」は2倍になります!)。「皿の上の食べ物は熱くはなかったが、温かい」

これは、言語の使い方を説明するという点で、「何が...」をよりよく説明するのに役立つと思います。


私は常に「ツリーっぽい」と「コミットっぽい」を「スウェーデン語」または「英語」と同じように解釈しました。あなたが説明する使用法は、その形の「イッシュ」が形容詞を作成するので、あまり意味がありません。しかし、REVは、それは、木「のように」ではないか、コミットである木やコミット。一方、「ish」を言語の接尾辞と考える場合、コマンドラインでは名詞としてより意味があります。「tree-ish」は名詞を形成する言語です。どの解釈が著者の意図であったのかはわかりませんが、それは私がいつもそれを見てきた方法です。
jmt

おっしゃるとおりですが、私はネイティブスピーカーとしての印象を与えていました。
MikeW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.