?
This document uses PHP Chinese website manual Release
gitrevisions - 指定 Git 的修訂和范圍
gitrevisions
許多 Git 命令都將修訂參數(shù)作為參數(shù)。根據(jù)命令的不同,它們表示特定的提交,或者對于遍歷修訂圖形的命令(例如 git-log [1]),可以提交可訪問的所有提交。對于遍歷修訂圖的命令,還可以明確指定一系列修訂。
另外,一些 Git 命令(例如 git-show [1])也會使用修改參數(shù)來表示其他對象而不是提交,例如 blob (“文件”)或樹(“文件目錄”)。
修訂參數(shù)<rev>
通常(但不一定)命名提交對象。它使用所謂的extended SHA-1
語法。以下是拼寫對象名稱的各種方法。列表附近列出的名稱包含在提交中的樹和 blob 。
<sha1>, e.g. dae86e1950b1277e545cee180551750029cfe735, dae86e
完整的 SHA-1 對象名稱(40字節(jié)的十六進制字符串)或存儲庫中唯一的前導(dǎo)子字符串。例如, dae86e1950b1277e545cee180551750029cfe735 和 dae86e 都會命名相同的提交對象,前提是存儲庫中沒有其他對象,并且其對象名稱以 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的你的意思是哪一個。當(dāng)模棱兩可時,<refname>
通過在以下規(guī)則中進行第一次匹配來消除:
如果$GIT_DIR/<refname>
存在,那就是你的意思(這通常只有為HEAD
,FETCH_HEAD
,ORIG_HEAD
,MERGE_HEAD
和CHERRY_PICK_HEAD
是有用的);
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
調(diào)用時從遠程存儲庫中獲取的分支。ORIG_HEAD
是通過命令創(chuàng)建的,這些命令HEAD
以激烈的方式移動您的行為,記錄HEAD
它們在操作之前的位置,以便您可以輕松地將分支的頂端更改回到運行之前的狀態(tài)。MERGE_HEAD
記錄您在運行時正在合并到您的分支中的提交git merge
。CHERRY_PICK_HEAD
記錄您在運行時正在挑選的提交git cherry-pick
。
請注意,refs/*
上述任何情況都可能來自$GIT_DIR/refs
目錄或$GIT_DIR/packed-refs
文件。盡管未指定 ref 名稱編碼,但首選 UTF-8,因為某些輸出處理可能采用 UTF-8 中的 ref 名稱。
@
單獨@
是一個HEAD
的捷徑。
<refname>@{<date>}, e.g. master@{yesterday}, HEAD@{5 minutes ago}
后面跟著@
帶括號中的后綴(例如{yesterday}
,{1 month 2 weeks 3 days 1 hour 1 second ago}
或{1979-02-26 18:30:00}
)的后綴指定前一個時間點的 ref 的值。后綴只能在 ref 名稱后面使用,并且 ref 必須具有現(xiàn)有的日志($GIT_DIR/logs/<ref>
)。請注意,這會在給定的時間查看當(dāng)?shù)?/strong>裁判的狀態(tài); 例如master
上周您當(dāng)?shù)氐姆种C構(gòu)。如果您想查看某些時間內(nèi)提交的內(nèi)容,請參閱--since
和--until
。
<refname>@{<n>}, e.g. master@{1}
后綴為@
帶括號的后綴(例如{1}
,{15}
)指定了 ref 的第n個前置值。例如master@{1}
,master
while master@{5}
是第5個先前值的即時先驗值master
。該后綴只能在 ref 名稱后面使用,并且 ref 必須具有現(xiàn)有的日志($GIT_DIR/logs/<refname>
)。
@{<n>}, e.g. @{1}
您可以使用帶有@
空引用部分的構(gòu)造來獲取當(dāng)前分支的 reflog 條目。例如,如果您在分支上,blabla
則@{1}
意味著與之相同blabla@{1}
。
@{-<n>}, e.g. @{-1}
構(gòu)造@{-<n>}
意味著在當(dāng)前之前檢出的第n個分支/提交。
<branchname>@{upstream}, e.g. master@{upstream}, @{u}
@{upstream}
branchname (簡稱<branchname>@{u}
)的后綴是指由 branchname 指定的分支設(shè)置為在(使用branch.<name>.remote
和branch.<name>.merge
)配置的基礎(chǔ)上構(gòu)建的分支。缺少的 branchname 默認為當(dāng)前的。當(dāng)用大寫拼寫時,這些后綴也是可接受的,無論大小寫是什么,它們都表示相同的事物。
<branchname>@{push}, e.g. master@{push}, @{push}
如果在檢出@{push}
時git push
運行branchname
(或當(dāng)前HEAD
沒有指定branchname),后綴將報告分支 “where we would push to” 。由于我們的推送目標位于遠程存儲庫中,當(dāng)然,我們會報告與該分支對應(yīng)的本地跟蹤分支(即,某處refs/remotes/
)。
這里有一個例子可以使它更加清晰:
$ git config push.default current $ git config remote.pushdefault myfork $ git checkout -b 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
在示例中請注意,我們建立了一個三角形工作流程,我們從一個位置拉出并推送到另一個位置。在非三角形工作流程中,@{upstream}
與@{push}
相同,這里不需要它。
當(dāng)拼寫成大寫字母時,這個后綴也是可以接受的,無論大小寫意思都是相同的。
<rev>^, e.g. HEAD^, v1.5.1^0
修訂參數(shù)的后綴^
表示提交對象的第一個父代。^<n>
意味著第n個父母(即<rev>^
相當(dāng)于<rev>^1
)。作為一個特殊規(guī)則,<rev>^0
意味著提交本身,并在<rev>
引用提交對象的標記對象的對象名稱時使用。
<rev>~<n>, e.g. master~3
修訂參數(shù)的后綴~<n>
表示作為指定提交對象的第n代父類的提交對象,僅在第一個父代之后。即<rev>~3
相當(dāng)于<rev>^^^,
同樣相當(dāng)于<rev>^1^1^1
。請參閱下面的表格來說明此表格的用法。
<rev>^{<type>}, e.g. v0.99.8^{commit}
后綴^
跟在括號內(nèi)的對象類型名稱意味著以<rev>
遞歸方式解引用對象,直到<type>
找到類型的對象或者對象不能被解除引用(在這種情況下,barf)。例如,如果<rev>
是 commit-ish,則<rev>^{commit}
描述相應(yīng)的提交對象。同樣,如果<rev>
是樹形,則<rev>^{tree}
描述相應(yīng)的樹形對象。<rev>^0
是短暫的<rev>^{commit}
。
rev^{object}
可以用來確定rev
存在的對象的名稱,而不需要rev
作為標簽,也不需要解引用rev
; 因為一個標簽已經(jīng)是一個對象,所以即使一次到達一個對象也不需要解除引用。
rev^{tag}
可以用來確保rev
識別現(xiàn)有的標簽對象。
<rev>^{}, e.g. v0.99.8^{}
后綴^
跟一個空括號對意味著對象可以是一個標記,并遞歸地引用該標記,直到找到一個非標記對象。
<rev>^{/<text>}, e.g. HEAD^{/fix nasty bug}
后綴^
的修正參數(shù),其次,它包含用斜線為首的文本的一對括號,是一樣的:/fix nasty bug
下面的語法不同之處在于它返回最年輕的匹配提交其是從^
可到達<rev>
之前。
:/<text>, e.g. :/fix nasty bug
一個冒號,跟一個斜線,后跟一個文本,命名提交消息與指定正則表達式匹配的提交。名稱返回可從任何ref訪問的最新匹配提交。正則表達式可以匹配提交消息的任何部分。要匹配以字符串開頭的消息,可以使用例如:/^foo
。特殊序列:/!
保留給修飾符以匹配內(nèi)容。:/!-foo
執(zhí)行否定匹配,同時:/!!foo
匹配文字!
字符,然后匹配foo
。任何以其他序列開始的序列:/!
現(xiàn)在都被保留。
<rev>:<path>, e.g. HEAD:README, :README, master:./README
后綴:
后面跟著一個路徑的名稱是由冒號前部分命名的 tree-ish 對象中給定路徑上的 blob 樹。:path
(在冒號前有一個空白部分)是下面描述的語法的特例:記錄在給定路徑索引處的內(nèi)容。以當(dāng)前工作目錄開始./
或../
相對于當(dāng)前工作目錄的路徑。給定的路徑將被轉(zhuǎn)換為相對于工作樹的根目錄。這對于從具有與工作樹相同樹結(jié)構(gòu)的提交或樹來處理 blob 樹是非常有用的。
:<n>:<path>, e.g. :0:README, :README
一個冒號,后跟一個階段號(0到3)和一個冒號,后跟一個路徑,在給定路徑的索引中命名一個 blob 對象。缺少的階段編號(以及后面的冒號)命名為0階段編號。在合并期間,階段1是共同的父類,階段2是目標分支的版本(通常是當(dāng)前分支),階段3是來自正在合并的分支的版本。
以下是 Jon Loeliger 的插圖。提交節(jié)點 B 和 C 都是提交節(jié)點 A 的父節(jié)點。父代提交按從左到右的順序排列。
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
歷史遍歷命令,例如git log
對一組提交進行操作,而不僅僅是一次提交。
對于這些命令,使用上一節(jié)中描述的符號來指定單個修訂,意味著reachable
來自給定提交的一組提交。
提交的可達集是提交本身和祖先鏈中的提交。
^<rev> (caret) Notation
要排除提交可達的提交,使用前綴^
符號。例如,^r1 r2
意味著提交可達,r2
但不包括從r1
(即r1
其祖先)可達的。
(雙點)范圍標識
^r1 r2
組操作似乎經(jīng)常有它的簡寫。當(dāng)你有兩個提交r1
并且r2
(根據(jù)上面指定版本中所述的語法命名)時,你可以要求提交從r2到達的提交,但不包括那些從r1可到達的提交,^r1 r2
它可以寫為r1..r2
。
(三點)對稱差符號
類似的符號r1...r2
被稱為和的對稱差,r1
被r2
定義為r1 r2 --not $(git merge-base --all r1 r2)
。它是從r1
(左側(cè))或r2
(右側(cè))中的任一個可達的提交集合,但不是來自兩者。
在這兩個簡寫符號中,可以省略一端,并將其默認為 HEAD 。例如,origin..
是一個簡寫,origin..HEAD
并問“自從我從原始分支分出后,我做了什么?” 同樣,它..origin
也是一種速記,HEAD..origin
并問道:“我從他們身上分離出來后,起源究竟發(fā)生了什么?” 請注意,..
這意味著HEAD..HEAD
空白區(qū)域可以從 HEAD 到達和無法到達。
還有三個其他的shorthands,對于合并提交,對于由提交和它的父代提交形成的集合進行命名特別有用。
r1^@
符號表示的所有父代r1
。
r1^!
表示包括提交r1
但排除其所有父代。這個符號本身表示單個提交r1
。
<rev>^-<n>
符號包括<rev>
但不包括<N>個親本(即,簡寫<rev>^<n>..<rev>
),其中<n>
= 1,如果沒有給出。這對合并提交通常很有用,您可以通過合并提交<commit>^-
來獲取合并提交中合并的分支中的所有提交<commit>
(包括<commit>
它自己)。
雖然<rev>^<n>
是關(guān)于指定一個單一的承諾父母,這三種表示法也考慮其父母。例如,你可以說HEAD^2^@
,但是你不能說HEAD^@^2
。
<rev>
包含從<rev>(即<rev>及其祖先)訪問的提交。
^<rev>
排除從<rev>(即<rev>及其祖先)訪問的提交。
<rev1>..<rev2>
包含從<rev2>訪問的提交,但不包括從<rev1>訪問的提交。當(dāng)<rev1>或<rev2>被省略時,它默認為HEAD
。
<rev1>...<rev2>
包含從<rev1>或<rev2>訪問的提交,但排除可從兩者訪問的提交。當(dāng)<rev1>或<rev2>被省略時,它默認為HEAD
。
<rev>^@, e.g. HEAD^@
后綴^
后跟一個符號與列出所有父母的<rev>
意思相同(意思是,包括任何可從其父母獲得的東西,但不包括承諾本身)。
<rev>^!, e.g. HEAD^!
后綴^
后跟一個感嘆號的方式與提交相同<rev>
,然后它的所有父母前綴^
以排除它們(和它們的祖先)。
<rev>^-<n>, e.g. HEAD^-, HEAD^-2
相當(dāng)于<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