442

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

git tag <tagname>

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

这些命令有什么区别?

4

3 回答 3

339

TL;博士

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

更多关于轻量级标签

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

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

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

于 2012-07-16T23:39:25.467 回答
279

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

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 tag 对象的格式是什么以及如何计算其 SHA?

奖金

  • 确定标签是否被注释:

    git cat-file -t tag
    

    输出

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

于 2014-09-23T13:49:36.067 回答
59

最大的区别在这里得到了完美的解释。

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

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

通常你会选择带注释的标签,但这实际上取决于项目的 Git 大师。

于 2015-04-04T19:53:31.103 回答