什么是Git修订表达式?

39
所以,我正在使用Git GUI创建一个存储库。但是我无法在谷歌、文档或其他任何地方找到“Revision Expression”的任何痕迹,并且它是创建新分支所必需的。
此外,似乎在程序的许多其他位置也使用了这个术语,因此我认为了解它很重要。
我确实在StackOverflow上找到了一个关于此问题的帖子,但那个人从未得到答案。
我只需要知道:什么是“Revision Expression”?

如果你想将远程的更改合并到本地(对我来说是主分支),你可以输入remote/master。 - cgao
所以我想问题应该是:“在使用术语Revision Expression时,Git GUI是什么意思?” - Marinos An
4个回答

38

git需要在许多常见操作中能够识别一个提交

https://git-scm.com/docs/git-rev-parse

有许多方法可以识别一个提交。你可以使用分支、标签、提交SHA1或表达式。例如:

git log HEAD

HEAD 最终会解析成一个特定的提交,您将获得该提交的日志。也可以这么说:

git log master

master 是一个分支,它也会解析到一个特定的提交版本。

git log fd72e9c99312

这确实是实际提交。


下面的文档是您正在寻找的内容。 这些来自于git-rev-parse命令文档,在http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html

指定修订版本

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

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

从 git-describe 输出;即最接近的标记,后跟一个破折号和一定数量的提交,后跟一个破折号、g 和缩写的对象名称。

符号 ref 名称。例如,master 通常表示 $GIT_DIR/refs/heads/master 引用的提交对象。如果您同时拥有 heads/master 和 tags/master,则可以明确地说 heads/master,以告诉 git 您要使用哪一个。不明确时,通过以下规则的第一个匹配来消除歧义:

如果 $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 的位置,以便您可以轻松地将分支的顶部变回运行它们之前的状态。 当您运行 git-merge 时,MERGE_HEAD 记录您正在合并到分支中的提交。

一个 ref,后跟 @,并在花括号中括住日期规范(例如 {yesterday}、{1 month 2 weeks 3 days 1 hour 1 second ago} 或 {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 的第五个先前值。此后缀仅可立即跟在 ref 名称后面,并且该 ref 必须具有现有的日志($GIT_DIR/logs/)。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


1
请注意,您也可以通过 man gitrevisions(https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html)直接访问“指定修订版本”文档。 - Max Nanasy
我感到困惑。问题是:什么是 git revision expression。在 git 文档中,我没有看到 revision expression 这个术语。也没有在提供的链接中找到相关内容。 - Marinos An
@MarinosAn,文档在这里:https://git-scm.com/docs/git-rev-parse - gahooa
@gahooa 那里没有“修订表达式”这个术语。 - Marinos An
@MarinosAn,整个文档都是关于Git修订表达式的。你可以为它们命名任何你想要的东西,但它们确实是指定修订的表达式 - gahooa

11

gahooa给出了全面的答案。一般情况如下:

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

欢迎来到美妙的Git世界。太多信息是家常便饭...


3
TMI的意思是“过多信息”,常见答案是“小鸟”。 - dreftymac

0
另一个情况是在使用Emacs时:只需键入Ctrl-x v l即可列出所有修订版本。对于一个Git新手(但不是Emacs/CVS的新手),我很惊讶地看到修订版本被列为:
commit 8d5ab12cd76d5e6098e5894c8713ec605fd9f153

这绝对是一种令人耳目一新的变化,不再使用“Major.minor.bugfix.build”表示法。

更令人惊喜的是,Emacs可以自动处理git,而无需我告诉它(通过.emacs文件)需要引用git而不是CVS。非常神奇。

因此,总结一下,当Emacs提示输入修订版本时,只需输入那个40位十六进制数字即可。


0

当您首次尝试创建分支时,Git GUI会要求您提供修订表达式。据我理解,Git需要已经创建并提交的分支才能跟踪新制作的更改(例如新分支/文件修改),以便与某些东西进行比较(这里是主分支)。


1
在SO上,人们认为应该提供一些参考资料(以展示“研究努力”)。 - Roman Pokrovskij

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