git标签到底指向什么?

问题描述

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

这个问题与What happen to Git tags pointing to a removed commit极为相似,但是我在那里找不到想要的答案。

让我们使用以下示例:

shutdown

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

  1. 如果我在剪切Branch之前在Main上标记了commit C,我的标记是否适用于Main和/或Branch?

  2. 如果我在剪切Branch后标记了在Main上的commit C,我的标记是否同时适用于Main和/或Branch?

  3. 如果我在剪切了Branch后标记了在Branch上的commit C,我的标记是否同时适用于Main和/或Branch?

  4. 如果提交历史不同,会发生什么?例如,是否发生以下变化:

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

编辑:看起来#4是不可能的,因为如果父对象不同,则提交不能具有相同的哈希值

解决方法

普通标签只是特定Git对象的名称,通常是一个提交,但可以是树,blob或任何其他带有哈希的对象。

带注释的标签本身就是一个不同的对象,其中包含对另一个对象的引用。

关于您的问题:

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

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

  3. 都不是。指的是C。

  4. 分支历史实际上没有意义。您的两个C与您的两个E是不同的提交。标签将恰好指向两个E中的一个

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

,

分支提交指针。标签也指向提交。如果将提交合并到另一个分支,则不会改变。

,

分支是指向提交的指针。
标签也是指向提交的指针,与分支无关。
区别在于,标记是不可变的,它始终指向同一提交。当执行命令git resetgit commit

时,分支的提交将改变