git 标签究竟指向什么?

What exactly does a git tag point to?

git 标记是否指向特定的 sha1、特定分支上的特定提交或其他内容?

这个问题和非常相似,但是我找不到我要找的答案。

让我们使用以下示例:

            C (Branch, cut with same commit history)
            |             
A-----B-----C (Main)

我正在尝试帮助自己回答以下问题:

  1. 如果我在切割 Branch 之前在 Main 上标记提交 C,我的标记是否适用于 Main and/or Branch?

  2. 如果我在切割分支后在 Main 上标记提交 C,我的标记是否适用于两个 Main and/or 分支?

  3. 如果我在剪切 Branch 后在 Branch 上标记提交 C,我的标记是否适用于 Main and/or Branch?

  4. 如果有不同的提交历史会怎样?例如,以下是否有任何变化:

                C-----D-----E (tag on E in either the main branch or this branch)
                |
    A-----B-----C-----E
    

编辑:看起来 #4 是不可能的,因为如果父项不同,则提交不能具有相同的散列

一个分支一个提交指针。标记还指向提交。如果将提交合并到不同的分支中,这不会改变。

普通标签只是特定 Git 对象的 name,通常是提交,但可以是树、blob 或任何其他具有哈希。

带注释的标签本身就是一个独特的对象,它包含对另一个对象的引用。

关于您的问题:

  1. 它适用于 C。MainBranch 目前只是同一提交的另外两个名称。但是提交到任何一个分支都不会影响标签将引用的内容;它将保留为提交 C 的名称。

  2. 都没有。标签指的是 C,而不是任何可能也指 C 的分支头。

  3. 都没有。指的是C.

  4. 分支历史没有任何意义。你的两个 C 是不同的提交,你的两个 E 也是。该标签将准确引用两个 Es 中的 one

简而言之:标签通常独立于分支。

分支是指向提交的指针。
tag也是一个指向commit的指针,跟branch没有关系。
区别在于标签是不可变的,它总是指向同一个提交。并且分支的提交会在执行命令git resetgit commit

时改变