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


332

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

git tag <tagname>

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

这些命令之间有什么区别?



1
@Thilo这不是完全相同的副本。所参考的问题是关于何时注释,而不是有关的标志。
Todd A. Jacobs

1
Git的文档对此做了
Samy

TLDR未注释:commit; 带注释:提交,作者,日期,(可选)评论
Antony Hatchkins

Answers:


254

TL; DR

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

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

根据文档:“要创建轻量级标签,请不要提供任何-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标志进行注释并使用提供的消息一样。

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


4
标签“注释”和提交消息之间有区别吗?
史蒂夫·贝内特

3
@SteveBennett是的。标签注释不是提交消息。您无法使用git-log(1)看到它;您需要使用git-show(1)。
托德·雅各布斯

115
“带注释”标签和“轻量”标签之间的区别超出了消息范围。您可以有带注释的标记,而没有消息(git tag -a <tag> -m ''),但是带注释的标记始终具有标记(作者)和日期
Piotr Findeisen

1
我也是。版本标记通常包含非常无用的消息(它能说的不仅仅是名称吗?什么用?)。不幸的是,这个投票最多的答案没有提到这种差异。
Piotr Findeisen

44
还要注意的另一件事是,当您使用将标签推送到远程存储库时git push --follow-tags,只会推送带注释的标签。
Xatoo 2015年

209

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

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
    

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

    有关该格式的详细分析,请参见:git标签对象的格式是什么,以及如何计算其SHA?

奖金

  • 确定标签是否带注释:

    git cat-file -t tag
    

    产出

    • commit 对于轻量级,由于没有标签对象,因此直接指向提交
    • tag 用于注释,因为在这种情况下有一个标记对象
  • 仅列出轻量级标签:如何列出所有轻量级标签?


1
这比当前接受的答案要清楚得多。谢谢。
里斯

43

大的差异是完全解释在这里

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

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

通常,您会使用带注释的标签,但这实际上取决于项目的Git管理员。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.