38

所以,我正在使用 Git GUI 来创建一个存储库。但是我在谷歌、文档或其他任何地方都找不到“修订表达式”是什么,并且需要创建一个新的分支。

此外,这似乎在程序中的许多其他地方都使用过,所以我相信知道这一点很重要。

我确实在 StackOverflow 上找到了一个关于此的问题,但那个人从未得到答案。

我只需要知道:什么是修订表达式?

4

4 回答 4

38

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.htmlgit-rev-parse的命令文档。

指定修订

修订参数通常但不一定会命名提交对象。他们使用所谓的扩展 SHA1 语法。以下是拼写对象名称的各种方法。此列表末尾附近列出的名称是提交中包含的树和 blob。

完整的 SHA1 对象名称(40 字节的十六进制字符串)或存储库中唯一的子字符串。例如 dae86e1950b1277e545cee180551750029cfe735 和 dae86e 如果您的存储库中没有其他对象名称以 dae86e 开头,则它们都命名同一个提交对象。

来自 git-describe 的输出;即一个最接近的标记,可选地后跟一个破折号和一些提交,然后是一个破折号、ag 和一个缩写的对象名称。

一个符号引用名称。例如,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} 的含义相同。

特殊构造 @{-} 表示在当前分支之前签出的第一个分支。

修订参数的后缀 ^ 表示该提交对象的第一个父对象。^ 表示第 th 父级(即 rev^ 等价于 rev^1)。作为特殊规则,rev^0 表示提交本身,并且在 rev 是引用提交对象的标记对象的对象名称时使用。

修订参数的后缀 ~ 表示提交对象,它是指定提交对象的第 代祖父母,仅在第一个父对象之后。即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
于 2009-08-01T04:37:51.587 回答
11

gahooa给出了全面的答案。常见情况:

  • 现有分支的名称(例如,master
  • SHA1 校验和的前几位,最好从gitkgit log

欢迎来到美妙的 git 世界。TMI 是课程的标准...

于 2009-08-01T04:42:39.847 回答
0

另一种情况,使用 Emacs 时:只需键入Ctrl-x v l以列出所有修订。对于 git 的新手(但不是 Emacs/CVS),我很惊讶地看到修订被列为:

commit 8d5ab12cd76d5e6098e5894c8713ec605fd9f153

这绝对是Major.minor.bugfix.build符号的令人耳目一新的变化。

更令人惊讶的是,Emacs 会自动处理 git,而无需我(通过 .emacs)告诉它它需要引用 git 而不是 CVS。相当了不起。

总而言之,当 Emacs 提示进行修订时,只需输入 40 个十六进制数字即可。

于 2011-07-08T02:42:35.807 回答
0

当您第一次尝试创建分支时,Git GUI 会询问 Revision 表达式,据我了解,我认为 git 需要已经创建并提交的分支才能跟踪新进行的更改,例如(文件中的新分支/修改)将其与某些东西(此处为 master 分支)进行比较。

于 2018-09-29T18:29:18.520 回答