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



假设我做了以下操作:

  1. 创建分支X
  2. 创建标签t(到分支X)
  3. 移除X分支

标签t发生了什么?它只是漂浮在那里吗?它被认为是垃圾吗?

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

参考

From Git Basics - Tagging:

Git主要使用两种类型的标签:轻量级标签和注释标签。一个轻量级标记非常像一个不改变的分支——它是

标签t发生了什么?

让我们假设你从一个提交E创建了分支x,然后用t标记该提交。例如

                           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

即使你删除了所有普通的refs,比如分支和标签,提交仍然会在refg中被引用一段时间,你可以访问它们,例如重新创建分支,标记它们或挑选等等。

您可以使用git reflog看到反射。再看看gc.reflogExpireUnreachablegc.reflogExpire


编辑

如果不知道为什么git的对象数据库损坏了。无论是.git/objects中的文件被删除(例如,您使用文件资源管理器或命令行命令意外删除了它),还是ref指向一个不存在的git对象(如commit, tree或blob对象),如果git试图访问这些对象,您将得到错误。

下面列出了当git试图访问一个不存在的对象或者引用一个不存在的对象时可能发生的错误。

  • 提交
    fatal: Could not parse object '<ref-name>'.
    

    的例子:

    fatal: Could not parse object 'master'.
    
  • fatal: unable to read tree <tree-sha1>
    

    的例子:

    fatal: unable to read tree 13a3e0908e4f6fc7526056377673a5987e753fc8
    
  • 斑点

    error: unable to read sha1 file of <blob-name> (<blob-sha1>)
    

    的例子:

    error: unable to read sha1 file of test.txt (e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)
    

我不是解决OP问题中的特定场景,而是标题中的问题:指向已删除提交的git标签会发生什么?

如果你确实设法删除了一个由标签引用的提交(不确定你怎么能做到这一点-参见ren Link的答案),标签将只是一个指向无效提交的指针(你可以通过手动编辑.git/ref/tags中的标签来测试这一点)。

在这种情况下,git tag的输出是这样的:

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

签出也会产生错误:

$ git checkout v1.0
fatal: reference is not a tree: v1.0

所以问题的答案是"git标签引用一个被删除的提交会发生什么?"什么都没有。它将保持在那里,指向一个无效的引用,直到您使用git tag -d <tag>删除它。

如果您删除创建标记的分支,这将对标记没有影响。标记不包含创建它的位置的引用。

如果你想了解更多关于标签和分支的知识,我建议你看看这个问题:标签和分支有什么不同?我应该用哪个呢?

相关内容

最新更新