ida*_*hmu 37 git git-tag git-branch
说我做以下事情:
X
t
(分支X
)X
标签会发生什么t
?它刚刚漂浮在那里吗?它被认为是垃圾吗?
在删除分支本身之前,是否应该删除指向分支的所有标记?
Git使用两种主要类型的标签:轻量级和注释.轻量级标记非常类似于不会更改的分支 - 它只是指向特定提交的指针.
Ren*_*ink 44
标签t会发生什么?
假设您x
从提交创建了分支E
,然后使用标记标记了该提交t
.例如
x (branch)
|
V
A-----B------C------D------E
^
|
t (tag)
Run Code Online (Sandbox Code Playgroud)
如果删除分支x
,则标记没有任何反应t
.
git branch -D x
Run Code Online (Sandbox Code Playgroud)
标签仍然指向提交E
.
A-----B------C------D------E
^
|
t (tag)
Run Code Online (Sandbox Code Playgroud)
它被认为是垃圾吗?
不,因为提交仍然由标记引用t
.
如果提交被删除怎么办?
您不删除提交.你删除指向提交的指针,如果不再引用提交,git会在某天垃圾收集它们(取决于你的配置).
看到 git gc
即使你删除了所有普通的引用,比如分支和标签,提交仍然会在reflog中引用一段时间,你可以访问它们,例如再次创建一个分支,标记它们或者挑选樱桃等等.
你可以看到reflog使用git reflog
.另外看看gc.reflogExpireUnreachable
和gc.reflogExpire
我不是在解决 OP 问题中的特定场景,而是在标题中的问题:指向已删除提交的 git 标签会发生什么?
如果您确实设法删除了由标签引用的提交(不确定如何做到这一点 - 请参阅René Link 的回答),则该标签将只是指向无效提交的指针(您可以通过手动编辑来自 .git/refs/tags 的标签)。
在这种情况下,输出git tag
将是这样的:
$ git tag
error: refs/tags/v1.0 does not point to a valid object!
v1.1
...etc
Run Code Online (Sandbox Code Playgroud)
结帐也会产生错误:
$ git checkout v1.0
fatal: reference is not a tree: v1.0
Run Code Online (Sandbox Code Playgroud)
所以这个问题的答案“引用已删除提交的 git 标签会发生什么?” 没什么。它将保留在那里,指向无效的引用,直到您使用git tag -d <tag>
.