【发布时间】:2016-01-21 20:51:33
【问题描述】:
假设我做了以下事情:
- 创建分支
X - 创建标签
t(到分支X) - 推送
- 删除分支
X
标记t 会发生什么?它只是漂浮在那里吗?算不算垃圾?
我应该在删除分支本身之前删除所有指向分支的标签吗?
参考
Git 使用两种主要类型的标签:轻量级和带注释的。一种 轻量级标签很像一个不会改变的分支——它是 只是一个指向特定提交的指针。
【问题讨论】:
标签: git git-branch git-tag
假设我做了以下事情:
X
t(到分支X)X
标记t 会发生什么?它只是漂浮在那里吗?算不算垃圾?
我应该在删除分支本身之前删除所有指向分支的标签吗?
Git 使用两种主要类型的标签:轻量级和带注释的。一种 轻量级标签很像一个不会改变的分支——它是 只是一个指向特定提交的指针。
【问题讨论】:
标签: git git-branch git-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)
算不算垃圾?
否,因为该提交仍被标记 t 引用。
如果提交被删除怎么办?
您不会删除提交。您删除指向提交的指针,如果不再引用提交,git 有一天会垃圾收集它们(取决于您的配置)。
即使你删除了所有普通的 refs,比如分支和标签,提交仍然会在 reflog 中被引用一段时间,你可以访问它们,例如重新创建一个分支,标记它们或挑选等。
您可以使用git reflog 查看引用日志。也看看gc.reflogExpireUnreachable和gc.reflogExpire
编辑
如果 git 的对象数据库不知何故损坏了。 来自.git/objects 的文件被删除(例如,您使用文件资源管理器或命令行命令意外删除了它)或 ref 指向不存在的 git 对象 (如提交、树或 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)
请查看Git Internals 以获得更深入的了解。
【讨论】:
v1添加到分支x,那么标签v1在x被删除后是否仍然可用? (考虑旧版本的错误修复,当版本只是 master 上提交的标签。每个版本没有特定的发布分支)
git branch <branchname> v1.
我不是在解决 OP 问题中的特定场景,而是在标题中的问题:指向已删除提交的 git 标签会发生什么?
如果您确实设法删除了由标签引用的提交(不确定如何做到这一点 - 请参阅 René Link's answer),该标签将只是指向无效提交的指针(您可以通过从 .git/refs/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> 删除它。
【讨论】:
如果您删除创建标签的分支,这不会影响标签。标签不包含创建它的位置的引用。
如果您想了解更多关于标签与分支的信息,我建议您查看以下问题:How is a tag different from a branch? Which should I use, here?
【讨论】: