我现在对git有一些奇怪的行为。
我有一个代码库,它有一个提交标记的v2.3.0
如果我运行git log
,我可以看到我最近的提交哈希是:
commit b2ee576083607b7ba451b72642a77ca3309e4ac9 (HEAD, tag: v2.3.0, origin/staging, origin/master, origin/develop, origin/HEAD, master)
Author: B <b@b.com>
Date: Thu Apr 1 16:53:48 2021 +0000
酷!这与我在git回购和中看到的一致
如果我运行git checkout v2.3.0
,我也会得到相同的提交哈希。含糖的
但是,如果我运行git rev-parse v2.3.0
,为了查看哪些提交哈希行与我的标记一致,我会得到提交哈希85607530aa64da4df34e7160d073df5c2699439b
。。。???
如果我尝试检查提交哈希,我的代码库仍然会说它在b2ee576083607b7ba451b72642a77ca3309e4ac9
(即它没有改变(
据我所知,我有一个奇怪的幻影提交哈希,在我的git repo中找不到,但它似乎指向了我的实际提交哈希。这给我带来了问题,因为我有一个依赖于git-rev解析的正确输出的脚本。
我有数字版本git version 2.25.1
有人知道这里发生了什么吗?
这不是提交哈希。这是注释标签的散列ID,v2.3.0
。带注释的标签本身就是对象,所以它们有自己的散列ID。与名称(例如分支和标记名称(一样,它们依次指向其他对象——通常直接指向提交。
要使git rev-parse
将任何标记转换为它可能指向的最终对象,请使用^{}
后缀,这意味着如果这是一个标记对象,请跟随它到达目的地,如果这是另一个标记,请继续跟随。如果您提供的名称可能指向commit对象以外的其他对象,例如指向树或blob对象,并且您希望确保它确实指向commit,请使用^{commit}
后缀:
git rev-parse v2.3.0^{commit}
如果标记指向除提交之外的任何内容,这将产生一个错误(非零退出状态(,因此请检查该错误。
CCD_ 12返回标签引用的对象的散列。这个引用的对象在大多数情况下都是提交。在极少数情况下,它也可以指向标记对象、blob对象或树对象。
git rev-parse an_annotated_tag
返回标签本身的对象的散列。
如果您想获得引用的提交的哈希,而不考虑标记类型,请使用git rev-parse some_tag^{}
。正如文档所说,^{}
用于递归地取消引用标记,直到找到一个非标记对象。