Git
英文 ▾ 主題 ▾ 最新版本 ▾ git-rev-parse 最後更新於 2.46.0

名稱

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 類似,但它會省略非參照 (refs) 的輸入(例如分支或標籤名稱;或者更明確地說,當您想要命名 "master" 分支,但同時存在不幸地命名為 "master" 的標籤時,使用 "heads/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 字元(?*[),則會附加 /* 將其轉換為前綴匹配。

--glob=<pattern>

顯示所有符合 shell glob 模式 pattern 的參照。如果模式不是以 refs/ 開頭,則會自動加上這個前綴。如果模式不包含 glob 字元(?*[),則會附加 /* 將其轉換為前綴匹配。

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

顯示每個名稱以給定前綴開頭的物件。 <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> 通常(但不一定)會命名一個 commit 物件。它使用所謂的延伸 SHA-1 語法。以下是拼寫物件名稱的各種方法。此列表末尾附近的項目會命名 commit 中包含的樹狀結構和 blob。

注意
本文檔顯示 git 所見的「原始」語法。 shell 和其他 UI 可能需要額外的引號來保護特殊字元並避免單字分割。
<sha1>,例如 dae86e1950b1277e545cee180551750029cfe735dae86e

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

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

來自 git describe 的輸出;也就是最接近的標籤,可以選擇在後面加上一個破折號和一些 commit 數量,然後再加上一個破折號、一個 g 和一個縮寫的物件名稱。

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

符號參照名稱。例如,master 通常表示 refs/heads/master 所參照的 commit 物件。如果您同時擁有 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

    命名您在工作樹中進行變更所依據的 commit。

    FETCH_HEAD

    記錄您上次使用 git fetch 呼叫從遠端儲存庫擷取的分支。

    ORIG_HEAD

    由以劇烈方式移動 HEAD 的命令(git amgit mergegit rebasegit reset)建立,以記錄其操作之前 HEAD 的位置,以便您可以輕鬆地將分支的頂端變更回執行它們之前的狀態。

    MERGE_HEAD

    記錄您在執行 git merge 時要合併到分支中的 commit。

    REBASE_HEAD

    在 rebase 期間,記錄操作目前停止的 commit,原因可能是因為衝突或互動式 rebase 中的 edit 命令。

    REVERT_HEAD

    當您執行 git revert 時,會記錄您正在還原的 commit。

    CHERRY_PICK_HEAD

    當您執行 git cherry-pick 時,會記錄您正在 cherry-picking 的 commit。

    BISECT_HEAD

    當您執行 git bisect --no-checkout 時,會記錄目前要測試的 commit。

    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>} 表示在目前分支/commit 之前檢出的第 <n> 個分支/commit。

[<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}

如果執行 git push 時檢出了 branchname(如果未指定分支名稱,則為目前的 HEAD),後綴 @{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

修訂參數的後綴 ^ 表示該 commit 物件的第一個父 commit。^<n> 表示第 <n> 個父 commit(即,<rev>^ 等效於 <rev>^1)。作為一個特殊規則,當 <rev> 是指代 commit 物件的標籤物件的物件名稱時,<rev>^0 表示 commit 本身。

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

修訂參數的後綴 ~ 表示該 commit 物件的第一個父 commit。修訂參數的後綴 ~<n> 表示該命名 commit 物件的第 <n> 代祖先 commit 物件,僅跟隨第一個父 commit。亦即 <rev>~3 等效於 <rev>^^^,其等效於 <rev>^1^1^1。請參閱下文以了解此形式的用法說明。

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

後綴 ^ 後面跟著以大括號括起來的物件類型名稱,表示遞迴地取消引用 <rev> 的物件,直到找到類型為 <type> 的物件或物件無法再被取消引用為止(在這種情況下,會報錯)。例如,如果 <rev> 是 commit-ish,則 <rev>^{commit} 描述相應的 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> 可以到達的最年輕的匹配 commit。

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

一個冒號,後面跟著一個斜線,然後跟著一個文字,指定了一個 commit,其 commit 訊息與指定的正規表示式相符。此名稱會傳回從任何 ref(包括 HEAD)可以到達的最年輕的匹配 commit。正規表示式可以匹配 commit 訊息的任何部分。若要匹配以字串開頭的訊息,可以使用例如 :/^foo。特殊序列 :/! 保留給匹配內容的修飾符。:/!-foo 執行否定匹配,而 :/!!foo 則匹配一個文字 ! 字元,後面跟著 foo。任何其他以 :/! 開頭的序列目前均保留使用。根據給定的文字,shell 的斷字規則可能需要額外的引號。

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

後綴 : 後面跟著一個路徑,指定了冒號前部分命名的 tree-ish 物件中給定路徑的 blob 或樹狀結構。以 ./../ 開頭的路徑相對於目前的工作目錄。給定的路徑將轉換為相對於工作樹根目錄的路徑。這對於從具有與工作樹相同樹狀結構的 commit 或樹狀結構中尋址 blob 或樹狀結構最有用。

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

一個冒號,可選擇後面跟著一個階段編號(0 到 3)和一個冒號,然後跟著一個路徑,指定了索引中給定路徑的 blob 物件。遺失的階段編號(以及它後面的冒號)指定了階段 0 條目。在合併期間,階段 1 是共同祖先,階段 2 是目標分支的版本(通常是目前的分支),階段 3 是來自正在合併分支的版本。

以下是 Jon Loeliger 的說明。commit 節點 B 和 C 都是 commit 節點 A 的父節點。父 commit 從左到右排序。

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 之類的歷史記錄遍歷命令會在 commit 集合上操作,而不僅僅是一個 commit。

對於這些命令,使用上一節中描述的符號指定單個修訂版,表示從給定 commit 可到達 的 commit 集合。

指定多個修訂版表示從任何給定 commit 可以到達的 commit 集合。

commit 的可到達集合是 commit 本身及其祖先鏈中的 commit。

有幾種符號來指定一組連接的 commit(稱為「修訂範圍」),如下所示。

commit 排除

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

若要排除從 commit 可以到達的 commit,則使用前綴 ^ 表示法。例如,^r1 r2 表示從 r2 可以到達的 commit,但排除從 r1 可以到達的 commit(即 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 引數產生的用法中列出此選項。它會顯示在 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