如果我想标记当前提交。我知道以下两个命令行都可以工作:
git tag <tagname>
和
git tag -a <tagname> -m '<message>'
这些命令之间有什么区别?
如果我想标记当前提交。我知道以下两个命令行都可以工作:
git tag <tagname>
和
git tag -a <tagname> -m '<message>'
这些命令之间有什么区别?
Answers:
这些命令之间的区别在于,一个命令为您提供了标记消息,而另一个则没有。带注释的标签具有一条消息,可以使用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标志进行注释并使用提供的消息一样。基本上,这仅取决于您是否希望标签具有注释和与之相关的其他信息。
git tag -a <tag> -m ''
),但是带注释的标记始终具有标记(作者)和日期。
git push --follow-tags
,只会推送带注释的标签。
推送带注释的标签,保持轻量级本地
man git-tag
说:
带注释的标签用于释放,而轻量标签则用于私有或临时对象标签。
某些行为确实以建议有用的方式区分它们,例如:
带注释的标签可以包含与其指向的提交不同的消息,创建者和日期。因此,您可以使用它们来描述发布,而无需提交发布。
轻量级标签没有多余的信息,也不需要它,因为您将自己使用它来进行开发。
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
用于注释,因为在这种情况下有一个标记对象仅列出轻量级标签:如何列出所有轻量级标签?