簡體中文 ▾ 主題 ▾ 最新版本 ▾ 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>

行為如同 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 在成功時列印到標準輸出。

--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)

允許從當前倉庫支援的任何物件格式輸入物件 ID。

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 匹配的引用。如果模式不包含萬用字元(?*[),則透過附加 /* 轉換為字首匹配。

--glob=<pattern>

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

--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)

不包含會被 git-fetchgit-receive-packgit-upload-pack 隱藏的引用,透過查閱相應的 fetch.hideRefsreceive.hideRefsuploadpack.hideRefs 配置以及 transfer.hideRefs(參見 git-config[1])。此選項影響下一個偽引用選項 --all--glob,並在處理它們後清除。

--disambiguate=<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 倉庫或工作樹中,則向標準錯誤輸出列印訊息並以非零狀態退出。

--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>,例如 dae86e1950b1277e545cee180551750029cfe735, dae86e

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

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

git describe 的輸出;即,最近的標籤,可選地後跟一個破折號和提交數量,然後是一個破折號、一個 g,以及一個縮寫的物件名稱。

<refname>,例如 master, heads/master, refs/heads/master

一個符號引用名稱。例如,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 am, git merge, git rebase, git 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 檔案。雖然引用名稱編碼未指定,但首選 UTF-8,因為某些輸出處理可能假定引用名稱為 UTF-8。

@

@ 單獨使用是 HEAD 的快捷方式。

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

一個引用後跟字尾 @,並在大括號中包含日期規範(例如 {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}

一個引用後跟字尾 @,並在大括號中包含序數規範(例如 {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(使用 branch.<name>.remote 配置)上的分支 X(使用 branch.<name>.merge 配置)進行構建。B@{u} 指的是從遠端 R 獲取的分支 X 的遠端跟蹤分支,通常位於 refs/remotes/R/X

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

字尾 @{push} 報告“我們要推送到的”分支,如果 branchname 已檢出時執行 git push(如果未指定分支名稱,則為當前 HEAD)。與 @{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:README, master:./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,作用於一組提交,而不僅僅是單個提交。

對於這些命令,使用上一節中描述的符號指定單個修訂版本,意味著從給定提交可到達的提交集。

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

提交的可到達集是提交本身及其祖先鏈中的提交。

有幾種符號用於指定一組連線的提交(稱為“修訂範圍”),如下所示。

提交排除

^<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 既可到達又不可到達的空範圍。

專門設計用於接受兩個不同範圍的命令(例如“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^@

字尾 ^ 後跟一個 @ 符號,與列出 <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 引數生成的用法說明中。它在 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] 套件的一部分

scroll-to-top