Do Git tags only apply to the current branch?
我目前正在使用一个具有多个分支的存储库。
当我创建一个标记时,该标记是否引用了当时的分支?
换句话说:每当我创建一个标记时,是否需要切换到所需的分支并在该分支内标记,以便标记在该时间点引用该分支?
Charlesb的答案和Helmbert的答案都很有用,但我花了一段时间才理解它们。另一种说法是:
- 标记是指向提交的指针,提交独立于分支存在。
- 重要的是要理解标记与分支没有直接的关系——它们只标识提交。
- 该提交可以从任意数量的分支中指向,也就是说,它可以是任意数量分支历史的一部分,包括无分支。
- 因此,运行
git show 查看标记的详细信息不包含对任何分支的引用,只包含标记指向的提交的ID。- (commit id(a.k.a.对象名或sha-1 id)是由十六进制组成的40个字符串。对提交内容进行哈希处理的数字;例如:
6f6b5997506d48fc6267b0b60c3f0261b6afe7a2 )
- (commit id(a.k.a.对象名或sha-1 id)是由十六进制组成的40个字符串。对提交内容进行哈希处理的数字;例如:
- 重要的是要理解标记与分支没有直接的关系——它们只标识提交。
- 分支仅间接发挥作用:
- 在创建标记时,通过暗示标记将指向的提交:
- 不为标记指定目标默认为当前分支的最新提交(也称为head);例如:
- 埃多克斯1〔5〕
- 将分支名称指定为标记目标默认为该分支最近的提交;例如:
- 埃多克斯1〔6〕
- (正如其他人所指出的,您还可以显式地指定提交ID作为标记的目标。)
- 不为标记指定目标默认为当前分支的最新提交(也称为head);例如:
- 使用
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。
我甚至可以通过引用一个分支来标记(然后它将标记分支的尖端),然后说分支的尖端在其他地方(例如,使用
当只调用
当调用
无论如何,标记仍然只是指向某个提交(而不是分支)的"指针"。
我们可以为过去的一些提交创建一个标记:
1 | git tag [tag_name] [reference_of_commit] |
。
如:
1 | git tag v1.0 5fcdb03 |