关于git标签:Git标签只适用于当前分支吗?

Do Git tags only apply to the current branch?

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

当我创建一个标记时,该标记是否引用了当时的分支?

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


Charlesb的答案和Helmbert的答案都很有用,但我花了一段时间才理解它们。另一种说法是:

  • 标记是指向提交的指针,提交独立于分支存在。
    • 重要的是要理解标记与分支没有直接的关系——它们只标识提交。
      • 该提交可以从任意数量的分支中指向,也就是说,它可以是任意数量分支历史的一部分,包括无分支。
    • 因此,运行git show 查看标记的详细信息不包含对任何分支的引用,只包含标记指向的提交的ID。
      • (commit id(a.k.a.对象名或sha-1 id)是由十六进制组成的40个字符串。对提交内容进行哈希处理的数字;例如:6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • 分支仅间接发挥作用:
    • 在创建标记时,通过暗示标记将指向的提交:
      • 不为标记指定目标默认为当前分支的最新提交(也称为head);例如:
        • 埃多克斯1〔5〕
      • 将分支名称指定为标记目标默认为该分支最近的提交;例如:
        • 埃多克斯1〔6〕
      • (正如其他人所指出的,您还可以显式地指定提交ID作为标记的目标。)
    • 使用git describe描述当前分支时:
      • git describe [--tags]根据自该分支历史上最近的(可能是轻量级的)标记以来的提交来描述当前分支。
      • 因此,git describe引用的标记可能不会反映最近创建的标记的总体情况。


如果您创建了一个标签,例如

1
git tag v1.0

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

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

1
git tag v1.0 name_of_other_branch

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

或者,通过直接引用某个提交的sha1,您可以将标记放在任何地方,不管是哪个分支。

1
git tag v1.0 <sha1>


标记和分支完全不相关,因为标记引用特定的提交,而分支是对历史最后一次提交的移动引用。树枝断了,标签也挂了。

所以当您标记一个提交时,Git不关心签出哪个提交或分支,如果您向他提供您想要标记的sha1。

我甚至可以通过引用一个分支来标记(然后它将标记分支的尖端),然后说分支的尖端在其他地方(例如,使用git reset --hard),或者删除分支。但是我创建的标签不会移动。


当只调用git tag 而没有任何附加参数时,git将从当前头(即当前分支的头)创建一个新标记。当向这个分支添加额外的提交时,分支头将跟上这些新提交,而标记总是引用相同的提交。

当调用git tag 时,您甚至可以指定用于创建标记的提交。

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


我们可以为过去的一些提交创建一个标记:

1
git tag [tag_name] [reference_of_commit]

如:

1
git tag v1.0 5fcdb03