我使用git tag --force
来移动标记,现在我想知道标记移动之前的位置。
我在手册页或Pro Git § 2.6 Git Basics - Tagging网站上找不到任何内容。
之前似乎没有人发布过这个问题。
答案 0 :(得分:2)
唯一可以确定的方法是事先在标签上保留标签(标签?)。
如评论中所述,有两种标签:"注释"和"轻量级"。
在这两种情况下,对于名为 T
的标记,git会创建名为refs/tags/T
的引用。对于轻量级标记,此名称直接指向某个提交。对于带注释的标签,git首先创建一个带注释的标签"存储库中的对象(它以与提交,树或blob相同的方式存储),然后具有引用名称 - 否则它只是一个"轻量级标记" -point到带注释的标记宾语。然后,带注释的标记对象指向链中的下一个链接,通常是提交对象。
更新引用时,git会检查logs
目录(通常为.git/logs
)以查看是否有与ref-name对应的文件。如果您查看.git/logs
,您将看到名为HEAD
的文件和名为refs
的目录。在refs
下方,有一个名为heads
的目录,在refs/heads
下,每个分支都有一个文件。例如,refs/heads/master
文件包含分支master
的reflog。
默认情况下,没有.git/logs/refs/tags
目录,因此标签没有文件,因此标签更新没有reflog。这是因为标签不是意图移动。他们应该是永久性的;这是标记名称和分支名称之间的主要属性:分支提示移动,标记不是。
但是,如果您打算移动标记,然后想要知道它曾经在哪里,那么可以创建.git/logs/tags
,然后在其中创建一个包含标记的文件 - 名称。完成后,标记更新将写入reflog条目。显然,只有事先做好计划,这才有用。
还有另一种直接恢复方式"其中标记用于指向":找到标记的SHA-1值的旧记录。那就是reflog会做什么,但如果你没有,可能你有一个克隆的存储库,也许那个克隆有旧的标签。或者你可能会很幸运,并且有一个窗口,例如,在回滚中仍然显示SHA-1。
如果标记是带注释的标记,则可以使用git fsck
在存储库中搜索不再具有引用的带注释标记对象。这通常会产生很多输出。 "悬垂斑点"在活动存储库中非常正常,它们会在您提交git add
之后发生,然后git add
提交不同版本。
" Dangling承诺"当提交被放弃并且其reflog条目到期时发生。这里要寻找的是一个"悬空标签":
dangling tag 20e14672ee2253d38c1001179d8f17688d47059c
这将是带注释的标签对象的SHA-1;你可以添加一个新的引用(例如一个新的轻量级标记,或者重新强制使用旧标记或其他标记),以确保它不会被git gc
- ed和删除。