git 需要能够在许多常见操作期间识别提交
https://git-scm.com/docs/git-rev-parse
有多种方法可以识别提交。您可以使用分支、标记、提交 sha1 或表达式。例如:
git log HEAD
HEAD 最终会解析为特定的提交,您将获得相应的日志。你也可以说:
git log master
master 是一个分支,它也将解析为特定的提交。
git log fd72e9c99312
现在这是实际的提交。
以下文档就是您要查找的内容。取自http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html 的git-rev-parse 命令文档。
指定修订
修订参数通常但不一定会命名提交对象。他们使用所谓的扩展 SHA1 语法。以下是拼写对象名称的各种方法。此列表末尾附近列出的用于命名提交中包含的树和 blob。
完整的 SHA1 对象名称(40 字节十六进制字符串),或存储库中唯一的子字符串。例如。如果您的存储库中没有对象名称以 dae86e 开头的其他对象,则 dae86e1950b1277e545cee180551750029cfe735 和 dae86e 都会命名同一个提交对象。
来自 git-describe 的输出;即一个最接近的标签,可选地后跟一个破折号和一些提交,后跟一个破折号、一个 g 和一个缩写的对象名称。
一个符号引用名称。例如。 master 通常表示 $GIT_DIR/refs/heads/master 引用的提交对象。如果你碰巧有 head/master 和 tags/master,你可以明确地说 head/master 来告诉 git 你指的是哪一个。当有歧义时,a 会通过以下规则中的第一个匹配来消除歧义:
如果 $GIT_DIR/ 存在,那就是你的意思(这通常只对 HEAD、FETCH_HEAD、ORIG_HEAD 和 MERGE_HEAD 有用);
否则,$GIT_DIR/refs/ 如果存在;
否则,$GIT_DIR/refs/tags/ 如果存在;
否则,$GIT_DIR/refs/heads/ 如果存在;
否则,$GIT_DIR/refs/remotes/ 如果存在;
否则,如果存在 $GIT_DIR/refs/remotes//HEAD。
HEAD 命名您在工作树中的更改所基于的提交。 FETCH_HEAD 记录您使用最后一次 git-fetch 调用从远程存储库中获取的分支。 ORIG_HEAD 是由以剧烈方式移动您的 HEAD 的命令创建的,以记录 HEAD 在其操作之前的位置,以便您可以轻松地将分支的尖端更改回您运行它们之前的状态。 MERGE_HEAD 记录您在运行 git-merge 时要合并到分支中的提交。
后缀 @ 的 ref 带有括在大括号对中的日期规范(例如 {yesterday}、{1 月 2 周 3 天 1 小时 1 秒前} 或 {1979-02-26 18:30:00 }) 来指定 ref 在先前时间点的值。此后缀只能紧跟在 ref 名称之后使用,并且 ref 必须具有现有日志 ($GIT_DIR/logs/)。请注意,这会在给定时间查找本地 ref 的状态;例如,上周您当地的 master 分支中的内容。如果您想查看特定时间的提交,请参阅 --since 和 --until。
一个 ref 后缀为 @ ,并带有一个包含在大括号对中的序数规范(例如 {1}、{15}),以指定该 ref 的第 n 个先前值。例如,master@{1} 是 master 的直接优先值,而 master@{5} 是 master 的第 5 个优先值。此后缀只能紧跟在 ref 名称之后使用,并且 ref 必须具有现有日志 ($GIT_DIR/logs/)。
您可以使用带有空 ref 部分的 @ 构造来获取当前分支的 reflog。例如,如果您在 blabla 分支上,则 @{1} 与 blabla@{1} 的含义相同。
特殊构造@{-} 表示在当前分支之前签出的第一个分支。
修订参数的后缀 ^ 表示该提交对象的第一个父对象。 ^ 表示第一个父级(即 rev^ 相当于 rev^1)。作为一个特殊规则,rev^0 表示提交本身,并且在 rev 是引用提交对象的标记对象的对象名称时使用。
修订参数的后缀 ~ 表示作为指定提交对象的第代祖父的提交对象,仅在第一个父代之后。 IE。 rev~3 等价于 rev^^^ 等价于 rev^1^1^1。有关此表单的用法说明,请参见下文。
后缀 ^ 后跟括在大括号对中的对象类型名称(例如 v0.99.8^{commit})表示该对象可以是一个标签,并递归地取消引用该标签,直到找到该类型的对象或该对象不能再被取消引用(在这种情况下,barf)。前面介绍的rev^0是rev^{commit}的简写。
后缀 ^ 后跟一个空大括号对(例如 v0.99.8^{})表示该对象可以是一个标签,并递归地取消引用该标签,直到找到一个非标签对象。
一个冒号,后跟一个斜杠,后跟一个文本:这命名了一个提交,其提交消息以指定的文本开头。此名称返回可从任何 ref 访问的最年轻的匹配提交。如果提交消息以 ! 开头,则必须重复;特殊序列 :/!,后跟 !暂时保留。
后缀:后跟路径;这会在冒号之前的部分命名的树状对象中的给定路径上命名 blob 或树。
一个冒号,可选地后跟一个阶段号(0到3)和一个冒号,后跟一个路径;这在给定路径的索引中命名了一个 blob 对象。缺少阶段编号(及其后面的冒号)命名阶段 0 条目。在合并期间,阶段 1 是共同祖先,阶段 2 是目标分支的版本(通常是当前分支),阶段 3 是来自被合并分支的版本。
这是 Jon Loeliger 的插图。提交节点 B 和 C 都是提交节点 A 的父节点。父提交按从左到右的顺序排列。
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
A = = A^0
B = A^ = A^1 = A~1
C = A^2 = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2