git - 指向已删除提交的 Git 标签会发生什么

标签 git git-branch git-tag

假设我做了以下事情:

  1. 创建分支X
  2. 创建标签t(到分支X)
  3. 推送
  4. 删除分支 X

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

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

引用

来自 Git Basics - Tagging :

Git uses two main types of tags: lightweight and annotated. A lightweight tag is very much like a branch that doesn’t change – it’s just a pointer to a specific commit.

最佳答案

What happen to tag 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)

is it considered as garbage?

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

What if the commit is removed?

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

参见 git gc

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

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


编辑

如果 git 的对象数据库以某种方式损坏.git/objects 中的文件已被删除(例如,您使用文件资源管理器或命令行命令不小心将其删除)或 ref 指向不存在的 git 对象(如提交、树或 blob 对象),如果 git 尝试访问这些对象,您将收到错误。

这里列出了当 git 尝试访问不存在的对象或引用不存在的对象时可能发生的错误。

  • promise

    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
    
  • Blob

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

    例子:

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

看看Git Internals以获得更深入的了解。

关于git - 指向已删除提交的 Git 标签会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283350/

相关文章:

git - 将 master 分支 merge 到另一个 Git 分支不会删除分支中的文件

git-branch - git:列出悬挂标签

windows - 如何在 Windows 上获取最新的 git 标签?

git - 创建 Git 标签时自动运行 Git 钩子(Hook)

git - 有没有办法使用 github API v3 获取给定 repo 的最新标签

git - 我可以从一个绝对没有安装 Git 命令的简单文件服务器克隆吗?

git - 删除两个提交之间的 git 提交

android - 在 Android Studio 或 git/github 中强制执行编码风格并在团队之间发出警告和 lint-free

git - 如何在 Git 中获取当前分支名称?

git - 从存储库中删除不正确的 merge