Git 标记:基于时间或基于提交

Git tagging: Time-based or Commit-based

当我创建一个标签(轻量级或带注释的)并且没有提供提交 ID 时,Git 是否会在创建标签时将标签记录为 "a point in time"?

或者它是否标记了我分支中的最新提交,并且与该标记关联的 "time" 是最新提交的时间?

标签是轻量级的还是带注释的重要吗?

The docs 说:

A lightweight tag is very much like a branch that doesn’t change – it’s just a pointer to a specific commit.

因此,很明显轻量级标签只是指向一个提交。但是带注释的标签呢?该文档清楚地说明了您可以使用带注释的标签执行的各种操作(包括添加消息、签名等),但没有指定它是否是指向提交的指针。

轻量标签是一种记录对象SHA-1的引用。对象 "should" 是一个提交,但 git 中没有任何内容强制执行此操作。因此,轻量级标签可以指向树或 blob。

参考没有时间戳。 (ref 的 "reflog",这是对该引用所做的每个 更改 的日志,确实有时间戳。这包括一个关于 ref 本身何时创建的条目。但是, reflogs 不需要为任何特定的 ref 存在;reflog 条目在可配置的时间后过期,默认为 90 天;并且由更新 refs 的程序来确保它们也更新 reflog。所有 git's内部命令可以;对于非git外部脚本,这取决于它们是否写得很好。)

带注释的标签由 两个 条目组成:一个引用(一个轻量级标签)和一个基础 git 类型 "tag" 的对象。如果你漂亮地打印一个标签对象,你会在标签中看到一个时间戳:

$ git cat-file -p v2.5.0 | sed -e 's/@/ /' -e 7q
object a17c56c056d5fea0843b429132904c429a900229
type commit
tag v2.5.0
tagger Junio C Hamano <gitster pobox.com> 1438025401 -0700

Git 2.5
-----BEGIN PGP SIGNATURE-----

object 行给出了标签目标的 SHA-1,type 行给出了该对象的类型。这个 应该 是提交或另一个标签(即带注释的标签对象)。同样,没有什么可以禁止它直接指向树或 blob。

tagger 行显示谁创建了标签,以及标签创建者创建标签的时间(根据机器 and/or 任何其他覆盖)。所以你在这里得到了一个标签创建时间戳。

请注意,标记的目标(轻量级 注释)只是您指定的 SHA-1(默认 HEAD)。当然,如果你将一个新的轻量级标签指向一个现有的带注释的标签对象,你得到的基本上是一个带注释的标签(虽然它很奇怪,因为轻量级标签名称,refs/tags/<em>name</em>,不会匹配注释标签对象的 tag 行中的名称。


简短回答(如果还不算太晚的话):是的,带注释的标签中有时间戳,这取决于它是否被注释。