Git标签仅适用于当前分支吗?


154

我目前正在使用具有多个分支的存储库。

创建标签时,该标签是否指向then-current分支?

换句话说:每当创建标签时,是否都需要切换到所需的分支并在该分支内进行标签,以便该标签在该时间点引用该分支?

Answers:


150

如果您通过例如创建标签

git tag v1.0

标签将引用您当前所在分支的最新提交。您可以更改分支并在此处创建标签。

您也可以在标记时引用另一个分支,

git tag v1.0 name_of_other_branch

这将创建标记到另一个分支的最新提交。

或者,您可以通过直接引用某些提交的SHA1,将标签放置在任何位置,无论是哪个分支

git tag v1.0 <sha1>

200

CharlesB的回答helmbert的回答都很有帮助,但是花了我一段时间才理解它们。这是另一种放置方式:

  • 标签是一个指针,指向一个提交,并提交独立存在的分支
    • 重要的是要了解标签与分支没有直接关系,它们只能标识一个提交
      • 可以从任意数量的分支指向该提交-即,它可以是任意数量的分支的历史的一部分-包括无分支。
    • 因此,运行git show <tag>以查看标签的详细信息时,它不包含对任何分支的引用,仅包含标签指向的提交的ID。
      • (提交的ID(又名对象名或SHA-1的ID)的40个字符的字符串构成的十六进制中超过的内容散列提交数字;例如:。 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2
  • 分支仅间接起作用
    • 创建标签时,通过暗示该标签将指向的提交
      • 未指定标签的目标默认为当前分支的最新提交(即HEAD);例如:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • 将分支名称指定为标记目标将默认为该分支的最新提交;例如:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (正如其他人所指出的,您也可以将提交ID明确指定为标签的目标。)
    • 当使用git describe来描述当前分支:
      • git describe [--tags]该分支的历史记录中最近的[可能是轻量级的]标签以来的提交来描述当前分支。
      • 因此,所引用的标签git describe可能不会整体反映最近创建的标签

因此,对于给定的标签(例如v0.1.0),要知道(该源的)实际构建中的实际来源,您确实需要知道该构建所基于的分支,对吗?即,给定的提交可能在不同的分支中具有不同的后代,对吗?
Hawkeye Parker,

2
@HawkeyeParker:我不再沉迷于此,但是您不必知道分支,因为标签可以标识特定的提交(可以是多个分支的一部分),您可以从那里进行调查。
mklement0 '18

但是,如果我执行git show [tagname],那么它将在Author和Date上方显示一个分支名称,这与“运行git show <tag>以查看标签的详细信息不包含任何分支的引用”
Brad Thomas

38

标记和分支完全无关,因为标记引用特定的提交,而分支是对历史记录的最后提交的移动引用。分支走,标签留下。

因此,在标记提交时,如果您向他提供要标记的SHA1,git不会在乎哪个提交或分支被检出。

我什至可以通过引用分支进行标记(然后将标记分支的尖端),然后再说分支的尖端在其他位置(git reset --hard例如),或删除分支。但是,我创建的标签不会移动。


17
换句话说,标签只是丑陋的git哈希的好名字。无论存在哪个分支,标签(和哈希)都存在。
C-Otto

8

仅在git tag <TAGNAME>没有任何其他参数的情况下调用时,Git将从当前的HEAD(即您当前分支的HEAD)创建一个新标签。当向该分支中添加其他提交时,分支HEAD将与这些新提交保持同步,而标记始终引用相同的提交。

调用时git tag <TAGNAME> <COMMIT>,甚至可以指定用于创建标签的提交。

无论如何,标记仍然仅仅是某个提交(而不是分支)的“指针”。



1

如果要标记您所在的分支,请键入:

git tag <tag>

并通过以下方式推动分支:

git push origin --tags

0

如果您想从分支创建标签,例如release/yourbranchetc,那么您应该使用

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

创建完正确的标签后,如果您希望将标签推送到远程,请使用以下命令

git push origin YOUR_TAG_VERSION_OR_NAME
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.