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

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

git tag <tagname>

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

这些命令有什么区别?


TL; DR

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

更多关于轻量级标签

除非您为签名标签选择-s标志,否则该标签默认为轻量级,无符号标签。 轻量级标签也有一些不同之处:

  • 当你使用git tag <tagname> ,Git将在当前版本中创建一个标签,但不会提示你注释。 它将被标记而没有消息。
  • 当你使用git tag -a <tagname> ,Git会提示你注释,除非你也使用了-m标志来提供消息。
  • 当你使用git tag -a -m <msg> <tagname> ,Git会标记提交并用提供的消息对它进行注释。
  • 当你使用git tag -m <msg> <tagname> ,Git的行为就好像你传递了注解的-a标志并使用提供的消息。
  • 基本上,这等于是否要让轻量级代码具有与其关联的注释。


    使用差异

    man git-tag说:

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

    而某些行为的确可以区分这些建议,例如:

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

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

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

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

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

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

    打印与HEAD的SHA-1相同。

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

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

    $ git tag -as -m msg annot
    $ git cat-file -t "$(cat .git/refs/tags/annot)"
    tag
    $ # Get a textual representation of the tag object.
    $ git cat-file -p "$(cat .git/refs/tags/annot)"
    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
    

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

  • 它指向的对象
  • 它指向的对象的类型。 是的,标签对象可以指向任何其他类型的对象,如blob,而不仅仅是提交。
  • 标签的名称
  • 标记者身份和时间戳
  • 信息。 注意PGP签名是如何附加到消息的
  • 奖金

  • 确定标签是否被注释:

    git cat-file -t tag
    

    输出commit轻量级tag以进行注释。

  • 仅列出轻量级代码:如何列出所有轻量级代码?


  • 最大的区别在这里完全解释。

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

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

    通常你会去注释标签,但是这真的取决于项目的Git主控。

    链接地址: http://www.djcxy.com/p/4655.html

    上一篇: What is the difference between an annotated and unannotated tag?

    下一篇: git commit and push when work is not finished and I am moving workplace