【问题标题】:What is a Git Revision Expression?什么是 Git 修订表达式?
【发布时间】:2010-11-15 23:50:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果你想将远程的更改合并到本地(我是master),你可以输入remote/master
  • 所以我想问题应该是:“当使用术语Revision Expression 时,Git GUI 是什么意思?”

标签: git git-gui


【解决方案1】:

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 字节十六进制字符串),或存储库中唯一的子字符串。例如。如果您的存储库中没有对象名称以 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

【讨论】:

  • 请注意,您还可以通过man gitrevisions (kernel.org/pub/software/scm/git/docs/gitrevisions.html) 更直接地访问 SPECIFYING REVISIONS 文档。
  • 我很困惑。问题是:git revision expression 是什么。我在 git 文档中没有看到 revision expression 术语。也不在提供的链接中。
  • @MarinosAn,文档在这里:git-scm.com/docs/git-rev-parse
  • @gahooa 没有“修订表达式”一词。
  • @MarinosAn,整个文档都是关于 git 修订表达式的。随心所欲地称呼它们,但它们实际上是用于指定修订的表达式
【解决方案2】:

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

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

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

【讨论】:

  • TMI = 标准。常见案例答案 = 小鸟。
【解决方案3】:

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

commit 8d5ab12cd76d5e6098e5894c8713ec605fd9f153

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 在 SO 上假定应该有一些参考资料(以显示“研究工作”)。
    猜你喜欢
    • 2011-05-06
    • 2016-07-05
    • 2022-08-20
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2012-03-22
    • 2015-06-09
    相关资源
    最近更新 更多