在 git 中带注释的标记中输入 commit
`type commit` in an annotated tag in git
用 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
暗示不一定是这种情况。是否存在带注释的标签不指向提交的情况?
是:一个带注释的标签对象可以指向另一个带注释的标签对象,甚至可以直接指向树或 blob。不过这些都是相当罕见的。
git rev-parse
命令——真的,一般来说Git; rev-parse
只是例程的面向用户的接口——具有 "peeling" 标记的概念,甚至是提交,以达到特定的目标对象类型。例如,如果你想查看附加到提交或标签或哈希 ID 的树:
git rev-parse <em>随便</em>^{tree}
将 whatever
部分变成它原来的样子,然后尝试 "drill down" 到我们得到树对象的地步。如果 whatever
是一个带注释的标签,它会跟随标签到它的对象,重复,直到它到达一个非标签,根据定义它是一个提交,树,或斑点:
- 如果我们到达了一棵树,我们就完成了。
- 如果我们到达了一个提交,每个提交都有一个顶级树,所以我们提取那个提交的树。
- 如果我们到达了一个 blob,则找不到树,因此命令(无论是
git rev-parse
还是 git diff
或 git diff-tree
)都会出错.
像 git diff-tree
这样需要 <tree-ish>
的命令会自动将你给它们的任何参数转换到树中,就像你添加了 ^{tree}
后缀一样。如您所料,还有 ^{commit}
和 ^{blob}
后缀。还有一个 ^{tag}
后缀,它简单地验证某物确实是一个标签(因为没有其他对象类型可以解析 到 一个标签),并且有一个 ^{}
表示 "resolve a tag to its object" 的后缀,即剥离所有带注释的标签,然后获取剩余的任何对象。
the gitrevisions documentation 中描述了完整的规则。请注意,并非每个 Git 命令的行为都如描述的那样:特别是,git checkout
在遵循 git 修订中的六步过程之前尝试将其参数视为分支名称。这意味着如果名称 foo
可以是标签 和 分支,则 git checkout foo
会找到 分支 (即, 查看 refs/heads/foo
), 但 git show foo
显示解析 标签 .
的结果
是的,您可以通过将其散列或其他引用方式传递给 git tag
来标记任何 git 对象。
除了 commit
、tree
(提交中引用的目录列表)、blob
(树中引用的文件内容)甚至tag
也可能出现在标签中。
用 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
暗示不一定是这种情况。是否存在带注释的标签不指向提交的情况?
是:一个带注释的标签对象可以指向另一个带注释的标签对象,甚至可以直接指向树或 blob。不过这些都是相当罕见的。
git rev-parse
命令——真的,一般来说Git; rev-parse
只是例程的面向用户的接口——具有 "peeling" 标记的概念,甚至是提交,以达到特定的目标对象类型。例如,如果你想查看附加到提交或标签或哈希 ID 的树:
git rev-parse <em>随便</em>^{tree}
将 whatever
部分变成它原来的样子,然后尝试 "drill down" 到我们得到树对象的地步。如果 whatever
是一个带注释的标签,它会跟随标签到它的对象,重复,直到它到达一个非标签,根据定义它是一个提交,树,或斑点:
- 如果我们到达了一棵树,我们就完成了。
- 如果我们到达了一个提交,每个提交都有一个顶级树,所以我们提取那个提交的树。
- 如果我们到达了一个 blob,则找不到树,因此命令(无论是
git rev-parse
还是git diff
或git diff-tree
)都会出错.
像 git diff-tree
这样需要 <tree-ish>
的命令会自动将你给它们的任何参数转换到树中,就像你添加了 ^{tree}
后缀一样。如您所料,还有 ^{commit}
和 ^{blob}
后缀。还有一个 ^{tag}
后缀,它简单地验证某物确实是一个标签(因为没有其他对象类型可以解析 到 一个标签),并且有一个 ^{}
表示 "resolve a tag to its object" 的后缀,即剥离所有带注释的标签,然后获取剩余的任何对象。
the gitrevisions documentation 中描述了完整的规则。请注意,并非每个 Git 命令的行为都如描述的那样:特别是,git checkout
在遵循 git 修订中的六步过程之前尝试将其参数视为分支名称。这意味着如果名称 foo
可以是标签 和 分支,则 git checkout foo
会找到 分支 (即, 查看 refs/heads/foo
), 但 git show foo
显示解析 标签 .
是的,您可以通过将其散列或其他引用方式传递给 git tag
来标记任何 git 对象。
除了 commit
、tree
(提交中引用的目录列表)、blob
(树中引用的文件内容)甚至tag
也可能出现在标签中。