指向已删除提交的Git标记会发生什么

ida*_*hmu 37 git git-tag git-branch

说我做以下事情:

  1. 创建分支 X
  2. 创建标签t(分支X)
  3. 删除分支 X

标签会发生什么t?它刚刚漂浮在那里吗?它被认为是垃圾吗?

在删除分支本身之前,是否应该删除指向分支的所有标记?

参考

来自Git Basics - 标记:

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.reflogExpireUnreachablegc.reflogExpire

  • 是的,只要您不删除标签,提交仍然被引用,因此不会被删除。如果您再次需要分支,您可以创建一个从标记的提交开始的分支,例如“gitbranch <branchname> v1”。 (3认同)

161*_*903 7

我不是在解决 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>.

  • 删除分支不会删除任何提交。只有任何标记、分支或其他引用无法访问的提交才会被删除,并且只有在垃圾收集运行之后才会被删除。 (5认同)
  • Renè 的示例显示了提交上的标记,该标记存在于删除分支之后。如果标记位于分支 X 上的以下提交之一(示例中未显示),该怎么办?标签是否指向从合并创建的提交?例如,您在功能分支中的其中一个提交上具有标记,将该功能分支合并到开发中,最后删除该功能分支。 (2认同)