假设我做了以下事情:
- 创建分支
X
- 创建标签
t
(到分支X
) - 推送
- 删除分支
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.reflogExpireUnreachable
和 gc.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/