关于git:带注释和未注释的标签有什么区别?

What is the difference between an annotated and unannotated tag?

如果我想标记当前提交。我知道以下两个命令行都有效:

1
git tag <tagname>

1
git tag -a <tagname> -m '<message>'

这些命令之间的区别是什么?


DR

命令之间的区别在于,一个为您提供了一条标记消息,而另一个则没有。带注释的标记有一条消息,可以用git show(1)显示,而不带注释的标记只是一个提交的命名指针。

有关轻型标记的详细信息

根据文档:"要创建一个轻量级标记,不要提供任何-a、-s或-m选项,只需提供一个标记名"。还有一些不同的选项可以在带注释的标记上编写消息:

  • 当您使用git tag 时,git将在当前版本中创建一个标记,但不会提示您输入注释。它将被标记为不带消息(这是一个轻量级标记)。
  • 当您使用git tag -a 时,git将提示您进行注释,除非您还使用了-m标志来提供消息。
  • 当您使用git tag -a -m 时,git将标记commit并用提供的消息对其进行注释。
  • 当您使用git tag -m 时,git的行为将类似于您传递了用于注释的-a标志并使用提供的消息。

基本上,它只相当于您是否希望标签具有注释以及与之相关的一些其他信息。


推送带注释的标签,保持轻量级本地

man git-tag说:

Annotated tags are meant for release while lightweight tags are meant for private or temporary object labels.

某些行为确实会以本建议有用的方式区分它们,例如:

  • 带注释的标记可以包含与它们指向的提交不同的消息、创建者和日期。所以您可以使用它们来描述一个发布,而不需要提交一个发布。

    轻量级标签没有额外的信息,也不需要它,因为您只需要自己使用它来开发。

  • git push——follow标签将只推送带注释的标签
  • 没有命令行选项的git describe只看到带注释的标记

内部差异

  • 轻量级和带注释的标签都是.git/refs/tags下的一个文件,其中包含一个sha-1

  • 对于轻量级标记,sha-1直接指向提交:

    1
    2
    git tag light
    cat .git/refs/tags/light

    打印与头部的sha-1相同。

    所以难怪它们不能包含任何其他元数据。

  • 带注释的标记指向对象数据库中的标记对象。

    1
    2
    git tag -as -m msg annot
    cat .git/refs/tags/annot

    包含注释标记对象的sha:

    1
    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef

    然后我们可以通过以下方式获取其内容:

    1
    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef

    样品输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <[email protected]> 1411478848 +0200

    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)

    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT

    这就是它包含额外元数据的方式。从输出中可以看到,元数据字段是:

    • 它指向的对象
    • 它指向的对象类型。是的,标记对象可以指向任何其他类型的对象,如blobs,而不仅仅是提交。
    • 标签的名称
    • 标记器标识和时间戳
    • 消息。注意pgp签名是如何附加到消息的

    对格式的更详细的分析出现在:什么是git标记对象的格式以及如何计算其sha?

奖金

  • 确定标记是否已注释:

    1
    git cat-file -t tag

    输出commit表示轻量级,tag表示注释。

  • 只列出轻量级标签:如何列出所有轻量级标签?


大的区别在这里被完美地解释了。

基本上,轻量级标记只是特定提交的指针。不保存进一步的信息;另一方面,带注释的标记是常规对象,具有作者和日期,并且可以被引用,因为它们有自己的sha键。

如果知道谁标记了什么和什么时候与您相关,那么使用带注释的标记。如果您只想在开发中标记一个特定的点,不管是谁和什么时候做的,那么轻量级的标记就足够好了。

通常情况下,您会选择带注释的标签,但这实际上取决于项目的Git主控。