gpt4 book ai didi

git - 是否每个git标记都有关联的提交ID?

转载 作者:太空狗 更新时间:2023-10-29 14:25:35 25 4
gpt4 key购买 nike

我跑了:

$ git log master

我得到:
commit 7940b82568e1d28a76557fbb403c46c3ef3cfe90 (tag: prod-api-2019-04-23, master)
Author: Kent Mills <kent.clark@mwzx.com>
Date: Tue Apr 23 10:33:12 2019 -0700

我想知道-wrt git tags-每个git标记是否都有一个与之关联的唯一提交id?
例如,如果我运行 git tag如何查看这些标记的提交id是什么?像 git tag --full之类的。

最佳答案

标签分为一个或两个部分:
有一个标记名,它是一个引用,很像一个分支名,除了branchb有全名而tagrefs/heads/b有全名。
所有引用都存储一(1)个哈希ID。分支名称被约束为仅存储提交哈希ID,即使有四种对象类型:提交、树、blob和带注释的标记。标记名不受此限制。
如果存储在标记引用中的哈希ID是标记对象的ID,则标记对象本身存储更多数据。数据包括:
标记人姓名;
可选PGP密钥;
另一个Git对象的哈希ID。
这里的另一个git对象通常是commit,但这并不是一个硬性的要求:与标记引用一样,标记对象可以指向任何类型的另一个对象,甚至是另一个标记对象。
当标记名指向标记对象时,git会将其调用为带注释的标记。否则,git调用引用一个轻量级标记。
要将引用名称转换为其对象,请使用t

git rev-parse refs/heads/master
git rev-parse refs/tags/v1.2

例如。默认情况下, refs/tags/t会查找目标对象哈希ID并在此停止,但您可以指示它继续:
后缀 git rev-parse告诉 git rev-parse如果对象本身不是提交,但可能导致提交,请继续工作。如果对象最终导致提交,例如,如果对象是一个标记对象,其目标是另一个标记对象,而第二个标记对象的目标是一个提交,则此“后续”过程将成功,并且 ^{commit}将打印提交的id。如果对象最终指向其他位置(例如,如果对象是标记对象,但此标记对象的目标是blob),则操作失败,并且 git rev-parse会将错误消息打印到stderr,而不会将哈希ID打印到stdout。
后缀 git rev-parsegit rev-parse告诉git跟随标记或提交到它们的树或blob。由于每个commit对象只有一棵树,因此如果名称指向指向commit的标记对象,则 ^{tree}后缀会成功。如果名称直接指向轻量级标记和带注释标记都可能使用的树,则此操作也会成功。只有当标记指向一个blob(直接作为轻量级标记,或通过一些标记对象间接指向)时, ^{blob}后缀才能成功,因为没有定义好的方法可以从提交或树移动到一个特定的blob:树通常包含许多blob散列ID。
后缀 ^{tree}指示 ^{blob}剥离标记。也就是说,如果名称是标记名,而第一级对象是标记对象,那么git应该跟在该对象后面。如果生成的对象是另一个标记对象,那么git也应该跟随该对象。git应该重复此操作,直到标记解析为任何非标记对象任何提交、树或blob。然后 ^{}应该生成非标记对象的散列ID。
可以告诉其他几个git命令剥离标记,有些命令甚至可以在不告诉它们的情况下执行。例如, git rev-parse调用另一个git并让另一个git告诉git它的引用,包括标记名和它们的对象散列id。当他们的git告诉git他们的一个标记名时,他们的git会生成顶级标记对象(如果有的话)和剥离对象散列id。
<hash1> refs/tags/<tag>
<hash2> refs/tags/<tag>^{}

这里, git rev-parse是带注释标记对象的对象id, git ls-remote是通过剥离过程获得的最终非标记对象的对象id(根据定义,必须始终存在这样的对象)。
如果在标记对象的 hash1输出中看不到此注释,则表示它们的标记是轻量级标记,直接指向列有散列ID的提交、树或blob对象。
hash2命令具有 git ls-remote指令以遵循标记:
如果fieldname的前缀是星号
git for-each-ref)并且ref指向标记对象,使用字段的值
在标记对象引用的对象(而不是字段)中
在标记对象中)。
从文档中不清楚这是否完全剥离了一个标记,或者只是降低了一个级别:如果带注释的标记x的目标是带注释的标记y的带注释的标记对象,而带注释的标记y的目标是commit c,那么 *是产生hash y还是hash c?

关于git - 是否每个git标记都有关联的提交ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56860542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com