git rev-parse是做什么的?

465

git rev-parse是什么意思?

我阅读了手册,但它引起了更多问题。比如:

挑选和整理参数

整理? 这是什么意思?

我正在将其用作修订说明符的解析器(到SHA1),例如

git rev-parse HEAD^
或者
git rev-parse origin/master

这是命令的目的吗?如果不是,使用它来实现这个目的是否正确?


4
就我所看到的man手册,rev-parse主要是用来解析修订/对象名称,给其他命令使用的内部工具。你现在做的事情基本上就是rev-parse命令的目的。你也可以使用它来规范化命令行,这样实际程序就不必理解Git的复杂对象名称语法(你可以在调用实际程序之前使用git rev-parse来更改或处理命令行中的某些参数)。 - user824425
请参阅 https://github.com/git/git/commit/b2a2c4d8099c69ec997e51cac489c0947ad17956。 - VonC
196
git rev-parse 的 man 手册极难理解。即使过去5年里没有人费心将那些行话改写成易懂的语言,我还是感到惊讶。 - not2qubit
8
我:谢谢你澄清,我一直感觉自卑。 Linus Torvalds:我重新阅读了它,你哪部分没理解? - Brain2000
4个回答

376

git rev-parse 是一个辅助的 plumbing 命令,主要用于操作。

最常见的使用方式是根据修订指定符打印 SHA1 哈希值。此外,它还有多种选项来格式化输出,例如 --short 用于打印较短的唯一 SHA1。

还有其他用例(在构建在 git 之上的脚本和其他工具中),我用过:

  • --verify 以验证指定对象是否为有效的 git 对象。
  • --git-dir 以显示 .git 目录的绝对/相对路径。
  • 使用 --is-inside-git-dir 检查当前是否在存储库内或使用 --is-inside-work-tree 检查当前是否在工作树内。
  • 使用 --is-bare-repository 来检查 repo 是否为空。
  • 可以根据远程情况(使用 --remote)筛选分支(--branches)、标签(--tags) 和 refs 的 SHA1 哈希值。
  • --parse-opt 用于在脚本中规范化参数(类似于 getopt)并打印可用于 eval 的输出字符串。

Massage 意味着可以将信息从一种形式转换为另一种形式,即一个变换命令。这里是我能想到的一些快速示例:

  • 将分支或标记名称转换成其指向的提交的 SHA1 值,以便将其传递到仅接受提交的 SHA1 值的 plumbing 命令中。
  • 将修订范围 A..B 转换为基础 plumbing 命令的等效参数,例如 B ^A,以供 git loggit diff 使用。

181
仅就命令名rev-parse的词源进行解释,Git 在 pluming 命令中一直使用rev一词表示“revision”(版本),通常用于表示 commit 的 40 个字符的 SHA1 hash。例如,命令rev-list会打印分支或其他内容的 40 个字符的 commit hash 列表。
在这种情况下,该名称可能会扩展为parse-a-commitish-to-a-full-SHA1-hash。尽管该命令具有 Tuxdude 答案中提到的多种辅助功能,但它的名字似乎是将类似分支名称或缩写哈希值等用户友好引用转换为最适用于许多编程/水管目的的明确的 40 字符 SHA1 hash 的用例。
我知道我曾经相当长一段时间认为它是 "reverse-parse",直到我弄清楚了并且理解了 "massaging" 和 "manipulation" 这些术语才解决了同样的问题 :)
总之,我发现“解析到修订版本”的概念是一种令人满意的思考方式,并且是一个可靠的概念,当我需要这种类型的命令时,可以使其深入人心。在脚本化 Git 中,您经常将用户友好的提交引用作为用户输入,并希望在接收到输入后尽快将其解析为经过验证和明确的工作引用。否则,输入翻译和验证往往会通过脚本进行扩散。

15
感谢您的解释,我之前完全不理解git-docs上这部分的内容:http://git-scm.com/docs/git-rev-parse - Jacob McKay
1
你能给我们举个例子来说明你之前提到的“消息传递”和“操作”吗? - Bo Chen
10
换句话说,git rev-parsegit revision-parse的缩写。它接受给定的输入并返回相应的40个字符的修订版本ID。 - Jonathan Benn
9
Git文档本身就像管道系统,而这个答案就像卫生器具。 - David Chen
10
哇,原来 git rev-parse 很简单易懂。为什么手册中要用这样的象形文字来描述呢? - GMA

63

git rev-parse 命令也可用于通过使用 --abbrev-ref 标志获取当前分支名称,例如:


git rev-parse --abbrev-ref HEAD

能否以这种方式获取提交消息? - Leo DroidCoder
3
尝试使用命令 git log --format=%B -n 1 <revision>。该命令的作用是显示指定版本的提交信息,并且只显示提交信息中的正文部分。请注意,这里的 <revision> 应替换为你要查询的版本号或者分支名。 - hipyhop
有什么方法可以确保这实际上是一个分支吗? - DylanYoung

25

TLDR:

它可以帮助你找出当前HEAD的提交ID(即您正在查看的当前提交)。

git rev-parse HEAD

或者如果你想要更短的提交

git rev-parse --short HEAD

如果你想找到另一个分支中最新的提交,可以执行以下操作

git rev-parse <local-branch-name>
git rev-parse origin/<remote-branch-name>


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