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

237

我目前正在处理一个有多个分支的代码库。

当我创建一个标签时,该标签是否指向当前分支?

换句话说:每当我创建一个标签时,我是否需要切换到所需的分支并在该分支内打标签,以便标签在那一时间点对应该分支?

8个回答

309

CharlesB的回答helmbert的回答都很有帮助,但我花了一段时间才理解它们。

  • 标签指向提交指针提交独立于分支存在
    • 重要的是要明白,标签与分支没有直接关系,它们只标识一个提交
      • 该提交可以被任意数量的分支所指向,也就是说,它可以成为任意数量的分支的历史记录的一部分,包括无分支。
    • 因此,运行git show <tag>以查看标签的详细信息不包含任何分支的引用,只包含标签指向的提交的ID。
      • (提交ID(也称为对象名称或SHA-1 ID)是由十六进制数字组成的40个字符字符串,它们是对提交内容的哈希值;例如:6f6b5997506d48fc6267b0b60c3f0261b6afe7a2

  • 分支只在间接地发挥作用
    • 在创建标签的时间,通过暗示标签将指向的提交
      • 未为标签指定目标,则默认为当前分支的最新提交(也称为HEAD);例如:
        • git tag v0.1.0 # 标记*当前*分支的HEAD
      • 将分支名称指定为标签目标,则默认为该分支的最新提交;例如:
        • git tag v0.1.0 develop # 标记 'develop' 分支的 HEAD
      • (正如其他人所指出的,你也可以显式地指定一个提交ID作为标记的目标。)
    • 当使用 git describe 描述当前分支时:
      • git describe [--tags] 根据本分支历史中最近的[可能是轻量级的]标记之后的提交来描述当前分支。
      • 因此,git describe引用的标记可能不反映最近创建的标记。

因此,对于给定的标签(例如v0.1.0),要知道实际构建中的实际源代码,您确实需要知道构建基于哪个分支,对吗?也就是说,给定的提交在不同的分支中可能有不同的后代,对吗? - Hawkeye Parker
2
@HawkeyeParker:我已经不再深入研究这个了,但你不应该需要知道分支,因为标签可以识别特定的提交(可能是多个分支的一部分),你可以从那里进行调查。 - mklement0
但是,如果我执行 git show [tagname],则会在作者和日期上方显示分支名称,这与“运行 git show <tag> 以查看标记的详细信息不包含任何分支引用”相矛盾。 - Bradley Thomas

206

如果您通过例如

git tag v1.0

该标签将引用当前所在分支的最新提交。您可以切换分支并在那里创建标签。

您也可以在标记时直接引用其他分支。

git tag v1.0 name_of_other_branch

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

或者,您可以通过直接引用某个提交的SHA1,在任何分支中放置标记。

git tag v1.0 <sha1>

57

标签(tags)和分支(branch)是完全无关的,因为标签指向一个特定的提交(commit),而分支是对历史记录中最后一次提交的移动引用。分支会变化,而标签会保留。

所以当你对一个提交(commit)打标签(tags)时,如果你提供了你想打标签的 SHA1 ,Git 就不在意哪个提交(commit)或分支(branch)被检出。

我甚至可以通过引用一个分支来打标签(tags)(它将打在该分支的最新提交上),稍后再说该分支的顶部位置在其他地方(例如,使用 git reset --hard ),或者删除该分支。然而,我创建的标签(tags)不会移动。


37
换句话说,标签只是对于丑陋的 Git 哈希值的美好名称。该标签(和哈希)存在于任何分支存在或不存在的情况下。 - C-Otto

11

在不添加任何额外参数的情况下,只需调用git tag <TAGNAME>,Git 就会从您当前的 HEAD(即当前分支的 HEAD)创建一个新标签。 当向该分支添加其他提交时,分支 HEAD 将跟随这些新提交,而标签始终指向同一次提交。

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

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


7
我们可以为一些已经提交的版本创建一个标签:
git tag [tag_name] [reference_of_commit]

eg:

git tag v1.0 5fcdb03

4
如果您想为您所在的分支打标签,那么输入以下命令:
git tag <tag>

使用以下命令推送分支:

git push origin --tags

1
一个相关且有用的命令是:
git branch --contains tag/<tag>

这将为您提供所提供标签所在的所有分支列表。

更多细节请参见此处...


1
如果你想从类似于release/yourbranch的分支创建一个标签, 那么你应该使用类似以下的命令:
git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

如果您创建了正确的标签并希望将其推送到远程,则使用以下命令:

git push origin YOUR_TAG_VERSION_OR_NAME

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接