带注释的标记和未带注释的标记之间有什么区别?

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

git tag <tagname>

而且

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

这些命令之间的区别是什么?

154032 次浏览

博士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标志作为注释并使用提供的消息。

基本上,它只相当于您是否希望标记具有与之关联的注释和一些其他信息。

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

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标签对象的格式是什么?如何计算它的SHA?

奖金

  • 判断一个标签是否带注释:

    git cat-file -t tag
    

    输出

    • commit是轻量级的,因为没有标记对象,它直接指向提交
    • tag为带注释的,因为在这种情况下有一个标签对象
    • 李< / ul > < / >
    • 只列出轻量级标签:我怎么能列出所有轻量级标签?< / >

的区别已经很好地解释了。

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

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

通常情况下,您会使用带注释的标记,但这实际上取决于项目的Git管理员。