指向已删除提交的Git标记会发生什么

时间:2015-10-22 14:21:18

标签: git git-branch git-tag

说我做了以下事情:

  1. 创建分支X
  2. 创建代码t(分支X
  3. 删除分支X
  4. 标记t会发生什么?它刚刚漂浮在那里吗?它被认为是垃圾?

    在删除分支本身之前,是否应该删除指向分支的所有标记?

    参考

    来自Git Basics - Tagging

      

    Git使用两种主要类型的标签:轻量级和注释。一个   轻量级标签非常像一个不会改变的分支 - 它   只是指向特定提交的指针。

3 个答案:

答案 0 :(得分:35)

  

标签t会发生什么?

假设您从提交x创建了分支E,然后使用标记t标记了该提交。 E.g。

                           x (branch)
                           |
                           V             
A-----B------C------D------E
                           ^
                           |
                           t (tag)

如果删除分支x,则标记t没有任何反应。

git branch -D x

标记仍然指向提交E

A-----B------C------D------E
                           ^
                           |
                           t (tag)
  

是否被视为垃圾?

不,因为提交仍然由标记t引用。

  

如果删除提交怎么办?

您不会删除提交。你删除指向提交的指针,如果不再引用提交,git会在某天垃圾收集它们(取决于你的配置)。

请参阅git gc

即使您删除了所有普通引用,例如分支和标记,提交仍将在reflog中引用一段时间,您可以访问它们,例如再创一个分支,标记它们或挑选樱桃等等。

您可以使用git reflog查看reflog。另请查看gc.reflogExpireUnreachablegc.reflogExpire

答案 1 :(得分:3)

我没有解决OP问题中的特定情况,而是标题中的问题:指向已删除提交的git标记会发生什么?

如果你以某种方式设法删除了一个标记引用的提交(不知道你怎么做 - 请参阅René Link's answer),标记只是一个指向无效提交的指针(你可以测试这可以通过手动编辑.git / refs / tags中的标签来实现。

在这种情况下,- (id)copyWithZone:(NSZone *)zone { // Copying code here. Post *another =[[[self class] allocWithZone:zone] init]; another.id=self.id; another.category=self.category; return another; } 的输出将是这样的:

git tag

Checkout也会产生错误:

$ git tag
error: refs/tags/v1.0 does not point to a valid object!
v1.1
...etc

问题的答案"引用已删除的提交的git标记会发生什么?"没什么。它将保留在那里,指向无效的引用,直到您使用$ git checkout v1.0 fatal: reference is not a tree: v1.0 删除它。

答案 2 :(得分:0)

如果删除了创建标记的分支,则对标记没有影响。标签不包含创建它的位置的参考。

如果您想了解有关标记与分支的更多信息,我建议您查看以下问题:How is a tag different from a branch? Which should I use, here?