在 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 diffgit 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 对象。

除了 committree(提交中引用的目录列表)、blob(树中引用的文件内容)甚至tag 也可能出现在标签中。