能够使用git tag恢复已删除的分支

4
我有一个测试存储库,其中包括主分支和测试分支。我在测试分支中进行了一些更改,并标记了测试分支。然后我删除了测试分支(没有与主分支合并)。令人惊讶的是,当我尝试使用先前创建的标记进行检出时,我能够获取我之前删除的测试分支(当然是在“无分支”的DETACHED HEAD状态下)。这是如何可能的?有人能帮我理解吗?

1
你期望什么?当你标记一个提交时,无论它在哪个分支上,你都可以通过标记返回到该提交。 - knittl
@knittl,我来自CVS背景,我本以为一旦我删除分支,该分支上提交的标签也会被删除。 - Shunya
不,标签是永久的,是Git中垂直于分支的概念。两者都可以独立存在。 - knittl
使用git-reflog来完成这种任务。 - kostix
1个回答

10

操作完成后(例如,使用 git reflog),Git 对象不会立即删除。您必须显式使用 git gc(它也调用 git prune)手动删除它们,或等待由 gc.auto 启用的 gc.pruneexpire 控制的一段时间自动修剪它们。

此外,仅当没有引用指向对象时,对象才被永久删除,在这种情况下,您仍然有一个标签在上面,因此提交及其历史记录得以保留。

请检查此命令输出:

git log --oneline --decorate --graph --all

它将为您提供有关存储库的概述,您在这里看到的提交不会被垃圾回收器永久删除。


这意味着我创建的标签是一个引用。如果是这样,那么当我使用该标签进行检出时,为什么会以DETACHED HEAD状态检出?根据我的理解,当HEAD没有指向任何引用(标签或分支),而是指向提交哈希(提交的SHA1)时,就会出现DETACHED HEAD状态。你能帮我更好地理解吗? - Shunya
1
这是一个“分离的头”,因为它不属于任何分支,你已经删除了它。 - KurzedMetal
致命错误:无法识别参数:--online ?? git 1.8.x,Win7 - Number8
抱歉,我的意思是 --oneline,它使命令每个提交只打印一行。谢谢。 - KurzedMetal
最好的参考资料是:Git References - mgarciaisaia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接