?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
git-diff-index - 比較樹與工作樹或索引
git diff-index [-m] [--cached] [<common diff options>] <tree-ish> [<path>…]
將樹對(duì)象中發(fā)現(xiàn)的斑點(diǎn)的內(nèi)容和模式與工作樹中相應(yīng)的跟蹤文件或索引中的相應(yīng)路徑進(jìn)行比較。當(dāng)<path>參數(shù)存在時(shí),只比較匹配這些模式的路徑。否則,將比較所有跟蹤的文件。
-p -u --patch
生成補(bǔ)?。ㄕ?qǐng)參閱生成補(bǔ)丁一節(jié))。
-s - 無(wú)補(bǔ)丁
抑制差異輸出。對(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
使用“patience diff”算法生成差異。
--histogram
使用“histogram diff直方圖差異”算法生成差異。
--diff-algorithm={patience|minimal|histogram|myers}
選擇一種差異算法。變體如下:
default
, myers
基本的貪婪diff算法。目前,這是默認(rèn)設(shè)置。
minimal
花費(fèi)額外的時(shí)間來(lái)確保生成最小可能的差異。
patience
生成補(bǔ)丁時(shí)使用“patience diff”算法。
histogram
該算法將耐心算法擴(kuò)展為“support low-occurrence common elements(支持低出現(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
類似于--stat
,但顯示十進(jìn)制表示法中添加和刪除的行數(shù)以及不帶縮寫的路徑名,以使其更加機(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ì)與其他更改一樣多。這是沒有給出參數(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)制文件沒有自然的行概念)。這是一種--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ú)效的輸出字段終止符。
如果沒有這個(gè)選項(xiàng),帶有“unusual”字符的路徑名將按照配置變量的說(shuō)明引用core.quotePath
(請(qǐng)參閱git-config )。
--name-only
僅顯示已更改文件的名稱。
--name-status
僅顯示已更改文件的名稱和狀態(tài)。有關(guān)--diff-filter
狀態(tài)字母的含義,請(qǐng)參閱選項(xiàng)說(shuō)明。
--submodule=<format>
指定如何顯示子模塊中的差異。指定使用--submodule=short
的short
格式時(shí)。這種格式只顯示范圍開始和結(jié)束處的提交名稱。當(dāng)--submodule
或者--submodule=log
被指定時(shí),使用log
格式。這種格式列出了像git-submodule summary
那樣的提交。當(dāng)--submodule=diff
指定時(shí),使用diff
格式。這種格式顯示了提交范圍內(nèi)子模塊內(nèi)容變化的內(nèi)嵌比較。如果配置選項(xiàng)未設(shè)置,則默認(rèn)為diff.submodule
或short
格式。
--color=<when>
顯示有色差異。--color
(即沒有=<when>
)是一樣的--color=always
。<when>
可以是一個(gè)always
,never
或auto
。
--no-color
關(guān)閉有色差異。它和--color=never
。一樣。
--word-diff=<mode>
顯示一個(gè)單詞diff,使用<mode>分隔已更改的單詞。默認(rèn)情況下,單詞由空格分隔; 見--word-diff-regex
下文。<mode>默認(rèn)為plain
,并且必須是以下之一:
color
僅使用顏色突出顯示更改的詞。意味著--color
。
plain
將單詞顯示為[-removed-]
和{+added+}
。如果輸入中出現(xiàn)分隔符,則不會(huì)嘗試跳過(guò)分隔符,因此輸出可能不明確。
porcelain
使用專門用于腳本消費(fèi)的基于行的格式。以通常的統(tǒng)一差異格式打印已添加/已刪除/未更改的運(yùn)行,以行開頭處的+
/ -
/字符開始并延伸至行尾。輸入中~
的換行符通過(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)為是空白并被忽略(?。?。你可能想追|[^[: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或git-config。顯式給予它將覆蓋任何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)問題,則退出非零狀態(tài)。與--exit-code不兼容。
--ws-error-highlight=<kind>
突出顯示空白的錯(cuò)誤context
,old
或者new
把差異線。多個(gè)值以逗號(hào)分隔,none
重置以前的值,default
將列表重置為new
并all
簡(jiǎn)寫為old,new,context
。如果未給出此選項(xiàng),并且diff.wsErrorHighlight
未設(shè)置配置變量,則只會(huì)new
突出顯示行中的空白錯(cuò)誤??瞻族e(cuò)誤是彩色的color.diff.whitespace
。
--full-index
在生成補(bǔ)丁格式輸出時(shí),在“index”行上顯示完整的映像前和映像后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>]
將完全重寫更改分解為刪除和創(chuàng)建對(duì)。這有兩個(gè)目的:
它影響到一種改變的方式,這種改變相當(dāng)于整個(gè)文件的重寫,而不是像一系列刪除和插入混合在一起,只有幾行文本與上下文相匹配,但是作為一個(gè)單一的刪除舊的一切,隨后是一個(gè)單次插入所有新事物,并且數(shù)字m
控制-B選項(xiàng)的這個(gè)方面(默認(rèn)為60%)。-B/70%
指定只有少于30%的原始數(shù)據(jù)應(yīng)保留在Git的結(jié)果中,以便將其視為全部重寫(否則結(jié)果補(bǔ)丁將是一系列與上下文行混合的刪除和插入)。
與-M一起使用時(shí),完全重寫的文件也被認(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%的文件沒有改變,Git應(yīng)該考慮刪除/添加對(duì)是一個(gè)重命名。如果沒有%
符號(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è)副本以及重命名。另見--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
; 這僅適用于那些想專注于更改后查看文本的人。另外,輸出顯然缺乏足夠的信息來(lái)反向應(yīng)用這樣的補(bǔ)丁,甚至是手動(dòng)的,因此也就是選項(xiàng)的名稱。
在與-B
delete/create對(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)…*]
選擇僅Added (A
), Copied (C
),Deleted (D
),Modified (M
),Renamed (R
),其類型(即常規(guī)文件,符號(hào)鏈接,子模塊,...)changed (T
), Unmerged (U
), 是 Unknown (X
),或已配對(duì)Broken(B
)。可以使用任何過(guò)濾字符的組合(包括無(wú))。當(dāng)*
(全部或無(wú))添加到組合中時(shí),如果有任何文件與比較中的其他條件匹配,則選擇所有路徑; 如果沒有與其他標(biāo)準(zhǔn)匹配的文件,則不會(huì)選擇任何內(nèi)容。
此外,這些大寫字母可以降低排除。例如--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ù)沒有改變)。
有關(guān)pickaxe
更多信息,請(qǐng)參閱gitdiffcore中的條目。
--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è))的路徑名的文件,依此類推。最后輸出所有不匹配任何模式的路徑名的文件,就好像文件末尾有一個(gè)隱含的匹配模式一樣。如果多個(gè)路徑名具有相同的排名(它們匹配相同的模式但沒有更早的模式),則它們的輸出順序相對(duì)于彼此是正常順序。
按以下方式解析<orderfile>:
空白行被忽略,所以它們可以用作分隔符以提高可讀性。
以散列(“ #
”)開頭的行會(huì)被忽略,因此它們可以用于注釋。\
如果以散列開頭,則在模式的開頭添加反斜杠(“ ”)。
每隔一行包含一個(gè)模式。
模式與沒有FNM_PATHNAME標(biāo)志的fnmantch(3)使用的模式具有相同的語(yǔ)法和語(yǔ)義,但如果刪除任何數(shù)量的最終路徑名組件都與模式匹配,則路徑名也與模式匹配。例如,模式“ foo*bar
”匹配“ fooasdfbar
”和“ foo/bar/baz/asdf
”但不是“ foobarx
”。
-R
交換兩個(gè)輸入;即顯示索引或磁盤文件與樹內(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í)忽略空格。即使一行有空白,而另一行沒有空白,這也會(huì)忽略差異。
--ignore-blank-lines
忽略其行全部空白的更改。
--inter-hunk-context=<lines>
顯示差異hunk之間的上下文,直到指定的行數(shù),從而融合彼此接近的hunk。diff.interHunkContext
如果配置選項(xiàng)未設(shè)置,則默認(rèn)為0或0。
-W --function-context
顯示整個(gè)周圍的變化功能。
--exit-code
用類似于diff(1)的代碼退出程序。也就是說(shuō),如果存在差異,則1退出,0表示沒有差異。
--quiet
禁用程序的所有輸出。意味著--exit-code
。
--ext-diff
允許執(zhí)行一個(gè)外部比較助手。如果你用gitattributes設(shè)置外部差異驅(qū)動(dòng)程序,你需要在git-log和朋友中使用這個(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。由于textconv過(guò)濾器通常是單向轉(zhuǎn)換,因此生成的差異適合人類消費(fèi),但無(wú)法應(yīng)用。出于這個(gè)原因,默認(rèn)情況下,textconv過(guò)濾器僅針對(duì)git-diff和git-log啟用,但不適用于git-format-patch或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ì)子模塊工作樹的所有更改,只會(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ì)的解釋,請(qǐng)參閱gitdiffcore。
<tree-ish>
樹對(duì)象的ID來(lái)區(qū)分。
--cached
根本不考慮磁盤上的文件
-m
默認(rèn)情況下,記錄在索引但未檢出的文件被報(bào)告為已刪除。該標(biāo)志git diff-index
表示所有未簽出的文件都是最新的。
“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ù)命名的樹。
git-diff-files <pattern>…
比較索引和文件系統(tǒng)上的文件。
“git-diff-tree”命令通過(guò)打印正在比較的散列來(lá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ō),從左到右:
到結(jié)腸。
模式為“src”; 000000如果創(chuàng)建或未合并。
空間。
模式為“dst”; 000000如果刪除或未合并。
空間。
sha1代表“src”; 0 {40}如果創(chuàng)建或未合并。
空間。
sha1為“dst”; 0 {40}如果創(chuàng)建,不合并或“看工作樹”。
空間。
狀態(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:改變文件的類型
U:文件未合并(必須先完成合并,然后才能提交)
X:“unkown”更改類型(最可能是一個(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è)文件重寫的分?jǐn)?shù)(表示不相似性的百分比)。
如果文件是文件系統(tǒng)上的新文件并且與索引不同步,則<sha1>顯示為全0。
示例:
:100644 100644 5be4a4...... 000000...... M file.c
如果沒有這個(gè)-z
選項(xiàng),帶有“unusual”字符的路徑名將按照配置變量的說(shuō)明引用core.quotePath
(請(qǐng)參閱git-config [1])。使用-z
文件名是逐字輸出的,并且該行由NUL字節(jié)終止。
"git-diff-tree", "git-diff-files"和“"git-diff --raw"可以采取-c
或--cc
選項(xiàng),也產(chǎn)生差異輸出合并提交。輸出與上述格式的不同之處在于:
每個(gè)父母都有一個(gè)冒號(hào)
還有更多的“src”模式和“src”sha1
狀態(tài)是每個(gè)父級(jí)的連接狀態(tài)字符
沒有可選的“score”號(hào)碼
單一路徑,僅適用于“dst”
示例:
::100644 100644 100644 fabadb8... cc95eb0... 4866510... MM describe.c
請(qǐng)注意,combined diff
僅列出所有父級(jí)修改過(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)rename/copy參與,file1
和file2
示出了重命名/復(fù)制的源文件的名稱和rename/copy分別產(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ù)字,包括文件類型和文件權(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)。
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或git-show合并時(shí)的默認(rèn)格式。還要注意,您可以-m
選擇這些命令中的任何一個(gè)來(lái)強(qiáng)制生成合并的單個(gè)父代的差異。
一個(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”header,看起來(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
類似于傳統(tǒng)unified
差異格式的雙行標(biāo)題,/dev/null
用于表示創(chuàng)建或刪除的文件。
2. 塊頭格式被修改以防止人們意外地將其提供給patch -p1
。組合的差異格式是為了審查合并提交更改而創(chuàng)建的,并不適用于應(yīng)用。此更改與擴(kuò)展index
標(biāo)頭中的更改類似:@@@ <from-file-range> <from-file-range> <to-file-range> @@@
@
組合diff格式的塊頭中有(parents+ 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沒有該行(換句話說(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)行的樹文件進(jìn)行比較(即file1為階段2 aka“我們的版本”,file2為階段3 aka“他們的版本”)。
--summary
選項(xiàng)介紹新添加,刪除,重命名和復(fù)制的文件。--stat
選項(xiàng)將diffstat(1)圖添加到輸出。這些選項(xiàng)可以與其他選項(xiàng)結(jié)合使用,如-p
用于人類消費(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)簽;
路徑名(可能帶有rename/copy信息);
一個(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è)路徑。
您可以選擇是完全信任索引文件(使用--cached
標(biāo)志),還是要求diff邏輯顯示任何與stat狀態(tài)不匹配的文件,因?yàn)樗鼈儭皌entatively changed”。這兩種操作的確非常有用。
如果--cached
指定,它允許你問:
show me the differences between HEAD and the current indexcontents (the ones I'd write using 'git write-tree')
例如,假設(shè)您已經(jīng)在您的工作目錄上工作,更新了索引中的一些文件并準(zhǔn)備好提交。你想看看到底什么你要提交,而無(wú)需編寫一個(gè)新的樹對(duì)象,并比較這種方式,要做到這一點(diǎn),你只是做
git diff-index --cached HEAD
例如:假設(shè)我已經(jīng)重命名commit.c
為git-commit.c
,并且我已經(jīng)完成了update-index
在索引文件中使其生效。git diff-files
根本不會(huì)顯示任何內(nèi)容,因?yàn)樗饕募c我的工作目錄匹配。但做一個(gè)git diff-index
確實(shí)如此:
torvalds@ppc970:~/git> git diff-index --cached HEAD-100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 commit.c+100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 git-commit.c
你可以很容易地看到上述是重命名。
實(shí)際上,git diff-index --cached
應(yīng)該完全等同于實(shí)際進(jìn)行git write-tree
和比較。除此之外,你只是想檢查你的位置,這種情況要好得多。
因此,git diff-index --cached
當(dāng)你問自己“我已經(jīng)標(biāo)記了什么被提交了,以及與以前的樹有什么不同”時(shí),這樣做基本上非常有用。
“非緩存”模式采用不同的方法,并且可能更有用,因?yàn)樗荒苡?code>git write-tree+ 來(lái)模擬git diff-tree
。因此這是默認(rèn)模式。非緩存版本會(huì)問這個(gè)問題:
向我展示HEAD和當(dāng)前簽出的區(qū)別 樹 - 索引內(nèi)容_and_不是最新的文件
這顯然是一個(gè)非常有用的問題,因?yàn)樗嬖V你可以提交什么。再一次,輸出與輸出相匹配git diff-tree -r
,但帶有扭曲。
扭曲的是,如果某個(gè)文件與索引不匹配,我們就沒有支持存儲(chǔ)的東西,我們使用神奇的“全零”sha1來(lái)表明這一點(diǎn)。假設(shè)你已經(jīng)編輯過(guò)kernel/sched.c
,但實(shí)際上還沒有完成git update-index
- 沒有與新狀態(tài)關(guān)聯(lián)的“object”,你會(huì)得到:
torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD:100644 100664 7476bb... 000000... kernel/sched.c
即它表明樹已經(jīng)改變,并且kernel/sched.c
不是最新的并且可能包含新的東西。全零的sha1意味著要獲得真正的差異,您需要直接在工作目錄中查看對(duì)象,而不是執(zhí)行對(duì)象到對(duì)象的差異。
注意 | 和其他這種類型的命令一樣,git diff-index實(shí)際上根本不會(huì)查看文件的內(nèi)容。所以也許kernel / sched.c實(shí)際上并沒有改變,只是你觸及它而已。在任何一種情況下,都要注意你需要對(duì)它進(jìn)行更新索引以使索引同步。 |
---|
注意 | 您可以將文件混合在一起顯示為“已更新”和“仍在工作目錄中”。你總是可以知道哪個(gè)文件處于哪個(gè)狀態(tài),因?yàn)椤耙驯桓隆钡奈募@示有效的sha1,而“與索引不同步”的文件將始終有特殊的全零sha1。 |
---|