Git标签只适用于当前分支吗?
我目前正在使用一个有多个分支的仓库。
当我创build一个标签时,该标签是否指向当时的分支?
换句话说:每当我创build一个标签,我是否需要切换到该分支内的所需分支和标签,以便标签在那个时间点引用该分支?
如果你通过例如创build一个标签
git tag v1.0
该标记将引用您当前所在分支的最近提交。 你可以改变分支并在那里创build一个标签。
您也可以在标记时参考其他分支,
git tag v1.0 name_of_other_branch
这将创build标签到另一个分支的最近提交。
或者你可以把标签放在任何地方,不pipe是哪个分支,直接引用某个提交的SHA1
git tag v1.0 <sha1>
CharlesB的答案和Helmbert的答案都是有帮助的,但是花了我一些时间去了解它们。 这是另一种方式:
- 标签是指向提交的指针 ,并且提交独立于分支而存在 。
- 理解标签与分支没有直接关系很重要 – 他们只能识别一个提交 。
- 这种承诺可以指向任何数量的分支 – 也就是说,它可以是任何分支的历史的一部分 – 包括没有。
- 因此,运行
git show <tag>
查看标签的详细信息不包含任何分支的引用,只有标签指向的提交ID。- (提交ID(也称为对象名称或SHA-1 ID)是由hex数字组成的40个字符的string,这些数字是提交内容的散列;例如:
6f6b5997506d48fc6267b0b60c3f0261b6afe7a2
)
- (提交ID(也称为对象名称或SHA-1 ID)是由hex数字组成的40个字符的string,这些数字是提交内容的散列;例如:
- 理解标签与分支没有直接关系很重要 – 他们只能识别一个提交 。
- 分支机构间接起作用 :
- 在创build标签时 ,通过暗示标签将指向的提交 :
- 不指定标签的目标,默认为当前分支的最近提交(又名HEAD); 例如:
-
git tag v0.1.0 # tags HEAD of *current* branch
-
- 指定分支名称作为标签目标,默认为该分支最近的提交; 例如:
-
git tag v0.1.0 develop # tags HEAD of 'develop' branch
-
- (正如其他人所指出的,你也可以明确指定一个提交ID作为标签的目标。)
- 不指定标签的目标,默认为当前分支的最近提交(又名HEAD); 例如:
- 当使用
git describe
来描述当前分支时:-
git describe [--tags]
描述了分支历史中最近[可能是轻量级]标签的提交方面的当前分支。 - 因此, 由
git describe
引用的标签可能并不反映最近创build的标签整体 。
-
- 在创build标签时 ,通过暗示标签将指向的提交 :
标签和分支是完全不相关的,因为标签引用了特定的提交,而分支是对历史上次提交的移动引用。 分支去,标签停留。
所以,当你提交一个提交时,如果你提供了你想要标记的SHA1,那么git并不关心哪个提交或分支被检出。
我甚至可以通过引用一个分支来标记(然后标记分支的末端),然后说分支的提示是在其他地方(例如git reset --hard
),或者删除分支。 我创build的标签不会移动。
当只调用git tag <TAGNAME>
而没有任何附加参数时,Git会从当前的HEAD(即当前分支的HEAD)创build一个新标签。 当向这个分支添加额外的提交时,分支HEAD将跟上这些新的提交,而标记总是指向相同的提交。
当调用git tag <TAGNAME> <COMMIT>
,甚至可以指定用于创build标签的提交。
无论如何,标签仍然只是一个“指针”,而不是一个分支。
我们可以为过去的一些提交创build一个标签:
提交的git标签tag_name引用
例如:git tag v1.0 5fcdb03