有注释和无注释的标签有什么区别?
如果我想标记当前提交。 我知道以下两个命令行工作:
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。