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

git tag <tagname>

and

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

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


博士TL;

这两个命令之间的区别在于,一个为您提供标记消息,而另一个没有。带注释的标记具有可以使用git-show(1)显示的消息,而没有注释的标记只是一个指向提交的命名指针。

更多关于轻量级标签

根据文档:“要创建轻量级标记,不要提供任何-a、-s或-m选项,只需提供标记名称”。还有一些不同的选项可以在带注释的标签上写消息:

When you use git tag <tagname>, Git will create a tag at the current revision but will not prompt you for an annotation. It will be tagged without a message (this is a lightweight tag). When you use git tag -a <tagname>, Git will prompt you for an annotation unless you have also used the -m flag to provide a message. When you use git tag -a -m <msg> <tagname>, Git will tag the commit and annotate it with the provided message. When you use git tag -m <msg> <tagname>, Git will behave as if you passed the -a flag for annotation and use the provided message.

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


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

男人说:

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

而某些行为确实在某些方面有所区别,这一建议是有用的,例如:

带注释的标记可以包含与它们所指向的提交不同的消息、创建者和日期。因此,您可以使用它们来描述一个发布,而不进行发布提交。 轻量级标签没有这些额外的信息,也不需要它,因为您只会在开发过程中使用它。 Git push——follow-tags只会推送带注释的标签 没有命令行选项的Git描述只能看到带注释的标记

内部差异

both lightweight and annotated tags are a file under .git/refs/tags that contains a SHA-1 for lightweight tags, the SHA-1 points directly to a commit: git tag light cat .git/refs/tags/light prints the same as the HEAD's SHA-1. So no wonder they cannot contain any other metadata. annotated tags point to a tag object in the object database. git tag -as -m msg annot cat .git/refs/tags/annot contains the SHA of the annotated tag object: c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef and then we can get its content with: git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef sample output: 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 And this is how it contains extra metadata. As we can see from the output, the metadata fields are: the object it points to the type of object it points to. Yes, tag objects can point to any other type of object like blobs, not just commits. the name of the tag tagger identity and timestamp message. Note how the PGP signature is just appended to the message A more detailed analysis of the format is present at: What is the format of a git tag object and how to calculate its SHA?

奖金

判断一个标签是否带注释: Git cat-file -t标签 输出 Commit是轻量级的,因为没有标记对象,它直接指向Commit 标记为带注释的,因为在这种情况下有一个标记对象 只列出轻量级标签:如何列出所有轻量级标签?


这里完美地解释了巨大的差异。

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

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

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