假设我按照以下步骤操作:
- 创建分支
X
- 创建标签
t
(针对分支X
) - 推送
- 删除分支
X
标签 t
会发生什么?它只是悬浮在那里吗?还是被认为是垃圾?
我应该在删除分支本身之前删除指向该分支的所有标签吗?
参考资料
来自Git 基础 - 标签:
Git 使用两种主要类型的标签:轻量级标签和附注标签。轻量级标签非常类似于不会改变的分支 - 它只是指向特定提交的指针。
假设我按照以下步骤操作:
X
t
(针对分支 X
)X
标签 t
会发生什么?它只是悬浮在那里吗?还是被认为是垃圾?
我应该在删除分支本身之前删除指向该分支的所有标签吗?
来自Git 基础 - 标签:
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
即使你删除了所有普通引用,如分支和标签,这些提交仍将在 reflog 中一段时间内被引用,你可以访问它们,例如重新创建分支、打标签或者挑选等等。
你可以使用git reflog
查看 reflog。还要看一下 gc.reflogExpireUnreachable
和 gc.reflogExpire
编辑
如果一些方式导致 Git 的对象数据库损坏。或者一个文件从 .git/objects
被删除(例如,您意外地使用文件浏览器或命令行命令删除了它),或者一个引用指向不存在的 Git 对象(如提交、树或 blob 对象),如果 Git 尝试访问这些对象,你将会得到错误信息。
下面是当 Git 尝试访问不存在的对象或引用不存在的对象时可能出现的错误列表。
commit
fatal: Could not parse object '<ref-name>'.
example:
fatal: Could not parse object 'master'.
tree
fatal: unable to read tree <tree-sha1>
example:
fatal: unable to read tree 13a3e0908e4f6fc7526056377673a5987e753fc8
blob
error: unable to read sha1 file of <blob-name> (<blob-sha1>)
example:
error: unable to read sha1 file of test.txt (e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)
请查看Git内部原理,以深入了解。
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 tag -d <tag>
将其删除。
v1
添加到分支x
中,那么在删除x
之后,标记v1
仍然可用吗?(考虑旧版本的错误修复,当这些版本只是主提交上的标记时,没有针对每个版本的特定发布分支) - Smartskaft2git branch <branchname> v1
。 - René Link