Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 带注释的标记和未带注释的标记之间有什么区别?_Git_Tags_Git Tag - Fatal编程技术网

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

Git 带注释的标记和未带注释的标记之间有什么区别?,git,tags,git-tag,Git,Tags,Git Tag,如果我想标记当前提交。我知道以下两个命令行都可以工作: git tag <tagname> git标签 及 git标签-a-m'' 这些命令之间有什么区别?TL;博士 两个命令之间的区别在于,一个命令提供标记消息,而另一个命令不提供。带注释的标记有一条消息,可以通过git show(1)显示,而不带注释的标记只是指向提交的命名指针 有关轻量级标记的更多信息 根据“要创建轻量级标记,不要提供任何-a、-s或-m选项,只需提供标记名”。还有一些不同的选项可用于在带注释的标记上写入消

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

git tag <tagname>
git标签

git标签-a-m''
这些命令之间有什么区别?

TL;博士 两个命令之间的区别在于,一个命令提供标记消息,而另一个命令不提供。带注释的标记有一条消息,可以通过git show(1)显示,而不带注释的标记只是指向提交的命名指针

有关轻量级标记的更多信息 根据“要创建轻量级标记,不要提供任何-a、-s或-m选项,只需提供标记名”。还有一些不同的选项可用于在带注释的标记上写入消息:

  • 当您使用
    git-tag
    时,git将在当前版本中创建一个标记,但不会提示您输入注释。它将在没有消息的情况下被标记(这是一个轻量级标记)
  • 当您使用
    git标记-a
    时,git将提示您输入注释,除非您还使用了-m标志来提供消息
  • 当您使用
    git tag-a-m
    时,git将标记提交并用提供的消息对其进行注释
  • 当您使用
    git标记-m
    时,git的行为就好像您传递了注释的-a标志并使用了提供的消息一样

基本上,它只是表示您是否希望标记包含注释以及与之相关的其他信息。

推送注释标记,保持轻量级本地

mangit标签上写着:

注释标记用于发布,而轻量级标记用于私有或临时对象标签

某些行为确实在本建议有用的方面区分了它们,例如:

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

    轻量级标记没有额外的信息,也不需要这些信息,因为您只需要自己使用它来开发

  • 将只推送带注释的标记
  • git descripe
    不带命令行选项,只能看到带注释的标记
内部差异

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

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

    git tag light
    cat .git/refs/tags/light
    
    打印与头部的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
    
    输出

    • commit
      对于轻量级,由于没有标记对象,它直接指向commit
    • 标记
      用于注释,因为在这种情况下有标记对象
  • 仅列出轻量级标记:


这一巨大的差异得到了完美的解释

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

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


通常情况下,您会选择带注释的标记,但这实际上取决于项目的Git主管。

可能重复@Thilo,这不是完全重复的。引用的问题是关于何时注释,而不是相关的标志;注释:提交,作者,日期,(可选)注释标记“注释”和提交消息之间有区别吗?@SteveBennett是的。标记批注不是提交消息。使用git日志(1)无法看到它;您需要使用GitShow(1),“带注释”和“轻量级”标记之间的区别不仅仅是消息。您可以在没有消息的情况下使用带注释的标记(
git tag-a-m'
),但带注释的标记始终具有标记者(作者)和日期。另一个需要注意的重要事项是,当您使用
git push--follow tags
将标记推送到远程存储库时,只会推送带注释的标记。作为@Xatoo comment的补充,
git push origin--tags
push这两种类型的标签,即带注释的标签和轻量级标签。这比目前公认的答案要清楚得多。谢谢。
确定标签是否有注释
为此而来。回答得好!
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 cat-file -t tag