使用 git rev-parse <tag>的错误提交哈希



我现在对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^{}。正如文档所说,^{}用于递归地取消引用标记,直到找到一个非标记对象。

最新更新