簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-rev-parse 上次更新於 2.52.0

名稱

git-rev-parse - 解析和整理引數

概要

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

描述

許多 Git 的“porcelainish”命令接受一組合法的標誌(即以破折號 - 開頭的引數)和底層 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>

表現得好像 git rev-parse 是從工作樹的 <arg> 子目錄呼叫的。任何相對檔名都將像加上 <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 使用。當您期望引數包含空格和換行符時(例如,在使用 git diff-* 的 pickaxe -S 時)很有用。與 --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 類似,但它會省略不是 ref 的輸入(即分支或標籤名稱;或者更明確地是“heads/master”形式,當您想命名“master”分支但有一個不幸命名的標籤“master”時),並將其顯示為完整 refname(例如,“refs/heads/master”)。

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

允許從當前儲存庫支援的任何物件格式輸入 oid。

指定“sha1”會進行必要的轉換並返回一個 sha1 oid。

指定“sha256”會進行必要的轉換並返回一個 sha256 oid。

指定“storage”會進行必要的轉換並返回一個以儲存雜湊演算法編碼的 oid。

物件選項

--all

顯示 refs/ 中找到的所有 ref。

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

分別顯示所有分支、標籤或遠端跟蹤分支(即,分別顯示 refs/headsrefs/tagsrefs/remotes 中的 ref)。

如果給定了 pattern,則僅顯示匹配給定 shell glob 的 ref。如果模式不包含 globbing 字元(?*[),則透過附加 /* 將其轉換為字首匹配。

--glob=<pattern>

顯示匹配 shell glob 模式 pattern 的所有 ref。如果模式不以 refs/ 開頭,則會自動新增該字首。如果模式不包含 globbing 字元(?*[),則透過附加 /* 將其轉換為字首匹配。

--exclude=<glob-pattern>

不包括與下一個 --all--branches--tags--remotes--glob 將要考慮的 <glob-pattern> 匹配的引用。此選項的重複使用會累積排除模式,直到下一個 --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|compat)]

顯示用於儲存在 .git 目錄中的物件格式(雜湊演算法)、輸入、輸出或相容性。對於輸入,可以列印多種演算法,用空格分隔。如果請求 compat 且未啟用相容性演算法,則列印空行。如果未指定,則預設為“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>,例如 dae86e1950b1277e545cee180551750029cfe735dae86e

完整的 SHA-1 物件名稱(40 位元組十六進位制字串),或在儲存庫中唯一的開頭子串。例如,如果您的儲存庫中沒有其他物件名稱以 dae86e 開頭,則 dae86e1950b1277e545cee180551750029cfe735 和 dae86e 都指向同一個提交物件。

<describeOutput>,例如 v1.7.4.2-679-g3bee7fb

來自 git describe 的輸出;即,最近的標籤,可以選擇後跟一個連字元和一個提交數,再後跟一個連字元、一個 g 和一個縮寫的物件名稱。

<refname>,例如 masterheads/masterrefs/heads/master

符號 ref 名稱。例如,master 通常表示由 refs/heads/master 引用的提交物件。如果您碰巧同時擁有 heads/mastertags/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-pick 的提交。

    BISECT_HEAD

    記錄您在執行 git bisect --no-checkout 時要測試的當前提交。

    AUTO_MERGE

    記錄當合並操作導致衝突時,ort 合併策略寫入工作樹的樹物件。

請注意,上述任何 refs/* 情況都可能來自 $GIT_DIR/refs 目錄或 $GIT_DIR/packed-refs 檔案。雖然 ref 名稱的編碼未指定,但 UTF-8 是首選,因為某些輸出處理可能假定 ref 名稱為 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})指定了該 ref 在過去某個時間點的值。此後綴只能緊跟在 ref 名稱後面,並且該 ref 必須有一個現有的日誌($GIT_DIR/logs/<ref>)。請注意,這會查詢給定時間點您 **本地** ref 的狀態;例如,上週您的本地 master 分支的內容。如果您想檢視特定時間段內發生的提交,請參閱 --since--until

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

一個 ref 後跟字尾 @,並用花括號對括起來的序數規範(例如,{1}{15})指定該 ref 的第 n 個先前值。例如,master@{1}master 的前一個值,而 master@{5}master 的第 5 個先前值。此後綴只能緊跟在 ref 名稱後面,並且該 ref 必須有一個現有的日誌($GIT_DIR/logs/<refname>)。

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

您可以使用 @ 構造,並將 ref 部分留空,以訪問當前分支的 reflog 條目。例如,如果您在 blabla 分支上,那麼 @{1} 等同於 blabla@{1}

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

構造 @{-<n>} 表示當前分支/提交之前的第 <n> 個簽出分支/提交。

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

分支 B 可能配置為建立在遠端 R(由 branch.<name>.remote 配置)上的分支 X(由 branch.<name>.merge 配置)之上。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>^0 表示提交本身,用於 <rev> 是指向提交物件的標籤物件名稱時。

<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或tree。以./../開頭的路徑相對於當前工作目錄。給定的路徑將被轉換為相對於工作樹的根目錄。這在引用來自具有與工作樹相同樹結構的提交或樹的blob或tree時最為有用。

:[<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,操作的是一組提交,而不僅僅是單個提交。

對於這些命令,指定單個修訂版(使用上一節中描述的表示法)意味著從給定提交可達的提交集。

指定多個修訂版意味著從任何給定提交可達的提交集。

一個提交的可達集是該提交本身以及其祖先鏈中的提交。

有幾種表示法可以指定一組連線的提交(稱為“修訂範圍”),如下所示。

提交排除

^<rev>(脫字元)表示法

要排除從提交可達的提交,使用字首^表示法。例如,^r1 r2表示從r2可達但排除從r1可達的提交(即r1及其祖先)。

點範圍表示法

..(兩點)範圍表示法

^r1 r2集合操作出現如此頻繁,以至於有一個簡寫。當您有兩個提交r1r2(根據上面“指定修訂版”中解釋的語法命名)時,您可以透過^r1 r2來請求從r2可達但排除從r1可達的提交,並且可以寫成r1..r2

...(三點)對稱差表示法

類似的表示法r1...r2稱為r1r2的對稱差,定義為r1 r2 --not $(git merge-base --all r1 r2)。它是可從r1(左側)或r2(右側)中的任何一個可達,但不能同時從兩者可達的提交集。

在這兩種簡寫表示法中,您可以省略一端,讓其預設為HEAD。例如,origin..origin..HEAD的簡寫,詢問“自我們從origin分支分叉以來我做了什麼?”類似地,..originHEAD..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> = 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> = 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內建函式相同的 fasilitas。它作為一個選項規範化器(例如,分割單個開關並聚合值),有點像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引數生成的用法中。它顯示在gitcli[7]中記錄的--help-all中。

  • 使用!以不提供相應的否定長選項。

<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] 套件的一部分