English ▾ 主题 ▾ 最新版本 ▾ git-rev-parse 上次更新于 2.45.3

名称

git-rev-parse - 挑选和处理参数

概要

git rev-parse [<options>] <arg>…​

描述

许多 Git 瓷器式命令采用标志(即以短划线 - 开头的参数)和用于内部使用的底层 git rev-list 命令的参数,以及用于 git rev-list 下游的其他命令的标志和参数。 此命令的主要目的是允许调用程序区分它们。 还有一些其他的操作模式与上述“帮助解析命令行选项”无关。

除非另有说明,否则大多数选项和操作模式都要求您在 git 存储库或受 git 存储库控制的工作树中运行此命令,否则会给出致命错误。

选项

操作模式

每个选项都必须首先出现在命令行中。

--parseopt

在选项解析模式下使用 git rev-parse(请参阅下面的 PARSEOPT 部分)。 此模式下的命令可以在存储库或受存储库控制的工作树外部使用。

--sq-quote

在 shell 引用模式下使用 git rev-parse(请参阅下面的 SQ-QUOTE 部分)。 与下面的 --sq 选项相比,此模式仅进行引用。 不对命令输入进行任何其他操作。 此模式下的命令可以在存储库或受存储库控制的工作树外部使用。

--parseopt 的选项

--keep-dashdash

仅在 --parseopt 模式下有意义。 告诉选项解析器回显遇到的第一个 --,而不是跳过它。

--stop-at-non-option

仅在 --parseopt 模式下有意义。 让选项解析器在第一个非选项参数处停止。 这可用于解析带有自身选项的子命令。

--stuck-long

仅在 --parseopt 模式下有意义。 如果可用,则以长格式输出选项,并将其参数粘在一起。

过滤选项

--revs-only

不要输出非 git rev-list 命令的标志和参数。

--no-revs

不要输出 git rev-list 命令的标志和参数。

--flags

不要输出非标志参数。

--no-flags

不要输出标志参数。

输出选项

--default <arg>

如果用户没有提供参数,则使用 <arg> 代替。

--prefix <arg>

就像从工作树的 <arg> 子目录调用 git rev-parse 一样。 所有相对文件名都将被解析为好像它们以 <arg> 为前缀,并将以该形式打印。

这可用于将子目录中运行的命令的参数转换为在移动到存储库顶层后仍然可以使用的参数。 例如

prefix=$(git rev-parse --show-prefix)
cd "$(git rev-parse --show-toplevel)"
# rev-parse provides the -- needed for 'set'
eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
--verify

验证是否只提供了一个参数,并且可以将其转换为可用于访问对象数据库的原始 20 字节 SHA-1。 如果是,则将其输出到标准输出;否则,报错。

如果要确保输出实际上命名了对象数据库中的一个对象,并且/或者可以用作您需要的特定类型的对象,则可以将 ^{type} 解包运算符添加到参数中。 例如,git rev-parse "$VAR^{commit}" 将确保 $VAR 命名的是一个已存在的提交对象(即提交或指向提交的带注释的标签)。 要确保 $VAR 命名的是任何类型的已存在对象,可以使用 git rev-parse "$VAR^{object}"

请注意,如果要验证来自不受信任源的名称,最好使用 --end-of-options,这样名称参数就不会被误认为是另一个选项。

-q
--quiet

仅在 --verify 模式下有意义。 如果第一个参数不是有效的对象名称,则不要输出错误消息; 而是以非零状态静默退出。 有效对象名称的 SHA-1 将在成功时打印到 stdout。

--sq

通常,输出是每个标志和参数一行。 此选项使输出成为单行,并正确引用以供 shell 使用。 当您希望参数包含空格和换行符时(例如,将 pickaxe -Sgit diff-* 一起使用时)很有用。 与 --sq-quote 选项相比,命令输入仍然像往常一样解释。

--short[=<length>]

--verify 相同,但将对象名称缩短为至少具有 length 个字符的唯一前缀。 最小长度为 4,默认值为 core.abbrev 配置变量的有效值(请参阅 git-config[1])。

--not

显示对象名称时,在其前面加上 ^,并从已经具有 ^ 前缀的对象名称中删除 ^ 前缀。

--abbrev-ref[=(strict|loose)]

对象名称的非歧义短名称。选项 core.warnAmbiguousRefs 用于选择严格缩写模式。

--symbolic

通常,对象名称以 SHA-1 形式输出(带有可能的 ^ 前缀); 此选项使它们以尽可能接近原始输入的形式输出。

--symbolic-full-name

这与 --symbolic 类似,但它省略了非引用(即分支或标签名称;或更明确地消除歧义的“heads/master”形式,当您想命名“master”分支,而有一个不幸命名的标签“master”时)的输入,并将它们显示为完整的引用名称(例如“refs/heads/master”)。

--output-object-format=(sha1|sha256|storage)

允许从当前存储库支持的任何对象格式输入 oid。

Specifying "sha1" translates if necessary and returns a sha1 oid.
Specifying "sha256" translates if necessary and returns a sha256 oid.
Specifying "storage" translates if necessary and returns an oid in
encoded in the storage hash algorithm.

对象选项

--all

显示在 refs/ 中找到的所有引用。

--branches[=<pattern>]
--tags[=<pattern>]
--remotes[=<pattern>]

分别显示所有分支、标签或远程跟踪分支(即,分别在 refs/headsrefs/tagsrefs/remotes 中找到的引用)。

如果给出了 pattern,则仅显示与给定的 shell glob 匹配的引用。 如果该模式不包含 globbing 字符(?*[),则通过附加 /* 将其转换为前缀匹配。

--glob=<pattern>

显示与 shell glob 模式 pattern 匹配的所有引用。 如果该模式不是以 refs/ 开头,则会自动在其前面添加。 如果该模式不包含 globbing 字符(?*[),则通过附加 /* 将其转换为前缀匹配。

--exclude=<glob-pattern>

不要包含与 <glob-pattern> 匹配的引用,否则下一个 --all--branches--tags--remotes--glob 会考虑这些引用。 此选项的重复会累积排除模式,直到下一个 --all--branches--tags--remotes--glob 选项(其他选项或参数不会清除累积的模式)。

当应用于 --branches--tags--remotes 时,给定的模式不应以 refs/headsrefs/tagsrefs/remotes 开头,当应用于 --glob--all 时,它们必须以 refs/ 开头。 如果打算使用尾随 /*,则必须显式给出它。

--exclude-hidden=(fetch|receive|uploadpack)

通过查阅相应的 fetch.hideRefsreceive.hideRefsuploadpack.hideRefs 配置以及 transfer.hideRefs (参见 git-config[1]),不包括会被 git-fetchgit-receive-packgit-upload-pack 隐藏的引用。此选项会影响下一个伪引用选项 --all--glob,并在处理完它们后清除。

--disambiguate=<prefix>

显示名称以给定前缀开头的每个对象。 <prefix> 必须至少为 4 个十六进制数字长,以避免错误地列出存储库中的每个对象。

文件选项

--local-env-vars

列出存储库本地的 GIT_* 环境变量(例如 GIT_DIR 或 GIT_WORK_TREE,但不包括 GIT_EDITOR)。 只列出变量的名称,即使它们已设置,也不列出其值。

--path-format=(absolute|relative)

控制某些其他选项的行为。 如果指定为 absolute,则这些选项打印的路径将是绝对的和规范的。 如果指定为 relative,则路径将相对于当前工作目录(如果可能)。 默认值是特定于选项的。

此选项可以多次指定,并且仅影响命令行中位于其后的参数,直到命令行结束或下一个此选项的实例。

以下选项受 --path-format 修改

--git-dir

如果已定义,则显示 $GIT_DIR。 否则,显示 .git 目录的路径。 当为相对路径时,显示的路径相对于当前工作目录。

如果未定义 $GIT_DIR 并且未检测到当前目录位于 Git 存储库或工作树中,则向 stderr 打印一条消息并以非零状态退出。

--git-common-dir

如果已定义,则显示 $GIT_COMMON_DIR,否则显示 $GIT_DIR

--resolve-git-dir <path>

检查 <path> 是否是有效的存储库或指向有效存储库的 gitfile,并打印存储库的位置。 如果 <path> 是 gitfile,则打印到真实存储库的解析路径。

--git-path <path>

解析 "$GIT_DIR/<path>" 并考虑其他路径重定位变量,例如 $GIT_OBJECT_DIRECTORY, $GIT_INDEX_FILE…​。 例如,如果 $GIT_OBJECT_DIRECTORY 设置为 /foo/bar,则 "git rev-parse --git-path objects/abc" 返回 /foo/bar/abc。

--show-toplevel

显示工作树的顶层目录的路径(默认情况下是绝对路径)。 如果没有工作树,则报告错误。

--show-superproject-working-tree

显示超级项目的的工作树根目录的绝对路径(如果存在),该项目使用当前存储库作为其子模块。 如果当前存储库未被任何项目用作子模块,则不输出任何内容。

--shared-index-path

在拆分索引模式下,显示共享索引文件的路径;如果不在拆分索引模式下,则显示为空。

以下选项不受 --path-format 的影响

--absolute-git-dir

类似于 --git-dir,但其输出始终是规范化的绝对路径。

--is-inside-git-dir

当当前工作目录位于存储库目录下方时,打印 "true",否则打印 "false"。

--is-inside-work-tree

当当前工作目录位于存储库的工作树中时,打印 "true",否则打印 "false"。

--is-bare-repository

当存储库是裸存储库时,打印 "true",否则打印 "false"。

--is-shallow-repository

当存储库是浅存储库时,打印 "true",否则打印 "false"。

--show-cdup

当从子目录调用命令时,显示相对于当前目录的顶层目录的路径(通常是一系列 "../",或者一个空字符串)。

--show-prefix

当从子目录调用命令时,显示相对于顶层目录的当前目录的路径。

--show-object-format[=(storage|input|output)]

显示用于存储在 .git 目录中、输入或输出的存储库的对象格式(哈希算法)。 对于输入,可以打印多个算法,以空格分隔。 如果未指定,则默认值为 "storage"。

--show-ref-format

显示用于存储库的引用存储格式。

其他选项

--since=<datestring>
--after=<datestring>

解析日期字符串,并为 *git rev-list* 输出相应的 --max-age= 参数。

--until=<datestring>
--before=<datestring>

解析日期字符串,并为 *git rev-list* 输出相应的 --min-age= 参数。

<arg>…​

要解析的标志和参数。

指定修订版本

修订参数 *<rev>* 通常(但不一定)命名一个提交对象。 它使用所谓的*扩展 SHA-1* 语法。 以下是拼写对象名称的各种方法。 此列表末尾附近列出的名称是提交中包含的树和 blob。

注意
本文档显示了 git 看到的“原始”语法。 shell 和其他 UI 可能需要额外的引用来保护特殊字符并避免单词拆分。
<sha1>, e.g. dae86e1950b1277e545cee180551750029cfe735, dae86e

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

<describeOutput>, e.g. v1.7.4.2-679-g3bee7fb

来自 git describe 的输出; 即,最接近的标签,可以选择后跟一个破折号和提交次数,然后是一个破折号、一个 *g* 和一个缩写的对象名称。

<refname>, e.g. master, heads/master, refs/heads/master

一个符号引用名称。 例如,*master* 通常表示由 *refs/heads/master* 引用的提交对象。 如果您同时拥有 *heads/master* 和 *tags/master*,您可以显式地说 *heads/master* 来告诉 Git 您指的是哪个。 当模棱两可时,通过以下规则中的第一个匹配来消除 *<refname>* 的歧义

  1. 如果 $GIT_DIR/<refname> 存在,那就是你的意思(这通常仅对 HEADFETCH_HEADORIG_HEADMERGE_HEADREBASE_HEADREVERT_HEADCHERRY_PICK_HEADBISECT_HEADAUTO_MERGE 有用);

  2. 否则,如果 refs/<refname> 存在;

  3. 否则,如果 refs/tags/<refname> 存在;

  4. 否则,如果 refs/heads/<refname> 存在;

  5. 否则,如果 refs/remotes/<refname> 存在;

  6. 否则,如果 refs/remotes/<refname>/HEAD 存在。

    HEAD

    命名您在工作树中所做更改所基于的提交。

    FETCH_HEAD

    记录您上次使用 git fetch 调用从远程存储库获取的分支。

    ORIG_HEAD

    由以剧烈方式移动您的 HEAD 的命令(git amgit mergegit rebasegit reset)创建,以记录操作之前的 HEAD 的位置,以便您可以轻松地将分支的尖端更改回运行它们之前的状态。

    MERGE_HEAD

    当您运行 git merge 时,记录您正在合并到您的分支中的提交。

    REBASE_HEAD

    在 rebase 期间,记录操作当前停止的提交,要么是因为冲突,要么是因为交互式 rebase 中的 edit 命令。

    REVERT_HEAD

    当您运行 git revert 时,记录您正在还原的提交。

    CHERRY_PICK_HEAD

    当您运行 git cherry-pick 时,记录您正在 cherry-picking 的提交。

    BISECT_HEAD

    当您运行 git bisect --no-checkout 时,记录要测试的当前提交。

    AUTO_MERGE

    当合并操作导致冲突时,记录与 *ort* 合并策略写入工作树的状态相对应的树对象。

请注意,上述任何 *refs/* 大小写可能来自 $GIT_DIR/refs 目录或 $GIT_DIR/packed-refs 文件。 虽然未指定引用名称编码,但首选 UTF-8,因为某些输出处理可能会假定引用名称采用 UTF-8 编码。

@

@ 单独使用是 HEAD 的快捷方式。

[<refname>]@{<date>},例如 master@{yesterday}HEAD@{5 minutes ago}

引用(ref)后跟后缀 @ 以及用大括号括起来的日期指定(例如 {yesterday}{1 month 2 weeks 3 days 1 hour 1 second ago}{1979-02-26 18:30:00})表示该引用在过去某个时间点的值。 此后缀只能紧跟在引用名称之后使用,并且该引用必须具有现有的日志 ($GIT_DIR/logs/<ref>)。 请注意,这会查找您的 本地 引用在给定时间的状态;例如,上周您的本地 master 分支中的内容。 如果您想查看在特定时间段内进行的提交,请参阅 --since--until

<refname>@{<n>},例如 master@{1}

引用(ref)后跟后缀 @ 以及用大括号括起来的序号指定(例如 {1}{15})表示该引用的第 n 个先前值。 例如,master@{1}master 的紧邻先前值,而 master@{5}master 的第 5 个先前值。 此后缀只能紧跟在引用名称之后使用,并且该引用必须具有现有的日志 ($GIT_DIR/logs/<refname>)。

@{<n>},例如 @{1}

您可以将 @ 构造与空引用部分一起使用,以获取当前分支的 reflog 条目。 例如,如果您在 blabla 分支上,那么 @{1}blabla@{1} 含义相同。

@{-<n>},例如 @{-1}

构造 @{-<n>} 表示在当前分支/提交之前检出的第 <n> 个分支/提交。

[<branchname>]@{upstream},例如 master@{upstream}, @{u}

可以将分支 B 设置为基于远程 R 上的分支 X 构建(使用 branch.<name>.merge 配置),远程 R 使用 branch.<name>.remote 配置。 B@{u} 指的是从远程 R 获取的分支 X 的远程跟踪分支,通常位于 refs/remotes/R/X

[<branchname>]@{push},例如 master@{push}, @{push}

后缀 @{push} 报告在检出 branchname 时(如果未指定 branchname,则为当前 HEAD)运行 git push 时“我们将推送到的”分支。 与 @{upstream} 一样,我们报告与远程该分支对应的远程跟踪分支。

这是一个更清楚的例子

$ git config push.default current
$ git config remote.pushdefault myfork
$ git switch -c mybranch origin/master

$ git rev-parse --symbolic-full-name @{upstream}
refs/remotes/origin/master

$ git rev-parse --symbolic-full-name @{push}
refs/remotes/myfork/mybranch

请注意,在该示例中,我们设置了一个三角工作流程,我们从一个位置拉取并推送到另一个位置。 在非三角工作流程中,@{push}@{upstream} 相同,因此不需要它。

大写拼写也接受此后缀,并且无论大小写,含义都相同。

<rev>^[<n>],例如 HEAD^, v1.5.1^0

修订参数的后缀 ^ 表示该提交对象的第一个父对象。 ^<n> 表示第 <n> 个父对象(即,<rev>^ 等效于 <rev>^1)。 作为一条特殊规则,当 <rev> 是引用提交对象的标签对象名称时,<rev>^0 表示提交本身。

<rev>~[<n>],例如 HEAD~, master~3

修订参数的后缀 ~ 表示该提交对象的第一个父对象。 修订参数的后缀 ~<n> 表示命名提交对象的第 <n> 代祖先的提交对象,仅遵循第一个父对象。 即,<rev>~3 等效于 <rev>^^^,也等效于 <rev>^1^1^1。 有关此形式用法的说明,请参见下文。

<rev>^{<type>},例如 v0.99.8^{commit}

后缀 ^ 后跟用大括号括起来的对象类型名称表示递归地对 <rev> 处的对象进行解引用,直到找到类型为 <type> 的对象,或者无法再对该对象进行解引用(在这种情况下,会报错)。 例如,如果 <rev> 是 commit-ish,则 <rev>^{commit} 描述了相应的提交对象。 类似地,如果 <rev> 是 tree-ish,则 <rev>^{tree} 描述了相应的树对象。 <rev>^0<rev>^{commit} 的简写形式。

<rev>^{object} 可用于确保 <rev> 命名一个存在的对象,而无需 <rev> 是标签,也无需对 <rev> 进行解引用; 因为标签已经是对象,所以即使一次也不必对其进行解引用才能获取对象。

<rev>^{tag} 可用于确保 <rev> 标识一个现有的标签对象。

<rev>^{},例如 v0.99.8^{}

后缀 ^ 后跟一个空大括号对表示该对象可能是一个标签,并且递归地对该标签进行解引用,直到找到一个非标签对象。

<rev>^{/<text>},例如 HEAD^{/fix nasty bug}

修订参数的后缀 ^ 后跟一个包含以斜杠开头的文本的大括号对与下面的 :/fix nasty bug 语法相同,不同之处在于它返回的是从 ^ 之前的 <rev> 可访问的最新的匹配提交。

:/<text>,例如 :/fix nasty bug

冒号,后跟斜杠,后跟文本,命名一条提交消息与指定正则表达式匹配的提交。 此名称返回的是可从任何引用(包括 HEAD)访问的最新的匹配提交。 该正则表达式可以匹配提交消息的任何部分。 要匹配以字符串开头的消息,可以使用例如 :/^foo。 特殊序列 :/! 保留用于修饰匹配的内容。 :/!-foo 执行负匹配,而 :/!!foo 匹配文字 ! 字符,后跟 foo。 以 :/! 开头的任何其他序列目前都保留。 根据给定的文本,shell 的单词拆分规则可能需要额外的引号。

<rev>:<path>,例如 HEAD:READMEmaster:./README

后缀 : 后跟一个路径,命名由冒号之前的部分命名的 tree-ish 对象中给定路径处的 blob 或树。 以 ./../ 开头的路径是相对于当前工作目录的。 给定的路径将被转换为相对于工作树的根目录。 这对于从具有与工作树相同树结构的提交或树中寻址 blob 或树最有用。

:[<n>:]<path>,例如 :0:README:README

冒号,可选地后跟阶段编号(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
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

指定范围

诸如 git log 之类的历史遍历命令作用于一组提交,而不仅仅是单个提交。

对于这些命令,使用上一节中描述的表示法指定单个修订,表示从给定提交 reachable 的一组提交。

指定多个修订表示从任何给定提交可访问的一组提交。

提交的可访问集合是提交本身及其祖先链中的提交。

有几种表示法可以指定一组连接的提交(称为“修订范围”),如下所示。

提交排除

^<rev> (插入符号) 表示法

要排除从提交可访问的提交,可以使用前缀 ^ 表示法。 例如,^r1 r2 表示从 r2 可访问的提交,但不包括从 r1 可访问的提交(即 r1 及其祖先)。

点状范围表示法

.. (两点) 范围表示法

^r1 r2 集合运算经常出现,因此有一个简写形式。 当您有两个提交 r1r2 时(根据上面“指定修订”中说明的语法命名),您可以请求从 r2 可访问的提交,但不包括从 r1 可访问的提交,方法是使用 ^r1 r2,它可以写成 r1..r2

... (三点) 对称差表示法

类似的表示法 r1...r2 称为 r1r2 的对称差,定义为 r1 r2 --not $(git merge-base --all r1 r2)。 它是从 r1(左侧)或 r2(右侧)中的任一个可访问但不能从两者都访问的提交集。

在这两种简写表示法中,您可以省略一端,并让其默认为 HEAD。 例如,origin..origin..HEAD 的简写,表示“自从我从 origin 分支分叉以来我做了什么?” 类似地,..originHEAD..origin 的简写,表示“自从我从他们分叉以来 origin 做了什么?” 请注意,.. 将表示 HEAD..HEAD,这是一个空范围,既可从 HEAD 访问,也可从 HEAD 不可访问。

专门设计用于采用两个不同范围的命令(例如“git range-diff R1 R2”来比较两个范围)确实存在,但它们是例外。 除非另有说明,否则所有作用于一组提交的“git”命令都作用于单个修订范围。 换句话说,将两个“两点范围表示法”彼此相邻地书写,例如

$ git log A..B C..D

对于大多数命令来说,不会指定两个修订范围。 相反,它将命名一组连接的提交,即那些可以从 B 或 D 访问,但不能从 A 或 C 访问的提交。 在这样的线性历史中

---A---B---o---o---C---D

因为 A 和 B 可以从 C 访问到,所以这两个虚线范围指定的修订范围是单个提交 D。

其他 <rev>^ 父提交简写表示法

存在另外三种简写形式,特别适用于合并提交,用于命名由一个提交及其父提交组成的一个集合。

r1^@ 表示法表示 r1 的所有父提交。

r1^! 表示法包括提交 r1,但不包括其所有父提交。单独使用时,此表示法表示单个提交 r1

<rev>^-[<n>] 表示法包括 <rev>,但不包括第 <n> 个父提交 (即 <rev>^<n>..<rev> 的简写形式),如果未指定 <n>,则 <n> = 1。 这通常对于合并提交很有用,你可以简单地传递 <commit>^- 来获取合并提交 <commit> 中合并的所有分支中的提交(包括 <commit> 自身)。

虽然 <rev>^<n> 是关于指定单个提交的父提交,但这三种表示法也考虑了它的父提交。 例如,你可以说 HEAD^2^@,但是你不能说 HEAD^@^2

修订范围摘要

<rev>

包含从 <rev> 可访问的提交(即 <rev> 及其祖先)。

^<rev>

排除从 <rev> 可访问的提交(即 <rev> 及其祖先)。

<rev1>..<rev2>

包含从 <rev2> 可访问的提交,但排除从 <rev1> 可访问的提交。 当 <rev1> 或 <rev2> 省略时,默认值为 HEAD

<rev1>...<rev2>

包含从 <rev1> 或 <rev2> 可访问的提交,但排除从两者都可访问的提交。 当 <rev1> 或 <rev2> 省略时,默认值为 HEAD

<rev>^@,例如 HEAD^@

后缀 ^ 后跟一个 at 符号与列出 <rev> 的所有父提交相同(意味着,包括从其父提交可访问的任何内容,但不包括提交本身)。

<rev>^!,例如 HEAD^!

后缀 ^ 后跟一个感叹号与给出提交 <rev> 及其所有父提交前缀为 ^ 以排除它们(及其祖先)相同。

<rev>^-<n>,例如 HEAD^-,HEAD^-2

等效于 <rev>^<n>..<rev>,如果未给出 <n>,则 <n> = 1。

以下是使用上面的 Loeliger 图的一些示例,其中符号扩展和选择的每个步骤都经过仔细阐述

   Args   Expanded arguments    Selected commits
   D                            G H D
   D F                          G H I J D F
   ^G D                         H D
   ^D B                         E I J F B
   ^D B C                       E I J F B C
   C                            I J F C
   B..C   = ^B C                C
   B...C  = B ^F C              G H D E B C
   B^-    = B^..B
	  = ^B^1 B              E I J F B
   C^@    = C^1
	  = F                   I J F
   B^@    = B^1 B^2 B^3
	  = D E F               D G H E F I J
   C^!    = C ^C^@
	  = C ^C^1
	  = C ^F                C
   B^!    = B ^B^@
	  = B ^B^1 ^B^2 ^B^3
	  = B ^D ^E ^F          B
   F^! D  = F ^I ^J D           G H D F

PARSEOPT

--parseopt 模式下,git rev-parse 帮助处理选项,以便为 shell 脚本提供与 C 内置函数相同的功能。 它充当选项规范化器(例如,拆分单个开关聚合值),有点像 getopt(1)

它在标准输入上接收要解析和理解的选项的规范,并在标准输出上回显一个适合 sh(1) eval 的字符串,以将参数替换为规范化的参数。 如果出现错误,它会在标准错误流上输出用法,并以代码 129 退出。

注意:确保在将结果传递给 eval 时引用它。 请参见下面的示例。

输入格式

git rev-parse --parseopt 输入格式完全基于文本。 它有两个部分,用仅包含 -- 的行分隔。 分隔符之前的行(应该是一个或多个)用于用法。 分隔符后面的行描述选项。

选项的每一行都具有以下格式

<opt-spec><flags>*<arg-hint>? SP+ help LF
<opt-spec>

其格式是短选项字符,然后是长选项名称,用逗号分隔。 两部分都不是必需的,但至少需要一个。 不能包含任何 <flags> 字符。 h,helpdry-runf 是正确的 <opt-spec> 的示例。

<flags>

<flags>*=?!

  • 如果选项采用参数,则使用 =

  • 使用 ? 表示该选项采用可选参数。 你可能希望使用 --stuck-long 模式,以便能够明确地解析可选参数。

  • 使用 * 表示此选项不应列在为 -h 参数生成的用法中。 它显示为 --help-all,如 gitcli[7] 中所述。

  • 使用 ! 使相应的否定长选项不可用。

<arg-hint>

<arg-hint>(如果指定)用作帮助输出中采用参数的选项的参数名称。 <arg-hint> 以第一个空格终止。 习惯上使用破折号分隔多词参数提示中的单词。

该行其余部分(在删除空格后)用作与该选项关联的帮助。

忽略空行,并且不符合此规范的行用作选项组标题(在行首添加一个空格以故意创建此类行)。

示例

OPTS_SPEC="\
some-command [<options>] <args>...

some-command does foo and bar!
--
h,help!   show the help

foo       some nifty option --foo
bar=      some cool option --bar with an argument
baz=arg   another cool option --baz with a named argument
qux?path  qux may take a path argument but has meaning by itself

  An option group Header
C?        option C with an optional argument"

eval "$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)"

用法文本

当上面的示例中 "$@"-h--help 时,将显示以下用法文本

usage: some-command [<options>] <args>...

    some-command does foo and bar!

    -h, --help            show the help
    --[no-]foo            some nifty option --foo
    --[no-]bar ...        some cool option --bar with an argument
    --[no-]baz <arg>      another cool option --baz with a named argument
    --[no-]qux[=<path>]   qux may take a path argument but has meaning by itself

An option group Header
    -C[...]               option C with an optional argument

SQ-QUOTE

--sq-quote 模式下,git rev-parse 在标准输出上回显适合 sh(1) eval 的单行。 此行是通过规范化 --sq-quote 后面的参数来生成的。 除了引用参数之外,不执行任何其他操作。

如果你希望命令输入在输出 shell 引用之前仍然像往常一样由 git rev-parse 解释,请参见 --sq 选项。

示例

$ cat >your-git-script.sh <<\EOF
#!/bin/sh
args=$(git rev-parse --sq-quote "$@")   # quote user-supplied arguments
command="git frotz -n24 $args"          # and use it inside a handcrafted
					# command line
eval "$command"
EOF

$ sh your-git-script.sh "a b'c"

示例

  • 打印当前提交的对象名称

    $ git rev-parse --verify HEAD
  • 从 $REV shell 变量中的修订版打印提交对象名称

    $ git rev-parse --verify --end-of-options $REV^{commit}

    如果 $REV 为空或不是有效的修订版,则会出错。

  • 与上面类似

    $ git rev-parse --default master --verify --end-of-options $REV

    但如果 $REV 为空,则将打印来自 master 的提交对象名称。

GIT

属于 git[1] 套件的一部分

scroll-to-top