使用git cat-file -p <hash-of-tag>
在git中回显带注释的标记会产生如下内容:
object <sha1-hash>
type commit
tag 0.0.1
tagger My Name (...)
Description of tag
在我的情况下, object
指向一个提交对象。 type commit
意味着必定不是必须的。是否存在注释标签未指向提交的情况?
答案 0 :(得分:4)
是:带注释的标记对象可以指向另一个带注释的标记对象,甚至可以直接指向树或blob。这些都是相当罕见的。
git rev-parse
命令 - 真的,Git一般; rev-parse
只是例程的面向用户的界面 - 具有&#34;剥离&#34;的概念。标记,甚至是提交,以达到特定的目标对象类型。例如,如果要查看附加到提交或标记或散列ID的树:
git rev-parse whatever^{tree}
将 whatever
部分转换为任何部分,然后尝试向下钻取&#34;到了我们得到树对象的程度。如果 whatever
是带注释的标记,则会反复跟随标记到其对象,直到它到达非标记,根据定义,它是提交,树或blob:
git rev-parse
还是git diff
或{{1} })错误。像git diff-tree
这样的命令希望git diff-tree
自动将您提供的参数转换为树,就像添加了<tree-ish>
后缀一样。正如您所料,还有^{tree}
和^{commit}
个后缀。还有一个^{blob}
后缀,它只是验证某些内容确实是一个标记(因为没有其他对象类型可以解析到一个标记),并且有一个^{tag}
后缀表示&#34;将标签解析为其对象&#34;,即剥离所有带注释的标签,然后获取剩余的任何对象。
the gitrevisions documentation中描述了完整规则。请注意,并非每个Git命令的行为都如上所述:特别是,^{}
尝试在遵循gitrevisions中的六步过程之前将其参数视为分支名称。这意味着,如果名称git checkout
可以是标记和分支,foo
会找到分支(即,检出{{1 }}),但git checkout foo
显示解析标记的结果。
答案 1 :(得分:0)
是的,您可以通过将其哈希或其他引用方式传递给git tag
来标记任何git对象。
除了commit
,tree
(提交中引用的目录列表),blob
(树中引用的文件内容)甚至是{{ 1}}也可能出现在标签中。