2

我现在对 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 repo 中看到的一致

如果我运行git checkout v2.3.0,我也会得到相同的提交哈希。甜的。

但是,如果我运行git rev-parse v2.3.0,查看哪个提交哈希与我的标签对齐,我会得到提交哈希85607530aa64da4df34e7160d073df5c2699439b...???

如果我然后尝试检查那个提交哈希,我的代码库仍然会说它在b2ee576083607b7ba451b72642a77ca3309e4ac9(即它没有改变)

据我所知,我有一个奇怪的幻像提交哈希,在我的 git 存储库中找不到,但这似乎指向我的实际提交哈希。这给我带来了问题,因为我有一个依赖于 git rev-parse 正确输出的脚本。

我有 git 版本git version 2.25.1

有人知道这里发生了什么吗?

4

2 回答 2

7

那不是提交哈希。那是带注释标签的哈希 ID , v2.3.0。带注释的标签本身就是对象,因此它们有自己的哈希 ID。就像名称(例如分支和标签名称)一样,它们又指向其他对象——通常直接指向提交。

要将git rev-parse任何标签变成它可能指向的最终对象,请使用^{}后缀,这意味着如果这是一个标签对象,请跟随它到它的目的地,如果那是另一个标签,请继续关注。如果您提供的名称可能指向提交对象以外的其他内容(例如,指向树或 blob 对象)并且您想确保它确实指向提交,请使用^{commit}后缀:

git rev-parse v2.3.0^{commit}

如果标记指向提交以外的任何内容,则会产生错误(非零退出状态),因此请检查。

于 2021-04-02T01:16:32.067 回答
4

有 2 种类型的标签。一个是普通标签,另一个是带注释的标签。正常的只是像分支一样的引用,而带注释的只是像提交这样的对象。

git rev-parse a_normal_tag返回标签引用的对象的哈希值。在大多数情况下,这个引用的对象是一个提交。在极少数情况下,它还可以指向标记对象、blob 对象或树对象。

git rev-parse an_annotated_tag返回标签本身的对象的哈希值。

无论标签类型如何,当您想要获取引用提交的哈希时,请使用git rev-parse some_tag^{}. 正如文档所说,^{}用于递归地取消引用标记,直到找到非标记对象。

于 2021-04-02T01:14:47.993 回答