211

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

当我创建标签时,该标签是否引用当时的分支?

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

4

7 回答 7

263

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可能不会反映最近创建的标签整体
于 2014-11-26T16:31:50.973 回答
195

如果您通过例如创建标签

git tag v1.0

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

您也可以在标记时仅参考另一个分支,

git tag v1.0 name_of_other_branch

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

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

git tag v1.0 <sha1>
于 2013-01-30T21:00:49.147 回答
48

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

因此,当您标记提交时,git 并不关心签出哪个提交或分支,如果您向他提供您想要标记的 SHA1。

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

于 2013-01-30T20:56:18.343 回答
10

当调用git tag <TAGNAME>不带任何附加参数时,Git 将从您当前的 HEAD(即您当前分支的 HEAD)创建一个新标签。当向这个分支添加额外的提交时,分支 HEAD 将跟上那些新的提交,而标签总是指向同一个提交。

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

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

于 2013-01-30T20:58:46.873 回答
6

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

git tag [tag_name] [reference_of_commit]

例如:

git tag v1.0 5fcdb03
于 2017-04-20T11:45:10.633 回答
3

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

git tag <tag>

并使用以下命令推送分支:

git push origin --tags
于 2020-05-24T08:52:55.707 回答
0

如果你想从一个类似release/yourbranchetc 的分支创建一个标签那么你应该使用类似的东西

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

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

git push origin YOUR_TAG_VERSION_OR_NAME
于 2020-03-11T14:08:16.907 回答