在git中回显带注释的标签git cat-file -p <hash-of-tag>会产生如下结果:
object <sha1-hash>
type commit
tag 0.0.1
tagger My Name (...)
Description of tag
Run Code Online (Sandbox Code Playgroud)
object在我的情况下指向一个提交对象。type commit暗示不一定一定要这样。在某些情况下,带注释的标签没有指向提交吗?
是:带注释的标签对象可以指向另一个带注释的标签对象,甚至可以直接指向树或Blob。这些都是相当罕见的。
该git rev-parse命令说真的,Git的一般; rev-parse仅仅是例程的面向用户的界面,具有“剥离”标签甚至提交以达到特定目标对象类型的概念。例如,如果要查看附加到提交或标记或哈希ID的树:
git rev-parse whatever^{tree}
将whatever零件变成任何东西,然后尝试“向下钻取”到我们得到树对象的位置。如果whatever是带注释的标签,它将反复将标签跟随其对象,直到到达非标签为止,该非标签根据定义可以是提交,树或Blob:
git rev-parse还是例如,git diff或git diff-tree)都会出错。像git diff-tree这样的命令希望<tree-ish>自动将您提供给它们的任何参数转换为树状结构,就像添加了^{tree}后缀一样。如您所料,还有^{commit}和^{blob}后缀。还有一个^{tag}后缀,可以简单地验证某个东西确实是标签(因为没有其他对象类型可以解析为标签),并且有一个^{}后缀表示“将标签解析为其对象”,即剥离所有内容带注释的标签,然后获取剩余的任何对象。
完整规则在gitrevisions文档中描述。请注意,并非每个Git命令的行为都与描述的一样:特别是,git checkout在gitrevisions中执行六步过程之前,尝试将其参数视为分支名称。这意味着,如果名称foo既可以是标签又可以是分支,则git checkout foo查找分支(即检出refs/heads/foo),但git show foo显示解析标签的结果。