git标记主要是作为一种别名工作吗?

git标记主要是作为一种别名工作吗?,git,alias,git-tag,Git,Alias,Git Tag,到目前为止,我知道我可以使用git tag-a tag\u name-m“tag message”来制作带注释的标记 然后使用git show tag_name查看特定标签的更改信息 实际上,这个标记绑定到一个commit。因此,我真正看到的是该提交的更改 那么,git标签是否主要用作别名或提醒,所以我们不需要记住那些不人道的头 或者有一些我目前还不知道的标签的神奇功能?实际上git知道两种标签: “普通”轻量级标记,只不过是提交和 包含附加信息并作为单独对象存储的带注释的标记 无论何时使用

到目前为止,我知道我可以使用
git tag-a tag\u name-m“tag message”
来制作带注释的标记

然后使用
git show tag_name
查看特定标签的更改信息

实际上,这个标记绑定到一个commit。因此,我真正看到的是该提交的更改

那么,
git标签
是否主要用作别名或提醒,所以我们不需要记住那些不人道的头


或者有一些我目前还不知道的标签的神奇功能?

实际上git知道两种标签:

  • “普通”轻量级标记,只不过是提交和
  • 包含附加信息并作为单独对象存储的带注释的标记
无论何时使用
git标记-a
都将创建一个带注释的标记。您通常将其用于发布。它将存储谁创建了标签,完成后,您可以添加一条消息,甚至可以在标签上签名。轻量级标记中没有所有这些信息


更多详细信息,请查看git帮助标签。

实际上,git知道两种标签:

  • “普通”轻量级标记,只不过是提交和
  • 包含附加信息并作为单独对象存储的带注释的标记
无论何时使用
git标记-a
都将创建一个带注释的标记。您通常将其用于发布。它将存储谁创建了标签,完成后,您可以添加一条消息,甚至可以在标签上签名。轻量级标记中没有所有这些信息


查看git help tag以了解更多详细信息。

已经有一个很好的答案,但我想添加一个方向不同的答案

从某种意义上说,问题的答案(“标记是否用作别名”)是,但这可能会产生误导,因为在git中,所有名称都用作别名(在有意义的情况下)

更具体地说,任何git对象的“真名”都是它的SHA-1ID,这可能就是您在提到“那些不人道的头”时所指的。每个SHA-1是一个40个字符的字符串,类似于
c18b86734113ee2aeb0e140c922c8fbd4accc860
。标记是查找此类ID的一种方式,但分支名称(如
master
devel
)也是如此,字符串(如
HEAD
HEAD^
master~3
)也是如此

事实上,git有一个相当丰富的语法系统,可以将名称转换为SHA-1ID,如中所述。例如,要查找包含字符串“bug1234”的提交,可以编写
gitshow:/bug1234
。(冒号表示正在进行的特殊操作,斜杠表示搜索,文本的其余部分实际上是一个完整的正则表达式。)

从语义上讲,标记名与分支名的不同之处在于,分支名需要随着时间的推移解析为不同的提交ID,事实上,在“在”分支时进行新的提交(如,
git status
表示分支主控器上的
会自动将分支名更新为ID映射。1标记名,相比之下,它不会像这样移动,git也不会这么容易地移动它。(人们可以“强制移动”标签,代价是可能会混淆已经将名称保存到ID映射的其他用户:这些其他用户很可能继续使用旧ID。)

如前所述,有两种形式的标记,“轻量级”(直接指向commit2)和“注释的”(实际上是一对,轻量级标记指向实际的标记对象,然后该标记存储一些数据,包括另一个指针;第二个指针指向commit)

您可以使用
git rev parse
命令将修订说明符转换为原始的SHA-1 ID。此命令还有许多其他功能,但其中一个核心部分只是将参数放入修订语法处理程序中。命名原始SHA-1将命名为SHA-1;3给出一个分支或标记名可以得到分支或标记所指向的对象

最后一个就是轻量级标记和带注释标记之间的区别变得显著的地方。如果您有指向提交的带注释标记
annotag
,则命令
git rev parse annotag
将为您获取标记对象的SHA-1 ID,而不是提交本身的ID。如果您有一个轻量级标记
lightag
指向同一个提交,
git rev parse lightag
将为提交获取SHA-1 ID。事实上,这种不同的行为通常是您想要的,但如果不是,则很容易处理,因为在所有其他奇特的语法中,有一种后缀语法允许您指定必须获得提交对象:
git rev parse v1.2^{commit}
表示将
v1.2
字符串转换为提交。如果
v1.2
是一个带注释的标记,git将找到它所指向的提交。4

除了用于“剥离”标记的特殊语法(参见脚注4),需要提交的git命令将自动进行剥离。例如,
gitshow
将在给定带注释的标记名时显示标记和标记指向的对象

总之,分支名称和标记名称都是别名,但它们的用途不同:标记是“固定”别名(对于一个特定的、不变的SHA-1),而分支名称是“可变”别名(某种历史中最新的SHA-1)


1事实上,这就是“在分支上”的真正含义:进行新的提交不仅会进行新的提交,还会更新分支名称以提交ID映射。如果您专门使用
--detach
进入“分离头”模式,或者如果您签出标记ID或以其他方式将分支“脱离”到该“分离头”模式,您仍然可以进行新的提交