说我做了以下事情:
X
t
(分支X
)X
标记t
会发生什么?它刚刚漂浮在那里吗?它被认为是垃圾?
在删除分支本身之前,是否应该删除指向分支的所有标记?
Git使用两种主要类型的标签:轻量级和注释。一个 轻量级标签非常像一个不会改变的分支 - 它 只是指向特定提交的指针。
答案 0 :(得分:35)
标签t会发生什么?
假设您从提交x
创建了分支E
,然后使用标记t
标记了该提交。 E.g。
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
答案 1 :(得分:3)
我没有解决OP问题中的特定情况,而是标题中的问题:指向已删除提交的git标记会发生什么?
如果你以某种方式设法删除了一个标记引用的提交(不知道你怎么做 - 请参阅René Link's answer),标记只是一个指向无效提交的指针(你可以测试这可以通过手动编辑.git / refs / tags中的标签来实现。
在这种情况下,- (id)copyWithZone:(NSZone *)zone
{
// Copying code here.
Post *another =[[[self class] allocWithZone:zone] init];
another.id=self.id;
another.category=self.category;
return another;
}
的输出将是这样的:
git tag
Checkout也会产生错误:
$ git tag
error: refs/tags/v1.0 does not point to a valid object!
v1.1
...etc
问题的答案"引用已删除的提交的git标记会发生什么?"没什么。它将保留在那里,指向无效的引用,直到您使用$ git checkout v1.0
fatal: reference is not a tree: v1.0
删除它。
答案 2 :(得分:0)
如果删除了创建标记的分支,则对标记没有影响。标签不包含创建它的位置的参考。
如果您想了解有关标记与分支的更多信息,我建议您查看以下问题:How is a tag different from a branch? Which should I use, here?