git rev-parse --short HEAD

4
以下命令是做什么用的?
git rev-parse --short HEAD

答案应该包括:
  1. 一个简短明了的回答,解释这个命令整体上是做什么的
  2. rev-parse 的解释
  3. --short 的解释
  4. HEAD 的解释
该命令的作用是:将 HEAD 指向的提交哈希值输出为短格式。其中,HEAD 表示当前所在的分支的最新提交,rev-parse 是 Git 命令,用于输出指定引用的 SHA-1 校验和。--short 表示只输出短格式的哈希值,而不是完整的 40 位长哈希值。

2
你不应该自己完成作业吗?(如果这不是一个作业问题,那么它确实需要重新表述...) - torek
4
@torek 我不是在为自己问问题。我已经知道答案了。我只是发现 SO 上没有关于这个特定命令的问题,如果有这样的问题,它可能会帮助程序员。 - Alon
1
如果你知道答案,你也应该发布它... - Philippe
1
我认为在Stack Overflow上把每个git命令的文档复制粘贴成一个问题是没有意义的。他们之前有一个网站的文档部分,但已经被废弃了。 - Lasse V. Karlsen
这个回答解决了你的问题吗?git rev-parse 做什么? - Lasse V. Karlsen
此外,“HEAD”是一个单独的问题,与“git rev-parse”的作用不同,请不要同时发布多个问题。 - Lasse V. Karlsen
1个回答

8

git rev-parse --short既可以用来:

应用于HEAD时,它会返回当前检出提交的SHA1的短版本(当HEAd分离时,这不一定是一个分支

您可以在Git v1.6.5-rc0中的commit e3ae4a8613151c93ffce78c674ac91c1ee34eef6中首次看到其在git/git代码库中的使用。

子字符串扩展符号是一种我们迄今尚未采用的Bashism。
请改用'git rev-parse --short',因为它还处理唯一缩写超过7个字符的情况。

所以,不要使用以下方式:

${sub1sha1:0:7}

使用:

sub1sha1_short=$(cd clone3/sub1 && git rev-parse --short HEAD)
$sub1sha1_short

您可以在 commit e8f21ca, 2013年6月, Git v1.8.4-rc0 中找到它的使用,用于bash提示符中打印唯一的分离头缩写对象名称。当按照$GIT_PS1_DESCRIBE环境变量描述分离头失败时,__git_ps1() 运行 cut -c1-7 .git/HEAD 在提示符中显示 7 个十六进制缩写提交对象名称。显然,这既不尊重core.abbrev,也不会生成唯一的对象名称。通过使用“git rev-parse --short HEAD”来解决此问题,并调整相应的测试以使用非标准数量的十六进制数字。因为--short将计算SHA的最小长度以使其不含糊不清,所以它应该是git rev-parse使用的最后一个选项。

请查看提交 e3e0b93,也是2013年6月,Git v1.8.4-rc0

bash提示符:将'git rev-parse'与分离头合并

当使用环境变量$GIT_PS1_DESCRIBE描述脱离HEAD时失败时,__git_ps1()现在运行'$(git rev-parse --short HEAD)'命令替换以获取缩写的脱离HEAD提交对象名称。
这会导致fork()一个子shell和fork()+exec()一个git进程的开销。
通过将此命令替换与“主”'git rev-parse'执行结合起来以获取.git目录和其他内容的路径来避免这种开销。
这意味着即使不需要,我们也会查找缩写的提交对象名称,因为我们处于分支上或可以描述脱离HEAD。
然而,这并不重要,因为一旦'git rev-parse'启动并运行以满足所有其他查询,查找缩写的提交对象名称的额外开销就不可测量,因为它在噪音中丢失了。
但是,有一个注意点,当我们处于未出生的分支上时,因为在这种情况下HEAD没有指向有效的提交,所以查询缩写的提交对象名称会失败。
因此,在任何情况下,'--short HEAD'都必须是'git rev-parse'的最后选项,以便即使在未出生的分支上也可以获取所有其他必要的提示信息。
此外,在这种情况下,仅在'git rev-parse'没有任何错误退出时才解析它,因为只有在这种情况下'git rev-parse'不会输出包含缩写提交对象名称的最后一行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接