?
This document uses PHP Chinese website manual Release
git-diff-tree - 比較通過(guò)兩個(gè)樹(shù)對(duì)象找到的 blob 的內(nèi)容和模式
git diff-tree [--stdin] [-m] [-s] [-v] [--no-commit-id] [--pretty] [-t] [-r] [-c | --cc] [--root] [<common diff options>] <tree-ish> [<tree-ish>] [<path>…]
比較通過(guò)兩個(gè)樹(shù)對(duì)象找到的斑點(diǎn)的內(nèi)容和模式。
如果只給出一個(gè)<tree-ish>,則將提交與其父項(xiàng)進(jìn)行比較(請(qǐng)參閱下面的--stdin)。
請(qǐng)注意,git diff-tree
可以使用封裝在提交對(duì)象中的樹(shù)。
-p -u --patch
生成補(bǔ)?。ㄕ?qǐng)參閱生成補(bǔ)丁一節(jié))。
-s --no-patch
抑制差異輸出。對(duì)于像git show
這樣的命令很有用,默認(rèn)顯示補(bǔ)丁,或者取消效果--patch
。
-U<n> --unified=<n>
使用<n>行上下文生成差異,而不是通常的三行。意味著-p
。
--raw
以原始格式生成差異。這是默認(rèn)設(shè)置。
--patch-with-raw
-p --raw
的同義詞。
--indent-heuristic --no-indent-heuristic
這些是為了幫助調(diào)試和調(diào)整實(shí)驗(yàn)啟發(fā)式(默認(rèn)情況下是關(guān)閉的),這些啟發(fā)式技術(shù)改變了差異邊界以使修補(bǔ)程序更易于閱讀。
--minimal
花費(fèi)額外的時(shí)間來(lái)確保生成最小可能的差異。
--patience
使用“耐心差異”算法生成差異。
--histogram
使用“直方圖差異”算法生成差異。
--diff-algorithm={patience|minimal|histogram|myers}
選擇一種差異算法。變體如下:
default
, myers
基本的貪婪 diff 算法。目前,這是默認(rèn)設(shè)置。
minimal
花費(fèi)額外的時(shí)間來(lái)確保生成最小可能的差異。
patience
生成補(bǔ)丁時(shí)使用“耐心差異”算法。
histogram
此算法將耐心算法擴(kuò)展為“支持低出現(xiàn)率的通用元素”。
例如,如果您將 diff.algorithm 變量配置為非默認(rèn)值并且想要使用默認(rèn)值,那么您必須使用--diff-algorithm=default
選項(xiàng)。
--stat[=<width>[,<name-width>,<count>]]
生成一個(gè) diffstat。默認(rèn)情況下,文件名部分使用盡可能多的空間,其余部分使用圖形部分。最大寬度默認(rèn)為終端寬度,如果未連接到終端,則最大寬度為80列,并且可以被覆蓋<width>
。文件名部分的寬度可以通過(guò)<name-width>
逗號(hào)后面的另一個(gè)寬度來(lái)限制。圖形部分的寬度可以通過(guò)使用--stat-graph-width=<width>
(影響所有生成統(tǒng)計(jì)圖的命令)或通過(guò)設(shè)置diff.statGraphWidth=<width>
(不影響git format-patch
)來(lái)限制。通過(guò)給出第三個(gè)參數(shù)<count>
,可以將輸出限制在第一<count>
行,...
如果還有更多的話。
這些參數(shù)也可以單獨(dú)設(shè)置--stat-width=<width>
,--stat-name-width=<name-width>
和--stat-count=<count>
。
--numstat
類(lèi)似于--stat
,但顯示十進(jìn)制表示法中添加和刪除的行數(shù)以及不帶縮寫(xiě)的路徑名,以使其更加機(jī)器友好。對(duì)于二進(jìn)制文件,輸出兩個(gè)-
而不是說(shuō)0 0
。
--shortstat
只輸出--stat
包含修改文件總數(shù)的格式的最后一行,以及添加和刪除行的數(shù)量。
--dirstat=<param1,param2,…>
輸出每個(gè)子目錄的相對(duì)變化量分布。--dirstat
可以通過(guò)傳遞逗號(hào)分隔的參數(shù)列表來(lái)定制行為。默認(rèn)值由diff.dirstat
配置變量控制(請(qǐng)參閱 git-config [1])。以下參數(shù)可用:
changes
通過(guò)計(jì)算已從源中刪除或添加到目標(biāo)的行來(lái)計(jì)算 dirstat 數(shù)字。這會(huì)忽略文件中純代碼移動(dòng)的數(shù)量。換句話說(shuō),重新排列文件中的行數(shù)不會(huì)與其他更改一樣多。這是沒(méi)有給出參數(shù)時(shí)的默認(rèn)行為。
lines
通過(guò)執(zhí)行常規(guī)基于行的差異分析來(lái)計(jì)算 dirstat 數(shù)字,并將刪除/添加的行數(shù)相加。(對(duì)于二進(jìn)制文件,取而代之的是計(jì)算64字節(jié)的塊,因?yàn)槎M(jìn)制文件沒(méi)有自然的行概念)。這是一種--dirstat
比changes
行為更為昂貴的行為,但它可以像其他更改一樣計(jì)算文件中重新排列的行數(shù)。結(jié)果輸出與您從其他--*stat
選項(xiàng)中獲得的結(jié)果一致。
files
通過(guò)計(jì)算更改的文件數(shù)量來(lái)計(jì)算 dirstat 數(shù)字。dirstat 分析中每個(gè)更改的文件都相同。這是計(jì)算上最便宜的--dirstat
行為,因?yàn)樗槐夭榭次募?nèi)容。
cumulative
計(jì)數(shù)父目錄的子目錄中的更改。請(qǐng)注意,使用時(shí)cumulative
,報(bào)告的百分比總和可能超過(guò)100%。默認(rèn)(非累積)行為可以用noncumulative
參數(shù)指定。
<limit>
整數(shù)參數(shù)指定截?cái)喟俜直龋J(rèn)為3%)。輸出中不顯示貢獻(xiàn)小于此百分比的目錄。
示例:以下內(nèi)容將計(jì)數(shù)已更改的文件,同時(shí)忽略占已更改文件總數(shù)少于10%的目錄,并累積父目錄中的子目錄計(jì)數(shù):--dirstat=files,10,cumulative
。
--summary
輸出擴(kuò)展頭信息的精簡(jiǎn)摘要,如創(chuàng)建,重命名和模式更改。
--patch-with-stat
-p --stat
的同義詞。
-z
當(dāng)--raw
,--numstat
,--name-only
或--name-status
已給出,不Munge時(shí)間路徑名,并使用完全無(wú)效的輸出字段終止符。
如果沒(méi)有這個(gè)選項(xiàng),帶有“不尋?!弊址穆窂矫麑凑张渲米兞康恼f(shuō)明引用core.quotePath
(請(qǐng)參閱 git-config [1])。
--name-only
僅顯示已更改文件的名稱。
--name-status
僅顯示已更改文件的名稱和狀態(tài)。有關(guān)--diff-filter
狀態(tài)字母的含義,請(qǐng)參閱選項(xiàng)說(shuō)明。
--submodule=<format>
指定如何顯示子模塊中的差異。指定使用--submodule=short
的short
格式時(shí)。這種格式只顯示范圍開(kāi)始和結(jié)束處的提交名稱。當(dāng)--submodule
或者--submodule=log
被指定時(shí),使用log
格式。這種格式列出了像 git-submodule [1] summary
那樣的提交。當(dāng)--submodule=diff
指定時(shí),使用diff
格式。這種格式顯示了提交范圍內(nèi)子模塊內(nèi)容變化的內(nèi)嵌比較。如果配置選項(xiàng)未設(shè)置,則默認(rèn)為diff.submodule
或short
格式。
--color=<when>
顯示有色差異。--color
(即沒(méi)有=<when>
)是一樣的--color=always
。<when>
可以是一個(gè)always
,never
或auto
。
--no-color
關(guān)閉有色差異。它和--color=never
。一樣。
--word-diff=<mode>
顯示一個(gè)單詞 diff,使用<mode>分隔已更改的單詞。默認(rèn)情況下,單詞由空格分隔; 見(jiàn)--word-diff-regex
下文。<mode>默認(rèn)為plain
,并且必須是以下之一:
color
僅使用顏色突出顯示更改的詞。意味著--color
。
川( plain )
將單詞顯示為[-removed-]
和{+added+}
。如果輸入中出現(xiàn)分隔符,則不會(huì)嘗試跳過(guò)分隔符,因此輸出可能不明確。
porcelain
使用專(zhuān)門(mén)用于腳本消費(fèi)的基于行的格式。以通常的統(tǒng)一差異格式打印已添加/已刪除/未更改的運(yùn)行,以行開(kāi)頭處的+
/ -
/字符開(kāi)始并延伸至行尾。輸入中~
的換行符通過(guò)它自己的一行代字符表示。
none
再次禁用字差異。
請(qǐng)注意,盡管第一個(gè)模式的名稱,如果啟用,顏色將用于突出顯示所有模式中更改的部分。
--word-diff-regex=<regex>
使用<regex>來(lái)決定一個(gè)單詞是什么,而不是將非空白的運(yùn)行視為一個(gè)單詞。也意味著--word-diff
除非已經(jīng)啟用。
每個(gè)<regex>的非重疊匹配都被視為一個(gè)單詞。為了找到差異,這些匹配之間的任何內(nèi)容都被認(rèn)為是空白并被忽略(?。D憧赡芟胱?code>|[^[:space:]]加到你的正則表達(dá)式,以確保它匹配所有非空白字符。包含換行符的匹配在換行符處被無(wú)提地截?cái)啵ǎ。?/p>
例如,--word-diff-regex=.
將每個(gè)字符看作單詞,并相應(yīng)地逐個(gè)字符地顯示差異。
正則表達(dá)式也可以通過(guò) diff 驅(qū)動(dòng)程序或配置選項(xiàng)來(lái)設(shè)置,請(qǐng)參閱 gitattributes [5]或 git-config [1]。顯式給予它將覆蓋任何 diff 驅(qū)動(dòng)程序或配置設(shè)置。差異驅(qū)動(dòng)程序覆蓋配置設(shè)置
--color-words=<regex>
相當(dāng)于--word-diff=color
加號(hào)(如果指定了正則表達(dá)式)--word-diff-regex=<regex>
。
--no-renames
關(guān)閉重命名檢測(cè),即使配置文件提供了默認(rèn)設(shè)置。
--check
警告如果更改引入沖突標(biāo)記或空白錯(cuò)誤。認(rèn)為空白錯(cuò)誤由core.whitespace
配置控制。默認(rèn)情況下,尾隨空格(包括單獨(dú)由空格組成的行)和空格字符(緊跟該行的初始縮進(jìn)內(nèi)的制表符后面的空格字符)將被視為空白錯(cuò)誤。如果發(fā)現(xiàn)問(wèn)題,則退出非零狀態(tài)。與--exit-code不兼容。
--ws-error-highlight=<kind>
突出顯示空白的錯(cuò)誤context
,old
或者new
把差異線。多個(gè)值以逗號(hào)分隔,none
重置以前的值,default
將列表重置為new
并all
簡(jiǎn)寫(xiě)為old,new,context
。如果未給出此選項(xiàng),并且diff.wsErrorHighlight
未設(shè)置配置變量,則只會(huì)new
突出顯示行中的空白錯(cuò)誤??瞻族e(cuò)誤是彩色的color.diff.whitespace
。
--full-index
在生成補(bǔ)丁格式輸出時(shí),在“索引”行上顯示完整的映像前和映像后blob對(duì)象名稱,而不是第一批字符。
--binary
除了--full-index
輸出可以應(yīng)用的二進(jìn)制差異git-apply
。
--abbrev=<n>
不是在 diff-raw 格式輸出和 diff-tree 標(biāo)題行中顯示完整的40字節(jié)十六進(jìn)制對(duì)象名稱,只顯示部分前綴。這與--full-index
上面的選項(xiàng)無(wú)關(guān),后者控制 diff-patch 輸出格式。非默認(rèn)的位數(shù)可以用指定--abbrev=<n>
。
-B<n> --break-rewrites[=<n>]
將完全重寫(xiě)更改分解為刪除和創(chuàng)建對(duì)。這有兩個(gè)目的:
它影響到一種改變的方式,這種改變相當(dāng)于整個(gè)文件的重寫(xiě),而不是像一系列刪除和插入混合在一起,只有幾行文本與上下文相匹配,但是作為一個(gè)單一的刪除舊的一切,隨后是一個(gè)單次插入所有新事物,并且數(shù)字m
控制-B選項(xiàng)的這個(gè)方面(默認(rèn)為60%)。-B/70%
指定只有少于30%的原始數(shù)據(jù)應(yīng)保留在Git的結(jié)果中,以便將其視為全部重寫(xiě)(否則結(jié)果補(bǔ)丁將是一系列與上下文行混合的刪除和插入)。
與-M 一起使用時(shí),完全重寫(xiě)的文件也被認(rèn)為是重命名的來(lái)源(通常-M 僅考慮作為重命名源消失的文件),并且該數(shù)字n
控制著-B選項(xiàng)的這個(gè)方面(默認(rèn)為50%)。-B20%
指定添加和刪除相對(duì)于文件大小的20%或更多的更改有資格作為重命名為其他文件的可能來(lái)源。
-M<n> --find-renames=<n>
檢測(cè)重命名。如果n
被指定,則它是相似度指數(shù)的閾值(即與文件大小相比的添加/刪除量)。例如,-M90%
如果超過(guò)90%的文件沒(méi)有改變,Git 應(yīng)該考慮刪除/添加對(duì)是一個(gè)重命名。如果沒(méi)有%
符號(hào),該數(shù)字應(yīng)作為分?jǐn)?shù)讀取,并在其前面加小數(shù)點(diǎn)。即,-M5
變成0.5,并且因此是相同的-M50%
。同樣的,-M05
也是一樣的-M5%
。要將檢測(cè)限制為精確重命名,請(qǐng)使用-M100%
。默認(rèn)相似度指數(shù)為50%。
-C<n> --find-copies=<n>
檢測(cè)副本以及重命名。另見(jiàn)--find-copies-harder
。如果n
被指定,它的含義與-M<n>
。
--find-copies-harder
出于性能原因,默認(rèn)情況下,-C
只有當(dāng)副本的原始文件在相同的變更集中被修改時(shí),選項(xiàng)才會(huì)查找副本。該標(biāo)志使命令檢查未修改的文件作為復(fù)制源的候選項(xiàng)。對(duì)于大型項(xiàng)目來(lái)說(shuō)這是一項(xiàng)非常昂貴的操作,因此請(qǐng)謹(jǐn)慎使用。給予多個(gè)-C
選項(xiàng)具有相同的效果。
-D --irreversible-delete
省略原圖像進(jìn)行刪除,即僅打印標(biāo)題,但不打印原像和之間的差異/dev/null
。由此產(chǎn)生的補(bǔ)丁不適用于patch
或git apply
; 這僅適用于那些想專(zhuān)注于更改后查看文本的人。另外,輸出顯然缺乏足夠的信息來(lái)反向應(yīng)用這樣的補(bǔ)丁,甚至是手動(dòng)的,因此也就是選項(xiàng)的名稱。
在與-B
刪除/創(chuàng)建對(duì)的刪除部分一起使用時(shí),還要省略原像。
-l<num>
在-M
和-C
選項(xiàng)需要為 O(n ^ 2)的處理時(shí)間,其中n是/復(fù)制目標(biāo)潛在的重命名的數(shù)目。如果重命名/復(fù)制目標(biāo)的數(shù)量超過(guò)指定的數(shù)量,則此選項(xiàng)可防止重命名/復(fù)制檢測(cè)運(yùn)行。
--diff-filter=[(A|C|D|M|R|T|U|X|B)…*]
選擇僅添加(A
),復(fù)制(C
),刪除(D
),修改(M
),重命名(R
),其類(lèi)型(即常規(guī)文件,符號(hào)鏈接,子模塊,...)更改(T
),Unmerged(U
),未知(X
)或已配對(duì)Broken(B
)。可以使用任何過(guò)濾字符的組合(包括無(wú))。當(dāng)*
(全部或無(wú))添加到組合中時(shí),如果有任何文件與比較中的其他條件匹配,則選擇所有路徑; 如果沒(méi)有與其他標(biāo)準(zhǔn)匹配的文件,則不會(huì)選擇任何內(nèi)容。
此外,這些大寫(xiě)字母可以降低排除。例如--diff-filter=ad
排除添加和刪除的路徑。
-S<string>
查找改變文件中指定字符串出現(xiàn)次數(shù)(即添加/刪除)的差異。旨在供劇本使用。
當(dāng)你尋找一個(gè)精確的代碼塊(比如一個(gè)結(jié)構(gòu)體)并且想知道該塊自第一次出現(xiàn)以來(lái)的歷史記錄時(shí),它非常有用:迭代地使用該特征將原始圖像中的有趣塊返回到-S
,并繼續(xù)前進(jìn),直到獲得該塊的第一個(gè)版本。
-G<regex>
尋找補(bǔ)丁文本包含與<regex>匹配的添加/刪除行的差異。
為了說(shuō)明之間的區(qū)別-S<regex> --pickaxe-regex
,并-G<regex>
考慮在同一個(gè)文件中的以下DIFF提交:
+ return !regexec(regexp, two->ptr, 1, ®match, 0);...- hit = !regexec(regexp, mf2.ptr, 1, ®match, 0);
雖然git log -G"regexec\(regexp"
會(huì)顯示此提交,但git log -S"regexec\(regexp" --pickaxe-regex
不會(huì)(因?yàn)樵撟址某霈F(xiàn)次數(shù)沒(méi)有改變)。
有關(guān)pickaxe
更多信息,請(qǐng)參閱 gitdiffcore [7]中的條目。
--pickaxe-all
當(dāng)-S
或-G
發(fā)現(xiàn)更改時(shí),顯示該更改集中的所有更改,而不僅僅是包含<string>中的更改的文件。
--pickaxe-regex
將給定的<string> -S
視為擴(kuò)展的 POSIX 正則表達(dá)式進(jìn)行匹配。
-O<orderfile>
控制文件在輸出中出現(xiàn)的順序。這覆蓋了diff.orderFile
配置變量(請(qǐng)參閱 git-config [1])。取消diff.orderFile
,使用-O/dev/null
。
輸出順序由<orderfile>中的全局模式順序決定。所有具有與第一個(gè)模式相匹配的路徑名的文件將首先輸出,接下來(lái)將輸出所有具有匹配第二個(gè)模式(但不是第一個(gè))的路徑名的文件,依此類(lèi)推。最后輸出所有不匹配任何模式的路徑名的文件,就好像文件末尾有一個(gè)隱含的匹配模式一樣。如果多個(gè)路徑名具有相同的排名(它們匹配相同的模式但沒(méi)有更早的模式),則它們的輸出順序相對(duì)于彼此是正常順序。
按以下方式解析<orderfile>:
空白行被忽略,所以它們可以用作分隔符以提高可讀性。
以散列(“ #
”)開(kāi)頭的行會(huì)被忽略,因此它們可以用于注釋。\
如果以散列開(kāi)頭,則在模式的開(kāi)頭添加反斜杠(“ ”)。
每隔一行包含一個(gè)模式。
模式與沒(méi)有 FNM_PATHNAME 標(biāo)志的 fnmantch(3)使用的模式具有相同的語(yǔ)法和語(yǔ)義,但如果刪除任何數(shù)量的最終路徑名組件都與模式匹配,則路徑名也與模式匹配。例如,模式“ foo*bar
”匹配“ fooasdfbar
”和“ foo/bar/baz/asdf
”但不是“ foobarx
”。
-R
交換兩個(gè)輸入; 即顯示索引或磁盤(pán)文件與樹(shù)內(nèi)容的差異。
--relative=<path>
從項(xiàng)目的子目錄運(yùn)行時(shí),可以通過(guò)此選項(xiàng)告知排除目錄外的更改并顯示與其相關(guān)的路徑名。如果不在子目錄中(例如,在裸存儲(chǔ)庫(kù)中),可以通過(guò)給出<path>作為參數(shù)來(lái)命名將哪個(gè)子目錄作為輸出的相對(duì)位置。
-a --text
將所有文件視為文本。
--ignore-space-at-eol
忽略 EOL 中的空白變化。
-b --ignore-space-change
忽略空白量的變化。這會(huì)忽略行結(jié)束處的空白,并認(rèn)為一個(gè)或多個(gè)空白字符的所有其他序列是等價(jià)的。
-w --ignore-all-space
比較行時(shí)忽略空格。即使一行有空白,而另一行沒(méi)有空白,這也會(huì)忽略差異。
--ignore-blank-lines
忽略其行全部空白的更改。
--inter-hunk-context=<lines>
顯示差異 hunk 之間的上下文,直到指定的行數(shù),從而融合彼此接近的 hunk。diff.interHunkContext
如果配置選項(xiàng)未設(shè)置,則默認(rèn)為0或0。
-W --function-context
顯示整個(gè)周?chē)淖兓δ堋?/p>
--exit-code
用類(lèi)似于 diff(1)的代碼退出程序。也就是說(shuō),如果存在差異,則1退出,0表示沒(méi)有差異。
--quiet
禁用程序的所有輸出。意味著--exit-code
。
--ext-diff
允許執(zhí)行一個(gè)外部比較助手。如果你用 gitattributes [5]設(shè)置外部差異驅(qū)動(dòng)程序,你需要在 git-log [1]和朋友中使用這個(gè)選項(xiàng)。
--no-ext-diff
禁止外部差異驅(qū)動(dòng)程序。
--textconv --no-textconv
在比較二進(jìn)制文件時(shí),允許(或不允許)運(yùn)行外部文本轉(zhuǎn)換過(guò)濾器。有關(guān)詳細(xì)信息,請(qǐng)參閱 gitattributes [5]。由于 textconv 過(guò)濾器通常是單向轉(zhuǎn)換,因此生成的差異適合人類(lèi)消費(fèi),但無(wú)法應(yīng)用。出于這個(gè)原因,默認(rèn)情況下,textconv 過(guò)濾器僅針對(duì) git-diff [1]和 git-log [1]啟用,但不適用于 git-format-patch [1]或 diff plumbing命令。
--ignore-submodules=<when>
忽略差異代中子模塊的更改。<when>可以是“none”,“untracked”,“dirty”或“all”,這是默認(rèn)設(shè)置。如果子模塊包含未跟蹤或已修改的文件,或者HEAD與超級(jí)項(xiàng)目中記錄的提交不同,并且可用于覆蓋ignore
git-config [1]或gitmodules [5]中的任何選項(xiàng)設(shè)置,則使用“none” ]。當(dāng)使用“未跟蹤”時(shí),如果子模塊僅包含未跟蹤內(nèi)容(但仍然針對(duì)修改內(nèi)容進(jìn)行掃描),則子模塊不會(huì)被視為臟。使用“dirty”會(huì)忽略對(duì)子模塊工作樹(shù)的所有更改,只會(huì)顯示超級(jí)項(xiàng)目中存儲(chǔ)的提交更改(這是1.7.0之前的行為)。使用“全部”
--src-prefix=<prefix>
顯示給定的源前綴而不是“a /”。
--dst-prefix=<prefix>
顯示給定的目的地前綴而不是“b /”。
--no-prefix
不要顯示任何來(lái)源或目的地前綴。
--line-prefix=<prefix>
為每行輸出預(yù)留一個(gè)額外的前綴。
--ita-invisible-in-index
默認(rèn)情況下,由“git add -N”添加的條目顯示為“git diff”中的現(xiàn)有空文件和“git diff --cached”中的新文件。該選項(xiàng)使得該條目在“git diff”中顯示為新文件,而在“git diff --cached”中不存在。這個(gè)選項(xiàng)可以恢復(fù)--ita-visible-in-index
。這兩個(gè)選項(xiàng)都是實(shí)驗(yàn)性的,可以在將來(lái)刪除。
有關(guān)這些常用選項(xiàng)的更詳細(xì)的解釋?zhuān)?qǐng)參閱 gitdiffcore [7]。
<tree-ish>
樹(shù)對(duì)象的 ID。
<path>…
如果提供,結(jié)果僅限于匹配其中一個(gè)前綴字符串的文件子集。即文件匹配/^<pattern1>|<pattern2>|.../
請(qǐng)注意,此參數(shù)不提供任何通配符或正則表達(dá)式功能。
-r
遞歸到子樹(shù)中
-t
顯示樹(shù)本身以及子樹(shù)。意味著-r。
--root
當(dāng)--root
指定時(shí),初始提交將顯示為一個(gè)大的創(chuàng)建事件。這相當(dāng)于針對(duì) NULL 樹(shù)的 diff。
--stdin
當(dāng)--stdin
指定時(shí),該命令不會(huì)從命令行獲取<tree-ish>參數(shù)。而是從它的標(biāo)準(zhǔn)輸入中讀取包含兩個(gè)<tree>,一個(gè)<commit>或<commit>列表的行。(使用一個(gè)空格作為分隔符。)
當(dāng)給出兩棵樹(shù)時(shí),它比較第一棵樹(shù)和第二棵樹(shù)。當(dāng)提交一次提交時(shí),它將提交與其父項(xiàng)進(jìn)行比較。其余的提交,如果給出,就好像它們是第一次提交的父項(xiàng)一樣。
在比較兩棵樹(shù)時(shí),兩個(gè)樹(shù)的 ID(用空格分隔并以換行符終止)在差異之前打印。比較提交時(shí),會(huì)打印第一個(gè)(或唯一)提交的 ID,后跟一個(gè)換行符。
下面的標(biāo)志進(jìn)一步影響比較提交(但不是樹(shù))時(shí)的行為。
-m
默認(rèn)情況下,git diff-tree --stdin
不顯示合并提交的差異。有了這個(gè)標(biāo)志,它顯示了所有父母的承諾不同之處。另見(jiàn)-c
。
-s
默認(rèn)情況下,git diff-tree --stdin
以機(jī)器可讀形式(不含-p
)或補(bǔ)丁形式(含-p
)顯示差異。這個(gè)輸出可以被抑制。這只對(duì)-v
國(guó)旗有用。
-v
這個(gè)標(biāo)志導(dǎo)致git diff-tree --stdin
在差異之前也顯示提交消息。
--pretty=<format> --format=<format>
在給定的格式漂亮地打印提交日志中的內(nèi)容,在這里<format>
可以是一個(gè)oneline
,short
,medium
,full
,fuller
,email
,raw
,format:<string>
和tformat:<string>
。什么時(shí)候<format>
沒(méi)有上述情況,并且%placeholder
在其中,它的行為就像--pretty=tformat:<format>
是給予的一樣。
有關(guān)每種格式的其他詳細(xì)信息,請(qǐng)參閱“PRETTY FORMATS”部分。當(dāng)=<format>
零件被省略時(shí),它默認(rèn)為medium
。
注意:您可以在存儲(chǔ)庫(kù)配置中指定默認(rèn)的漂亮格式(請(qǐng)參閱 git-config [1])。
--abbrev-commit
不顯示完整的40字節(jié)十六進(jìn)制提交對(duì)象名稱,只顯示部分前綴。非默認(rèn)位數(shù)可以用“--abbrev = <n>”來(lái)指定(如果顯示,它也會(huì)修改差異輸出)。
這應(yīng)該使“--pretty = oneline”對(duì)于使用80列終端的人來(lái)說(shuō)更加可讀。
--no-abbrev-commit
顯示完整的40字節(jié)十六進(jìn)制提交對(duì)象名稱。這種否定--abbrev-commit
和暗示它的選項(xiàng)如“--oneline”。它也覆蓋log.abbrevCommit
變量。
--oneline
這是一起使用的“--pretty = oneline --abbrev-commit”的縮寫(xiě)。
--encoding=<encoding>
提交對(duì)象在其編碼頭中記錄用于日志消息的編碼; 這個(gè)選項(xiàng)可以用來(lái)告訴命令在用戶首選的編碼中重新編寫(xiě)提交日志消息。對(duì)于非管道命令,默認(rèn)為UTF-8。請(qǐng)注意,如果一個(gè)對(duì)象聲稱被編碼X
并且正在輸出X
,我們將逐字輸出對(duì)象; 這意味著原始提交中的無(wú)效序列可能會(huì)被復(fù)制到輸出中。
--expand-tabs=<n> --expand-tabs --no-expand-tabs
<n>
在輸出中顯示日志消息之前,執(zhí)行一個(gè)標(biāo)簽擴(kuò)展(將每個(gè)標(biāo)簽替換為足夠的空格以填充下一個(gè)顯示列的倍數(shù))。--expand-tabs
是一種短手--expand-tabs=8
,并且--no-expand-tabs
是一種短手--expand-tabs=0
,即禁用選項(xiàng)卡擴(kuò)展。
默認(rèn)情況下,突片在相當(dāng)格式由4個(gè)空格(即縮進(jìn)日志消息擴(kuò)展medium
,這是缺省值,full
和fuller
)。
--notes=<treeish>
在顯示提交日志消息時(shí),顯示注釋提交的注釋?zhuān)ㄕ?qǐng)參閱 git-notes [1])。這是默認(rèn)的git log
,git show
并且git whatchanged
在沒(méi)有命令--pretty
,--format
或者--oneline
在命令行上給出的選項(xiàng)。
默認(rèn)情況下,顯示的注釋來(lái)自core.notesRef
和notes.displayRef
變量(或?qū)?yīng)的環(huán)境覆蓋)中列出的注釋引用。有關(guān)更多詳細(xì)信息,請(qǐng)參閱 git-config [1]。
使用可選<treeish>
參數(shù),使用樹(shù)狀圖來(lái)查找要顯示的注釋。當(dāng)它開(kāi)始時(shí),樹(shù)木可以指定完整的 refname refs/notes/
; 當(dāng)它開(kāi)始時(shí)notes/
,refs/
并且否則refs/notes/
以前綴形成ref的全名。
多個(gè) - 注釋選項(xiàng)可以結(jié)合使用來(lái)控制顯示哪些筆記。例如:“--notes = foo”將只顯示“refs / notes / foo”中的注釋; “--notes = foo --notes”將顯示來(lái)自“refs / notes / foo”和默認(rèn)音符ref(s)的兩個(gè)音符。
--no-notes
不要顯示筆記。這會(huì)取消上述--notes
選項(xiàng),方法是重置從中顯示注釋的注釋列表。選項(xiàng)按照命令行給出的順序進(jìn)行解析,因此,例如“--notes --notes = foo --no-notes --notes = bar”將僅顯示“refs / notes / bar”中的注釋。
--show-notes = <treeish> - 無(wú)標(biāo)準(zhǔn)記錄
這些選項(xiàng)已被棄用。改為使用上面的 - 注釋/ - 無(wú)備注選項(xiàng)。
--show-signature
通過(guò)簽名傳遞gpg --verify
并顯示輸出來(lái)檢查簽名提交對(duì)象的有效性。
--no-commit-id
git diff-tree
在適用時(shí)輸出帶有提交 ID 的行。該標(biāo)志抑制了提交 ID 輸出。
-c
這個(gè)標(biāo)志改變了合并提交的顯示方式(這意味著它只有在給出一個(gè)<tree-ish>命令時(shí)才有用--stdin
)。它顯示了每個(gè)父母對(duì)合并結(jié)果的差異,而不是顯示父母和結(jié)果之間的成對(duì)差異(這是-m
選項(xiàng)的作用)。此外,它只列出所有父母修改過(guò)的文件。
--cc
該標(biāo)志以與-c
選項(xiàng)類(lèi)似的方式改變了合并提交補(bǔ)丁的顯示方式。它意味著-c
和-p
選項(xiàng),并進(jìn)一步壓縮修補(bǔ)程序的輸出,通過(guò)省略父母的內(nèi)容只有兩個(gè)變體的不感興趣的區(qū)塊,并且合并結(jié)果不加修改地挑選其中的一個(gè)。當(dāng)所有的hunks都不感興趣時(shí),就像在任何其他“空比較”情況下一樣,提交本身和提交日志消息也不會(huì)顯示。
--always
即使 diff 本身為空,也要顯示提交本身和提交日志消息。
If the commit is a merge, and if the pretty-format is not oneline
, email
or raw
, an additional line is inserted before the Author:
line. This line begins with "Merge: " and the sha1s of ancestral commits are printed, separated by spaces. Note that the listed commits may not necessarily be the list of the direct parent commits if you have limited your view of history: for example, if you are only interested in changes related to a certain directory or file.
There are several built-in formats, and you can define additional formats by setting a pretty.<name> config option to either another format name, or a format:
string, as described below (see git-config[1]). Here are the details of the built-in formats:
oneline
<sha1> <title line>
This is designed to be as compact as possible.
short
commit <sha1> Author: <author>
<title line>
medium
commit <sha1> Author: <author> Date: <author date>
<title line>
<full commit message>
full
commit <sha1> Author: <author> Commit: <committer>
<title line>
<full commit message>
fuller
commit <sha1> Author: <author> AuthorDate: <author date> Commit: <committer> CommitDate: <committer date>
<title line>
<full commit message>
email
From <sha1> <date> From: <author> Date: <author date> Subject: PATCH <title line>
<full commit message>
raw
The raw
format shows the entire commit exactly as stored in the commit object. Notably, the SHA-1s are displayed in full, regardless of whether --abbrev or --no-abbrev are used, and parents
information show the true parent commits, without taking grafts or history simplification into account. Note that this format affects the way commits are displayed, but not the way the diff is shown e.g. with git log --raw
. To get full object names in a raw diff format, use --no-abbrev
.
format:<string>
The format:<string>
format allows you to specify which information you want to show. It works a little bit like printf format, with the notable exception that you get a newline with %n
instead of \n
.
E.g, format:"The author of %h was %an, %ar%nThe title was >>%s<<%n"
would show something like this:
The author of fe6e0ee was Junio C Hamano, 23 hours ago The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<
The placeholders are:
- `%H`: commit hash
- `%h`: abbreviated commit hash
- `%T`: tree hash
- `%t`: abbreviated tree hash
- `%P`: parent hashes
- `%p`: abbreviated parent hashes
- `%an`: author name
- `%aN`: author name (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))
- `%ae`: author email
- `%aE`: author email (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))
- `%ad`: author date (format respects --date= option)
- `%aD`: author date, RFC2822 style
- `%ar`: author date, relative
- `%at`: author date, UNIX timestamp
- `%ai`: author date, ISO 8601-like format
- `%aI`: author date, strict ISO 8601 format
- `%cn`: committer name
- `%cN`: committer name (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))
- `%ce`: committer email
- `%cE`: committer email (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))
- `%cd`: committer date (format respects --date= option)
- `%cD`: committer date, RFC2822 style
- `%cr`: committer date, relative
- `%ct`: committer date, UNIX timestamp
- `%ci`: committer date, ISO 8601-like format
- `%cI`: committer date, strict ISO 8601 format
- `%d`: ref names, like the --decorate option of [git-log[1]](git-log)
- `%D`: ref names without the " (", ")" wrapping.
- `%e`: encoding
- `%s`: subject
- `%f`: sanitized subject line, suitable for a filename
- `%b`: body
- `%B`: raw body (unwrapped subject and body)
- `%N`: commit notes
- `%GG`: raw verification message from GPG for a signed commit
- `%G?`: show "G" for a good (valid) signature, "B" for a bad signature, "U" for a good signature with unknown validity, "X" for a good signature that has expired, "Y" for a good signature made by an expired key, "R" for a good signature made by a revoked key, "E" if the signature cannot be checked (e.g. missing key) and "N" for no signature
- `%GS`: show the name of the signer for a signed commit
- `%GK`: show the key used to sign a signed commit
- `%gD`: reflog selector, e.g., `refs/stash@{1}` or `refs/stash@{2 minutes ago`}; the format follows the rules described for the `-g` option. The portion before the `@` is the refname as given on the command line (so `git log -g refs/heads/master` would yield `refs/heads/master@{0}`).
- `%gd`: shortened reflog selector; same as `%gD`, but the refname portion is shortened for human readability (so `refs/heads/master` becomes just `master`).
- `%gn`: reflog identity name
- `%gN`: reflog identity name (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))
- `%ge`: reflog identity email
- `%gE`: reflog identity email (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))
- `%gs`: reflog subject
- `%Cred`: switch color to red
- `%Cgreen`: switch color to green
- `%Cblue`: switch color to blue
- `%Creset`: reset color
- `%C(…)`: color specification, as described under Values in the "CONFIGURATION FILE" section of [git-config[1]](git-config). By default, colors are shown only when enabled for log output (by `color.diff`, `color.ui`, or `--color`, and respecting the `auto` settings of the former if we are going to a terminal). `%C(auto,...)` is accepted as a historical synonym for the default (e.g., `%C(auto,red)`). Specifying `%C(always,...) will show the colors even when color is not otherwise enabled (though consider just using `--color=always` to enable color for the whole output, including this format and anything else git might color). `auto` alone (i.e. `%C(auto)`) will turn on auto coloring on the next placeholders until the color is switched again.
- `%m`: left (`<`), right (`>`) or boundary (`-`) mark
- `%n`: newline
- `%%`: a raw `%`
- `%x00`: print a byte from a hex code
- `%w([<w>[,<i1>[,<i2>]]])`: switch line wrapping, like the -w option of [git-shortlog[1]](git-shortlog).
- `%<(<N>[,trunc|ltrunc|mtrunc])`: make the next placeholder take at least N columns, padding spaces on the right if necessary. Optionally truncate at the beginning (ltrunc), the middle (mtrunc) or the end (trunc) if the output is longer than N columns. Note that truncating only works correctly with N >= 2.
- `%<|(<N>)`: make the next placeholder take at least until Nth columns, padding spaces on the right if necessary
- `%>(<N>)`, `%>|(<N>)`: similar to `%<(<N>)`, `%<|(<N>)` respectively, but padding spaces on the left
- `%>>(<N>)`, `%>>|(<N>)`: similar to `%>(<N>)`, `%>|(<N>)` respectively, except that if the next placeholder takes more spaces than given and there are spaces on its left, use those spaces
- `%><(<N>)`, `%><|(<N>)`: similar to `% <(<N>)`, `%<|(<N>)` respectively, but padding both sides (i.e. the text is centered)
- %(trailers): display the trailers of the body as interpreted by [git-interpret-trailers[1]](git-interpret-trailers)
注意 | 一些占位符可能取決于給修訂遍歷引擎的其他選項(xiàng)。例如,%g * reflog選項(xiàng)將插入一個(gè)空字符串,除非我們正在遍歷 reflog 條目(例如,通過(guò)git log -g)。如果在命令行中未提供 --decorate,則%d 和%D 占位符將使用“短”修飾格式。 |
---|
如果+
在%
占位符之后添加(加號(hào)),當(dāng)且僅當(dāng)占位符展開(kāi)為非空字符串時(shí),才在擴(kuò)展之前插入換行符。
如果-
在%
占位符之后添加(減號(hào)),則當(dāng)且僅當(dāng)占位符展開(kāi)為空字符串時(shí),才會(huì)刪除緊接擴(kuò)展之前的所有連續(xù)換行。
如果在%
占位符之后添加(空格),當(dāng)且僅當(dāng)占位符展開(kāi)為非空字符串時(shí),才會(huì)在擴(kuò)展之前插入空格。
tformat:
該tformat:
格式的操作完全相同format:
,不同之處在于它提供了“終結(jié)者”的語(yǔ)義,而不是“分隔符”的語(yǔ)義。換句話說(shuō),每個(gè)提交都附加了消息結(jié)束符(通常是一個(gè)換行符),而不是放置在條目之間的分隔符。這意味著單行格式的最終條目將以新的行正確終止,就像“在線”格式一樣。例如:$ git log -2 --pretty = format:%h 4da45bef \ | perl -pe'$ _。=“ - NO NEWLINE \ n”除非/ \ n /'4da45be 7134973 - 否NEWLINE $ git log -2 --pretty = tformat:%h 4da45bef \ | perl -pe'$ _。=“ - NO NEWLINE \ n”除非/ \ n /'4da45be 7134973
另外,任何無(wú)法識(shí)別的字符串%
都會(huì)被解釋為在它tformat:
前面。例如,這兩個(gè)是等價(jià)的:
$ git log -2 --pretty=tformat:%h 4da45bef $ git log -2 --pretty=%h 4da45bef
如果您只對(duì)一部分文件(例如某些特定于體系結(jié)構(gòu)的文件)的差異感興趣,則可以這樣做:
git diff-tree -r <tree-ish> <tree-ish> arch/ia64 include/asm-ia64
它只會(huì)顯示你在這兩個(gè)目錄中發(fā)生了什么變化。
或者如果你正在尋找剛剛改變的東西,那就kernel/sched.c
去做吧
git diff-tree -r <tree-ish> <tree-ish> kernel/sched.c
它會(huì)忽略與其他文件的所有區(qū)別。
模式始終是前綴,并且完全匹配。沒(méi)有通配符。更嚴(yán)格的是,它必須匹配完整的路徑組件。即“富”不接foobar.h
?!癴oo”確實(shí)匹配,foo/bar.h
所以它可以用來(lái)命名子目錄。
正常使用的一個(gè)例子是:
torvalds@ppc970:~/git> git diff-tree --abbrev 5319e4:100664 100664 ac348b... a01513... git-fsck-objects.c
它告訴你最后一次提交只改變了一個(gè)文件(它來(lái)自這個(gè)文件:
commit 3c6f7ca19ad4043e9e72fa94106f352897e651a8 tree 5319e4d609cdd282069cc4dce33c1db559539b03 parent b4e628ea30d5ab3606119d2ea5caeab141d38df7 author Linus Torvalds <torvalds@ppc970.osdl.org> Sat Apr 9 12:02:30 2005committer Linus Torvalds <torvalds@ppc970.osdl.org> Sat Apr 9 12:02:30 2005Make "git-fsck-objects" print out all the root commits it finds.Once I do the reference tracking, I'll also make it print out all the HEAD commits it finds, which is even more interesting.
如果你在意)。
“git-diff-index”,“git-diff-tree”,“git-diff-files”和“git diff -raw”的原始輸出格式非常相似。
這些命令全部比較兩組事物; 比較不同的是:
git-diff-index <tree-ish>
比較<tree-ish>和文件系統(tǒng)上的文件。
git-diff-index --cached <tree-ish>
比較<tree-ish>和索引。
git-diff-tree -r <tree-ish-1> <tree-ish-2> <pattern>…
比較由兩個(gè)參數(shù)命名的樹(shù)。
git-diff-files <pattern>…
比較索引和文件系統(tǒng)上的文件。
“git-diff-tree”命令通過(guò)打印正在比較的散列來(lái)開(kāi)始輸出。之后,所有命令都會(huì)為每個(gè)更改的文件打印一個(gè)輸出行。
輸出行的格式如下:
in-place edit :100644 100644 bcd1234... 0123456... M file0 copy-edit :100644 100644 abcd123... 1234567... C68 file1 file2 rename-edit :100644 100644 abcd123... 1234567... R86 file1 file3 create :000000 100644 0000000... 1234567... A file4delete :100644 000000 1234567... 0000000... D file5 unmerged :000000 000000 0000000... 0000000... U file6
也就是說(shuō),從左到右:
復(fù)制品。
模式為“src”; 000000如果創(chuàng)建或未合并。
空間。
模式為“dst”; 000000如果刪除或未合并。
空間。
sha1代表“src”; 0 {40}如果創(chuàng)建或未合并。
空間。
sha1為“dst”; 0 {40}如果創(chuàng)建,不合并或“看工作樹(shù)”。
空間。
狀態(tài),然后是可選的“分?jǐn)?shù)”編號(hào)。
選項(xiàng)卡或 NUL -z
選項(xiàng)時(shí)使用。
“src”的路徑
使用選項(xiàng)卡時(shí)-z
選項(xiàng)卡或 NUL ; 只存在于C或R.
“dst”的路徑; 只存在于C或R.
使用LF或 NUL -z
選項(xiàng)時(shí),可以終止記錄。
可能的狀態(tài)字母是:
A:添加一個(gè)文件
C:將文件復(fù)制到新文件中
D:刪除文件
M:修改文件的內(nèi)容或模式
R:重命名文件
T:改變文件的類(lèi)型
U:文件未合并(必須先完成合并,然后才能提交)
X:“未知”更改類(lèi)型(最可能是一個(gè)錯(cuò)誤,請(qǐng)報(bào)告)
狀態(tài)字母 C 和 R 總是跟著一個(gè)分?jǐn)?shù)(表示移動(dòng)或復(fù)制的來(lái)源和目標(biāo)之間的相似百分比)。狀態(tài)字母 M 后可以跟一個(gè)文件重寫(xiě)的分?jǐn)?shù)(表示不相似性的百分比)。
如果文件是文件系統(tǒng)上的新文件并且與索引不同步,則<sha1>顯示為全0。
示例:
:100644 100644 5be4a4...... 000000...... M file.c
如果沒(méi)有這個(gè)-z
選項(xiàng),帶有“不尋常”字符的路徑名將按照配置變量的說(shuō)明引用core.quotePath
(請(qǐng)參閱 git-config [1])。使用-z
文件名是逐字輸出的,并且該行由NUL字節(jié)終止。
"git-diff-tree", "git-diff-files" and "git-diff --raw"可以采取-c
或--cc
選項(xiàng),也產(chǎn)生差異輸出合并提交。輸出與上述格式的不同之處在于:
每個(gè)父母都有一個(gè)冒號(hào)
還有更多的“src”模式和“src”sha1
狀態(tài)是每個(gè)父級(jí)的連接狀態(tài)字符
沒(méi)有可選的“分?jǐn)?shù)”號(hào)碼
單一路徑,僅適用于“dst”
示例:
::100644 100644 100644 fabadb8... cc95eb0... 4866510... MM describe.c
請(qǐng)注意,combined diff
僅列出所有父母修改過(guò)的文件。
當(dāng)使用選項(xiàng)運(yùn)行“git-diff-index”,“git-diff-tree”或“git-diff-files”時(shí),不帶-p
選項(xiàng)運(yùn)行“git diff” --raw
,使用“-p”運(yùn)行“git log”選項(xiàng),它們不會(huì)產(chǎn)生上述輸出; 相反,他們生成一個(gè)補(bǔ)丁文件。您可以通過(guò)GIT_EXTERNAL_DIFF
和GIT_DIFF_OPTS
環(huán)境變量自定義這些修補(bǔ)程序的創(chuàng)建。
-p 選項(xiàng)產(chǎn)生的東西與傳統(tǒng)的diff格式略有不同:
它前面有一個(gè)“git diff”頭文件,它看起來(lái)像這樣:diff --git a / file1 b / file2
在a/
和b/
文件名是,除非重命名/副本所涉及的相同。尤其是,即使是創(chuàng)建或刪除,/dev/null
也可not
用于替換文件名a/
或b/
文件名。
當(dāng)重命名/復(fù)制參與,file1
和file2
示出了重命名/復(fù)制的源文件的名稱和重命名/復(fù)制分別產(chǎn)生,該文件的名稱。
它后跟一個(gè)或多個(gè)擴(kuò)展標(biāo)題行:舊模式<mode>新模式<mode>已刪除文件模式<mode>新文件模式<mode>從<path>復(fù)制到<path>從<path>重命名重命名為<path>相似索引<number>不相似索引<number>索引<hash> .. <hash> <mode>
文件模式打印為6位八進(jìn)制數(shù)字,包括文件類(lèi)型和文件權(quán)限位。
擴(kuò)展標(biāo)題中的路徑名稱不包含a/
和b/
前綴。
相似性指數(shù)是未改變的行的百分比,不相似性指數(shù)是改變的行的百分比。它是一個(gè)向下舍入的整數(shù),后面跟著一個(gè)百分號(hào)。100%的相似性指數(shù)值因此保留給兩個(gè)相同的文件,而100%相異性意味著來(lái)自舊文件的任何行都不會(huì)將其轉(zhuǎn)換為新的文件。
索引行包含更改前后的 SHA-1校驗(yàn)和。如果文件模式?jīng)]有改變,則包含<mode>; 否則,單獨(dú)的行表示舊模式和新模式。
帶有“不常用”字符的路徑名將按照配置變量的說(shuō)明引用core.quotePath
(請(qǐng)參閱git-config [1])。
file1
輸出中的所有文件在提交之前引用文件,所有file2
文件在提交之后引用文件。將每個(gè)更改順序應(yīng)用于每個(gè)文件是不正確的。例如,這個(gè)補(bǔ)丁會(huì)將a和b:diff --git a / ab / b重命名為重命名為b diff --git a / bb / a將重命名從b重命名為a
任何 diff-generating 命令都可以使用-c
或--cc
選項(xiàng)combined diff
在顯示合并時(shí)生成一個(gè)。這是顯示與 git-diff [1]或git-show [1]合并時(shí)的默認(rèn)格式。還要注意,您可以-m
選擇這些命令中的任何一個(gè)來(lái)強(qiáng)制生成合并的單個(gè)父代的差異。
combined diff
格式如下:
diff --combined describe.c index fabadb8,cc95eb0..4866510--- a/describe.c+++ b/describe.c @@@ -98,20 -98,12 +98,20 @@@ return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1; }- static void describe(char *arg) -static void describe(struct commit *cmit, int last_one)++static void describe(char *arg, int last_one) { + unsigned char sha1[20]; + struct commit *cmit; struct commit_list *list; static int initialized = 0; struct commit_name *n; + if (get_sha1(arg, sha1) < 0) + usage(describe_usage); + cmit = lookup_commit_reference(sha1); + if (!cmit) + usage(describe_usage); + if (!initialized) { initialized = 1; for_each_ref(get_name);
它前面有一個(gè)“git diff”頭,看起來(lái)像這樣(當(dāng)使用-c
選項(xiàng)時(shí)):diff - 組合文件
或者像這樣(當(dāng)使用--cc
選項(xiàng)時(shí)):
diff --cc file
它后面跟著一個(gè)或多個(gè)擴(kuò)展標(biāo)題行(此示例顯示與兩個(gè)父級(jí)合并):index <hash>,<hash> .. <hash> mode <mode>,<mode> .. <mode>新文件模式<mode>刪除文件模式<mode>,<mode>
該mode <mode>,<mode>..<mode>
行僅在至少有一個(gè)<mode>與其他行不同時(shí)出現(xiàn)。具有關(guān)于檢測(cè)到的內(nèi)容移動(dòng)(重命名和復(fù)制檢測(cè))的信息的擴(kuò)展標(biāo)題被設(shè)計(jì)為與兩個(gè)<tree-ish>的差異一起工作,并且不被組合的差異格式使用。
緊接著是兩行文件/文件頭--- a / file +++ b / file
類(lèi)似于傳統(tǒng)unified
差異格式的雙行標(biāo)題,/dev/null
用于表示創(chuàng)建或刪除的文件。
塊頭格式被修改以防止人們意外地將其提供給patch -p1
。組合的差異格式是為了審查合并提交更改而創(chuàng)建的,并不適用于應(yīng)用。此更改與擴(kuò)展index
標(biāo)頭中的更改類(lèi)似:@@@ <from-file-range> <from-file-range> <to-file-range> @@@
@
組合diff格式的塊頭中有(父數(shù)+ 1)個(gè)字符。
與傳統(tǒng)的unified
差異格式不同,該格式顯示兩個(gè)文件 A 和 B,其中一列-
(減號(hào) - 出現(xiàn)在 A 中但在 B 中刪除),+
(加 - 在 A 中丟失但添加到B)或" "
(空格 - 不變)前綴,這種格式將兩個(gè)或多個(gè)文件 file1,file2,...與一個(gè)文件X進(jìn)行比較,并顯示 X 與每個(gè) fileN 的不同之處。每個(gè) fileN 的一列都被預(yù)置在輸出行中,以指出X的行與其不同。
-
N 列中的字符表示該行出現(xiàn)在 fileN 中,但不出現(xiàn)在結(jié)果中。+
N 列中的一個(gè)字符表示該行出現(xiàn)在結(jié)果中,而 fileN 沒(méi)有該行(換句話說(shuō),從該父母的角度來(lái)看,該行被添加)。
在上面的輸出示例中,函數(shù)簽名已從兩個(gè)文件中更改(因此-
file1和file2中的兩個(gè)刪除,以及++
意味著已添加的一行不會(huì)出現(xiàn)在file1或file2中)。還有八個(gè)其他行與file1相同,但不會(huì)出現(xiàn)在 file2 中(因此前綴為+
)。
在顯示時(shí)git diff-tree -c
,它將合并提交的父項(xiàng)與合并結(jié)果進(jìn)行比較(即file1..fileN為父項(xiàng))。如圖所示git diff-files -c
,它將兩個(gè)未解決的合并父項(xiàng)與正在運(yùn)行的樹(shù)文件進(jìn)行比較(即file1為階段2 aka“我們的版本”,file2為階段3 aka“他們的版本”)。
--summary
選項(xiàng)介紹新添加,刪除,重命名和復(fù)制的文件。該--stat
選項(xiàng)將 diffstat(1)圖添加到輸出。這些選項(xiàng)可以與其他選項(xiàng)結(jié)合使用,如-p
用于人類(lèi)消費(fèi)。
當(dāng)顯示涉及重命名或復(fù)制的更改時(shí),--stat
輸出會(huì)通過(guò)組合路徑名的通用前綴和后綴來(lái)緊湊地格式化路徑名。例如,移動(dòng)的改變arch/i386/Makefile
,以arch/x86/Makefile
在修改4線將示出這樣的:
arch/{i386 => x86}/Makefile | 4 +--
--numstat
選項(xiàng)提供了diffstat(1)信息,但設(shè)計(jì)用于更簡(jiǎn)單的機(jī)器消耗。--numstat
輸出中的條目如下所示:
1 2 README3 1 arch/{i386 => x86}/Makefile
也就是說(shuō),從左到右:
增加的行數(shù);
標(biāo)簽;
刪除的行數(shù);
標(biāo)簽;
路徑名(可能帶有重命名/復(fù)制信息);
一個(gè)換行符。
當(dāng)-z
輸出選項(xiàng)有效時(shí),輸出格式如下:
1 2 README NUL3 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
那是:
增加的行數(shù);
標(biāo)簽;
刪除的行數(shù);
標(biāo)簽;
NUL(只有在重命名/復(fù)制時(shí)才存在);
preimage 中的路徑名;
NUL(只有在重命名/復(fù)制時(shí)才存在);
postimage中的路徑名(只有在重命名/復(fù)制時(shí)才存在);
NUL。
NUL
重命名之前的 preimage 路徑之前的額外內(nèi)容是允許讀取輸出的腳本判斷當(dāng)前正在讀取的記錄是單路徑記錄還是重命名/復(fù)制記錄,而不提前讀取。閱讀添加和刪除的行后,讀取NUL
會(huì)產(chǎn)生路徑名,但如果是這樣NUL
,該記錄將顯示兩個(gè)路徑。