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

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

git tag <tagname> 

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

这些命令有什么区别?

TL; DR

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

更多关于轻量级标签

除非您为签名标签select了-s标志,否则该标签默认情况下将是一个轻量级的未签名标签。 轻量级标签也有一些不同之处:

  • 当你使用git tag <tagname> ,Git将在当前版本中创build一个标签,但不会提示你注释。 它将被标记而没有消息。
  • 当你使用git tag -a <tagname> ,Git会提示你注释,除非你也用-m标志来提供消息。
  • 当你使用git tag -a -m <msg> <tagname> ,Git会标记提交并用提供的消息对它进行注释。
  • 当你使用git tag -m <msg> <tagname> ,Git的行为就好像你传递了注解的-a标志并使用提供的消息。

基本上,它只是相当于是否要轻量级标签有一个注释与它关联。

使用差异

man git-tag说:

注释标签是为了发布,而轻量级标签是专用或临时的对象标签。

而某些行为则以这种build议有用的方式区分它们,例如:

  • 带注释的标签可以包含一个消息,创build者和date,不同于他们指向的提交。 所以你可以使用它们来描述一个版本而不用做一个发布提交。

    轻量级标签没有额外的信息,也不需要它,因为你只是自己动手开发。

  • 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 

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

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

奖金

  • 确定标签是否被注释:

     git cat-file -t tag 

    输出commit了轻量级tag用于注释。

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

这里有很大的不同之处。

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

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

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