带注释和未注释的标签有什么区别?

时间:2012-07-16 23:30:54

标签: git tags git-tag

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

git tag <tagname>

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

这些命令有什么区别?

3 个答案:

答案 0 :(得分:179)

TL; DR

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

有关轻量级标签的更多信息

根据documentation:“要创建轻量级标记,请不要提供任何-a,-s或-m选项,只需提供标记名称”。在带注释的标签上写入消息还有一些不同的选项:

  • 当您使用git tag <tagname>时,Git会在当前版本中创建一个标记,但不会提示您输入注释。它将被标记而没有消息(这是一个轻量级标签)。
  • 使用git tag -a <tagname>时,除非您还使用-m标志提供消息,否则Git会提示您输入注释。
  • 当您使用git tag -a -m <msg> <tagname>时,Git会标记提交并使用提供的消息对其进行注释。
  • 当您使用git tag -m <msg> <tagname>时,Git的行为就像您传递注释的-a标志并使用提供的消息一样。

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

答案 1 :(得分:145)

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

man git-tag说:

  

带注释的标签用于发布,而轻量级标签用于私有或临时对象标签。

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

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

    轻量级标签不具备这些额外信息,并且不需要它,因为您只是自己使用它来开发。

  • git push --follow-tags只会推送带注释的标签
  • 没有命令行选项的
  • git describe只能看到带注释的标签

内部差异

  • 轻量级和带注释的标签都是.git/refs/tags下包含SHA-1的文件

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

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

    打印与HEAD的SHA-1相同。

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

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

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

    包含带注释的标记对象的SHA:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

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

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    示例输出:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <your@mail.com> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

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

    格式的更详细分析见:What is the format of a git tag object and how to calculate its SHA?

<强>奖金

答案 2 :(得分:29)

完全解释了差异here

基本上,轻量级标记只是指向特定提交的指针。 无法保存更多信息;另一方面,带注释的标签常规对象,它们具有作者和日期,因为它们有自己的SHA密钥而可以被引用。

如果知道标记了什么 与您相关,那么请使用带注释的标记。如果您只想标记开发中的特定点,无论是谁以及何时这样做,那么轻量级标记就足够了。

通常你会选择带标注的标签,但这完全取决于项目的Git大师。