亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

directory search
Guides gitattributes giteveryday gitglossary gitignore gitmodules gitrevisions gittutorial gitworkflows Administration git archive git bundle git clean git filter-branch git fsck git gc git instaweb git reflog Basic Snapshotting git add git commit git diff git mv git reset git rm git status Branching and Merging git branch git checkout git log git merge git mergetool git stash git tag Debugging git bisect git blame git grep Email git am git format-patch git request-pull git send-email External Systems git fast-import git svn Getting and Creating Projects git clone git init Git git annotate git archimport git bisect-lk2009 git check-attr git check-mailmap git check-ref-format git checkout-index git cherry git citool git column git credential git credential-cache git credential-store git cvsexportcommit git cvsimport git cvsserver git diff-files git diff-tree git difftool git fast-export git fetch-pack git fmt-merge-msg git get-tar-commit-id git gui git http-backend git http-fetch git http-push git imap-send git index-pack git interpret-trailers git ls-remote git ls-tree git mailinfo git mailsplit git merge-file git merge-index git merge-one-file git merge-tree git mktag git mktree git name-rev git notes git p4 git pack-objects git pack-redundant git pack-refs git parse-remote git patch-id git prune git prune-packed git quiltimport git receive-pack git remote-ext git remote-fd git remote-testgit git repack git replace git rerere git send-pack git sh-i18n git sh-setup git shell git show-branch git show-index git stripspace git unpack-file git unpack-objects git upload-archive git upload-pack git var git verify-commit git verify-tag git whatchanged git worktree Inspection and Comparison git describe git shortlog git show Miscellaneous api credentials api index gitcli gitcore tutorial gitcredentials gitcvs migration gitdiffcore githooks gitk gitnamespaces gitremote helpers gitrepository layout gitsubmodules gittutorial 2 gitweb gitweb.conf pack format User Manual Patching git apply git cherry-pick git rebase git revert Plumbing Commands git cat-file git check-ignore git commit-tree git count-objects git diff-index git for-each-ref git hash-object git ls-files git merge-base git read-tree git rev-list git rev-parse git show-ref git symbolic-ref git update-index git update-ref git verify-pack git write-tree Server Admin git daemon git update-server-info Setup and Config git git config git help Sharing and Updating Projects git fetch git pull git push git remote git submodule
characters

命名

git-diff  - 顯示提交,提交和工作樹等之間的變化

概要

git diff [options] [<commit>] [--] [<path>…]git diff [options] --cached [<commit>] [--] [<path>…]git diff [options] <commit> <commit> [--] [<path>…]git diff [options] <blob> <blob>git diff [options] [--no-index] [--] <path> <path>

描述

顯示工作樹與索引或樹之間的更改,索引與樹之間的更改,兩棵樹之間的更改,兩個(gè) Blob 對象之間的更改或磁盤上兩個(gè)文件之間的更改。

git diff --options <path>…

這種形式是查看你相對于索引所做的更改(下一次提交的暫存區(qū)域)。換句話說,不同之處在于你could告訴 Git 進(jìn)一步添加到索引中,但你仍然沒有。您可以使用 git-add [1]來完成這些更改。

git diff --no-index --options <path>…

這種形式是比較文件系統(tǒng)上給定的兩個(gè)路徑。--no-index在由 Git 控制的工作樹中運(yùn)行命令時(shí),可以省略該選項(xiàng),并且至少有一個(gè)路徑位于工作樹之外,或者在由 Git 控制的工作樹之外運(yùn)行該命令。

git diff --options --cached <commit> <path>…

這種形式是查看您為下一次提交相對于指定的 <commit> 進(jìn)行的更改。通常情況下,您需要與最新的提交進(jìn)行比較,所以如果您不提供 <commit> ,則默認(rèn)為 HEAD 。如果 HEAD 不存在(例如未出生的分支)并且未提供 <commit> ,則會顯示所有分階段更改。--staged 是 --cached 的同義詞。

git diff --options <commit> --

這種形式是查看您的工作樹中相對于名為 <commit> 的變化。您可以使用 HEAD 將其與最新的提交進(jìn)行比較,或使用分支名稱與不同分支的提示進(jìn)行比較。

git diff --options <commit> <commit> --

這是查看兩個(gè)任意 <commit> 之間的變化。

git diff --options <commit>..<commit> --

這是以前的形式的代名詞。如果忽略一側(cè)的 <commit> ,它將具有與使用 HEAD 相同的效果。

git diff --options <commit>...<commit> --

這種形式是查看包含第二個(gè) <commit> 的分支上的更改,從兩個(gè) <commit> 的共同祖先開始。“git diff A ... B” 相當(dāng)于 “git diff $(git-merge-base AB)B”。您可以省略 <commit> 中的任何一個(gè),它與使用 HEAD 具有相同的效果。

以防萬一,如果你正在做一些奇特的事情,應(yīng)該注意的是,除了最后兩個(gè)使用“..”符號的形式,上述描述中的所有 <commit> 都可以是任何 <tree> 。

有關(guān)拼寫 <commit> 的更完整列表,請參閱 gitrevisions [7] 中的“指定修訂”部分。然而,“差異”是關(guān)于比較兩個(gè)endpoints,而不是范圍,范圍符號( “<commit> .. <commit>” 和 “<commit> ... <commit>” )并不意味著如 gitrevisions 中的“指定范圍”部分[7]。

git diff options <blob> <blob>

這種形式是查看兩個(gè) blob 對象的原始內(nèi)容之間的差異。

選項(xiàng)

-p   -u   --patch

生成補(bǔ)?。ㄕ垍㈤喩裳a(bǔ)丁一節(jié))。這是默認(rèn)設(shè)置。

-s   --no-patch

抑制差異輸出。對于像git show這樣的命令很有用,默認(rèn)顯示補(bǔ)丁,或者取消效果--patch。

-U<n>   --unified=<n>

使用 <n> 行上下文生成差異,而不是通常的三行。意味著-p。

--raw

以原始格式生成差異。

--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í)間來確保生成最小可能的差異。

--patience

使用“耐心差異”算法生成差異。

--histogram

使用“直方圖差異”算法生成差異。

--diff-algorithm={patience|minimal|histogram|myers}

選擇一種差異算法。變體如下:

default, myers

基本的 diff 算法。目前,這是默認(rèn)設(shè)置。

minimal

花費(fèi)額外的時(shí)間來確保生成最小可能的差異。

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>。文件名部分的寬度可以通過<name-width>逗號后面的另一個(gè)寬度來限制。圖形部分的寬度可以通過使用--stat-graph-width=<width>(影響所有生成統(tǒng)計(jì)圖的命令)或通過設(shè)置diff.statGraphWidth=<width>(不影響git format-patch)來限制。通過給出第三個(gè)參數(shù)<count>,可以將輸出限制在第一<count>行,...如果還有更多的話。

這些參數(shù)也可以單獨(dú)設(shè)置--stat-width=<width>,--stat-name-width=<name-width>--stat-count=<count>。

--numstat

類似于--stat,但顯示十進(jìn)制表示法中添加和刪除的行數(shù)以及不帶縮寫的路徑名,以使其更加機(jī)器友好。對于二進(jìn)制文件,輸出兩個(gè)-而不是說0 0。

--shortstat

只輸出--stat包含修改文件總數(shù)的格式的最后一行,以及添加和刪除行的數(shù)量。

--dirstat=<param1,param2,…>

輸出每個(gè)子目錄的相對變化量分布。--dirstat可以通過傳遞一個(gè)用逗號分隔的參數(shù)列表來定制行為。默認(rèn)值由diff.dirstat配置變量控制(請參閱 git-config [1] )。以下參數(shù)可用:

changes

通過計(jì)算已從源中刪除或添加到目標(biāo)的行來計(jì)算 dirstat 數(shù)字。這會忽略文件中純代碼移動的數(shù)量。換句話說,重新排列文件中的行數(shù)不會與其他更改一樣多。這是沒有給出參數(shù)時(shí)的默認(rèn)行為。

lines

通過執(zhí)行常規(guī)基于行的差異分析來計(jì)算 dirstat 數(shù)字,并且將移除/添加的行數(shù)相加。(對于二進(jìn)制文件,取而代之的是計(jì)算64字節(jié)的塊,因?yàn)槎M(jìn)制文件沒有自然的行概念)。這是一種--dirstatchanges行為更為昂貴的行為,但它可以像其他更改一樣對文件中的重新排列的行進(jìn)行計(jì)數(shù)。結(jié)果輸出與您從其他--*stat選項(xiàng)中獲得的結(jié)果一致。

files

通過計(jì)算更改的文件數(shù)量來計(jì)算 dirstat 數(shù)字。dirstat 分析中每個(gè)更改的文件都相同。這是計(jì)算上最便宜的--dirstat行為,因?yàn)樗静恍枰榭次募?nèi)容。

cumulative

計(jì)數(shù)父目錄的子目錄中的更改。請注意,使用時(shí)cumulative,報(bào)告的百分比總和可能超過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ò)展頭信息的精簡摘要,如創(chuàng)建,重命名和模式更改。

--patch-with-stat

-p --stat的同義詞。

-z

當(dāng)--raw,--numstat,--name-only--name-status已給出,時(shí)間路徑名信息變換完全,并使用完全無效的輸出字段終止符。

如果沒有這個(gè)選項(xiàng),帶有“不尋?!弊址穆窂矫麑凑张渲米兞康恼f明引用core.quotePath(請參閱 git-config [1] )。

--name-only

僅顯示已更改文件的名稱。

--name-status

僅顯示已更改文件的名稱和狀態(tài)。有關(guān)--diff-filter狀態(tài)字母的含義,請參閱選項(xiàng)說明。

--submodule=<format>

指定如何顯示子模塊中的差異。指定使用--submodule=shortshort格式時(shí)。這種格式只顯示范圍開始和結(jié)束處的提交名稱。當(dāng)--submodule或者--submodule=log被指定時(shí),使用log格式。這種格式列出了像 git-submodule [1] summary那樣的提交。當(dāng)--submodule=diff指定時(shí),使用diff格式。這種格式顯示了提交范圍內(nèi)子模塊內(nèi)容變化的內(nèi)聯(lián)比較。如果配置選項(xiàng)未設(shè)置,則默認(rèn)為diff.submoduleshort格式。

--color=<when>

顯示有色差異。--color(即沒有=<when>)是一樣的--color=always。<when>可以是一個(gè)alwaysneverauto。它可以通過color.uicolor.diff配置設(shè)置進(jìn)行更改。

--no-color

關(guān)閉有色差異。這可以用來覆蓋配置設(shè)置。它和--color=never一樣。

--word-diff=<mode>

顯示一個(gè)單詞 diff ,使用 <mode> 分隔已更改的單詞。默認(rèn)情況下,單詞由空格分隔; 見--word-diff-regex下文。<mode> 默認(rèn)為plain,并且必須是以下之一:

color

僅使用顏色突出顯示更改的詞。意味著--color。

plain

將單詞顯示為[-removed-]{+added+}。如果輸入中出現(xiàn)分隔符,則不會嘗試跳過分隔符,因此輸出可能不明確。

porcelain

使用專門用于腳本消費(fèi)的基于行的格式。以通常的統(tǒng)一差異格式打印已添加/已刪除/未更改的運(yùn)行,以行開始處的+/ -/字符開始并延伸至行尾。輸入中~的換行符通過它自己的一行代字符表示。

none

再次禁用字差異。

請注意,盡管第一個(gè)模式的名稱,如果啟用,顏色將用于突出顯示所有模式中更改的部分。

--word-diff-regex=<regex>

使用 <regex> 來決定一個(gè)單詞是什么,而不是將非空白的運(yùn)行視為一個(gè)單詞。也意味著--word-diff除非已經(jīng)啟用。

每個(gè) <regex> 的非重疊匹配都被視為一個(gè)單詞。為了找到差異,這些匹配之間的任何內(nèi)容都被認(rèn)為是空白并被忽略(?。?。你可能想追|[^[:space:]]加到你的正則表達(dá)式,以確保它匹配所有非空白字符。包含換行符的匹配在換行符處被無提地截?cái)啵ǎ。?/p>

例如,--word-diff-regex=.將每個(gè)字符看作單詞,并相應(yīng)地逐個(gè)字符地顯示差異。

正則表達(dá)式也可以通過 diff 驅(qū)動程序或配置選項(xiàng)來設(shè)置,請參閱 gitattributes [5] 或 git-config [1] 。顯式給予它將覆蓋任何 diff 驅(qū)動程序或配置設(shè)置。差異驅(qū)動程序覆蓋配置設(shè)置

--color-words=<regex>

相當(dāng)于--word-diff=color加號(如果指定了正則表達(dá)式)--word-diff-regex=<regex>。

--no-renames

關(guān)閉重命名檢測,即使配置文件提供了默認(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ò)誤contextold或者new把差異線。多個(gè)值以逗號分隔,none重置以前的值,default將列表重置為newall簡寫為old,new,context。如果未給出此選項(xiàng),并且diff.wsErrorHighlight未設(shè)置配置變量,則只會new突出顯示行中的空白錯(cuò)誤??瞻族e(cuò)誤是彩色的color.diff.whitespace。

--full-index

在生成補(bǔ)丁格式輸出時(shí),在“索引”行上顯示完整的映像前和映像后 blob 對象名稱,而不是第一批字符。

--binary

除了--full-index輸出可以應(yīng)用的二進(jìn)制差異git-apply。

--abbrev=<n>

不是在 diff-raw 格式輸出和 diff-tree 標(biāo)題行中顯示完整的40字節(jié)十六進(jìn)制對象名稱,只顯示部分前綴。這與--full-index上面的選項(xiàng)無關(guān),后者控制 diff-patch 輸出格式。非默認(rèn)的位數(shù)可以用指定--abbrev=<n>

-B<n>   --break-rewrites[=<n>]

將完全重寫更改分解為刪除和創(chuàng)建對。這有兩個(gè)目的:

它影響到一種改變的方式,這種改變相當(dāng)于整個(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)為是重命名的來源(通常 -M 僅考慮作為重命名源消失的文件),并且該數(shù)字n控制著 -B 選項(xiàng)的這個(gè)方面(默認(rèn)為50%)。-B20%指定添加和刪除相對于文件大小的20%或更多的更改有資格作為可能的重命名源到另一個(gè)文件。

-M<n>   --find-renames=<n>

檢測重命名。如果n被指定,則它是相似度指數(shù)的閾值(即與文件大小相比的添加/刪除量)。例如,-M90%如果超過90%的文件沒有改變,Git 應(yīng)該考慮刪除/添加對是一個(gè)重命名。如果沒有%符號,該數(shù)字應(yīng)作為分?jǐn)?shù)讀取,并在其前面加小數(shù)點(diǎn)。即,-M5變成0.5,并且因此是相同的-M50%。同樣的,-M05也是一樣的-M5%。要將檢測限制為精確重命名,請使用-M100%。默認(rèn)相似度指數(shù)為50%。

-C<n>   --find-copies=<n>

檢測副本以及重命名。另見--find-copies-harder。如果n被指定,它的含義與-M<n>。

--find-copies-harder

出于性能原因,默認(rèn)情況下,-C只有當(dāng)副本的原始文件在相同的變更集中被修改時(shí),選項(xiàng)才會查找副本。該標(biāo)志使命令檢查未修改的文件作為復(fù)制源的候選項(xiàng)。對于大型項(xiàng)目來說,這是一項(xiàng)非常昂貴的操作,因此請謹(jǐn)慎使用。給予多個(gè)-C選項(xiàng)具有相同的效果。

-D   --irreversible-delete

省略原圖像進(jìn)行刪除,即僅打印標(biāo)題,但不打印原像和之間的差異/dev/null。由此產(chǎn)生的補(bǔ)丁不適用于patchgit apply; 這僅適用于那些想專注于更改后查看文本的人。另外,輸出顯然缺乏足夠的信息來反向應(yīng)用這樣的補(bǔ)丁,甚至是手動的,因此也就是選項(xiàng)的名稱。

在與-B刪除/創(chuàng)建對的刪除部分一起使用時(shí),還要省略原圖。

-l<num>

-M-C選項(xiàng)需要為 O(n ^ 2)的處理時(shí)間,其中 n 是/復(fù)制目標(biāo)潛在的重命名的數(shù)目。如果重命名/復(fù)制目標(biāo)的數(shù)量超過指定的數(shù)量,則此選項(xiàng)可防止重命名/復(fù)制檢測運(yùn)行。

--diff-filter=[(A|C|D|M|R|T|U|X|B)…*]

只選擇已添加(A),已復(fù)制(C),已刪除(D),已修改(M),已重命名(R),其類型(即常規(guī)文件,符號鏈接,子模塊,...)已更改(T),已取消合并(U)未知(X)或已配對Broken(B)??梢允褂萌魏芜^濾字符的組合(包括無)。當(dāng)*(全部或無)添加到組合中時(shí),如果有任何文件與比較中的其他條件匹配,則選擇所有路徑; 如果沒有與其他標(biāo)準(zhǔn)匹配的文件,則不會選擇任何內(nèi)容。

此外,這些大寫字母可以降低排除。例如--diff-filter=ad排除添加和刪除的路徑。

-S<string>

查找改變文件中指定字符串出現(xiàn)次數(shù)(即添加/刪除)的差異。旨在供劇本使用。

當(dāng)你尋找一個(gè)精確的代碼塊(比如一個(gè)結(jié)構(gòu)體)并且想要知道該塊自第一次出現(xiàn)以來的歷史記錄時(shí),它非常有用:迭代地使用該特征將原始圖像中的有趣塊返回到-S,并繼續(xù)前進(jìn),直到獲得該塊的第一個(gè)版本。

-G<regex>

尋找補(bǔ)丁文本包含與 <regex> 匹配的添加/刪除行的差異。

為了說明之間的區(qū)別-S<regex> --pickaxe-regex,并-G<regex>考慮在同一個(gè)文件中的以下 DIFF 提交:

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);...-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

雖然git log -G"regexec\(regexp"會顯示此提交,但git log -S"regexec\(regexp" --pickaxe-regex不會(因?yàn)樵撟址某霈F(xiàn)次數(shù)沒有改變)。

有關(guān)pickaxe更多信息,請參閱 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配置變量(請參閱 git-config [1] )。取消diff.orderFile,使用-O/dev/null。

輸出順序由 <orderfile> 中的全局模式順序決定。所有具有與第一個(gè)模式相匹配的路徑名的文件將首先輸出,接下來將輸出所有具有匹配第二個(gè)模式(但不是第一個(gè))的路徑名的文件,依此類推。最后輸出所有不匹配任何模式的路徑名的文件,就好像文件末尾有一個(gè)隱含的匹配模式一樣。如果多個(gè)路徑名具有相同的排名(它們匹配相同的模式但沒有更早的模式),則它們的輸出順序相對于彼此是正常順序。

按以下方式解析 <orderfile> :

  • 空白行被忽略,所以它們可以用作分隔符以提高可讀性。

  • 以散列(“ #”)開頭的行會被忽略,因此它們可以用于注釋。\如果以散列開頭,則在模式的開頭添加反斜杠(“ ”)。

  • 每隔一行包含一個(gè)模式。

模式與沒有 FNM_PATHNAME 標(biāo)志的 fnmantch(3)使用的模式具有相同的語法和語義,但如果刪除任何數(shù)量的最終路徑名組件都與模式匹配,則路徑名也與模式匹配。例如,模式“ foo*bar”匹配“ fooasdfbar”和“ foo/bar/baz/asdf”但不是“ foobarx”。

-R

交換兩個(gè)輸入; 即顯示索引或磁盤文件與樹內(nèi)容的差異。

--relative=<path>

當(dāng)從項(xiàng)目的子目錄運(yùn)行時(shí),可以通過該選項(xiàng)告知排除目錄外的更改并顯示與其相關(guān)的路徑名。如果不在子目錄中(例如,在裸存儲庫中),可以通過給出 <path> 作為參數(shù)來命名將哪個(gè)子目錄作為輸出的相對位置。

-a   --text

將所有文件視為文本。

--ignore-space-at-eol

忽略 EOL 中的空白變化。

-b   --ignore-space-change

忽略空白量的變化。這會忽略行結(jié)束處的空白,并認(rèn)為一個(gè)或多個(gè)空白字符的所有其他序列是等價(jià)的。

-w   --ignore-all-space

比較行時(shí)忽略空格。即使一行有空白,而另一行沒有空白,這也會忽略差異。

--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)的代碼退出程序。也就是說,如果存在差異,則1退出,0表示沒有差異。

--quiet

禁用程序的所有輸出,意味著--exit-code。

--ext-diff

允許執(zhí)行一個(gè)外部比較助手。如果你用 gitattributes [5]設(shè)置外部差異驅(qū)動程序,你需要在 git-log [1] 和朋友中使用這個(gè)選項(xiàng)。

--no-ext-diff

禁止外部差異驅(qū)動程序。

--textconv   --no-textconv

在比較二進(jìn)制文件時(shí),允許(或不允許)運(yùn)行外部文本轉(zhuǎn)換過濾器。有關(guān)詳細(xì)信息,請參閱 gitattributes [5] 。由于 textconv 過濾器通常是單向轉(zhuǎn)換,因此生成的差異適合人類消費(fèi),但無法應(yīng)用。出于這個(gè)原因,默認(rèn)情況下, textconv 過濾器僅針對 git-diff [1] 和 git-log [1] 啟用,但不適用于 git-format-patch [1] 或 diff plumbing 命令。

--ignore-submodules=<when>

忽略差異代中子模塊的更改。<when> 可以是 “none” ,“untracked” ,“dirty” 或 “all” ,這是默認(rèn)設(shè)置。如果子模塊包含未跟蹤或已修改的文件,或者 HEAD 與超級項(xiàng)目中記錄的提交不同,并且可用于覆蓋ignore git-config [1] 或 gitmodules [5] 中的任何選項(xiàng)設(shè)置,則使用 “none” ]。當(dāng)使用“未跟蹤”時(shí),如果子模塊僅包含未跟蹤內(nèi)容(但仍然針對修改內(nèi)容進(jìn)行掃描),則子模塊不會被視為臟。使用 “dirty” 會忽略對子模塊工作樹的所有更改,只會顯示超級項(xiàng)目中存儲的提交更改(這是1.7.0之前的行為)。使用“全部”隱藏所有子模塊的變化

--src-prefix=<prefix>

顯示給定的源前綴而不是“a /”。

--dst-prefix=<prefix>

顯示給定的目的地前綴而不是“b /”。

--no-prefix

不要顯示任何來源或目的地前綴。

--line-prefix=<prefix>

為每行輸出添加一個(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)性的,可以在將來刪除。

有關(guān)這些常用選項(xiàng)的更詳細(xì)的解釋,請參閱 gitdiffcore [7]。

-1 --base   -2 --ours   -3 --theirs

比較工作樹與“基本”版本(階段#1),“我們的分支”(階段#2)或“他們的分支”(階段#3)。該索引僅包含未組合的條目的這些階段,即在解決沖突時(shí)。有關(guān)詳細(xì)信息,請參閱 git-read-tree [1] 部分 “3-Way Merge” 。

-0

忽略差異輸出未合并的條目并只顯示“未合并”。僅在將工作樹與索引進(jìn)行比較時(shí)才能使用。

<path>…

給出的 <paths> 參數(shù)用于將 diff 限制為指定的路徑(您可以給出目錄名稱并為其下的所有文件獲取 diff )。

原始輸出格式

“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” 命令通過打印正在比較的散列來開始輸出。之后,所有命令都會為每個(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

也就是說,從左到右:

  1. a colon.

  2. mode for "src"; 000000 if creation or unmerged.

  3. a space.

  4. mode for "dst"; 000000 if deletion or unmerged.

  5. a space.

  6. sha1 for "src"; 0{40} if creation or unmerged.

  7. a space.

  8. sha1 for "dst"; 0{40} if creation, unmerged or "look at work tree".

  9. a space.

  10. status, followed by optional "score" number.

  11. a tab or a NUL when -z option is used.

  12. path for "src"

  13. a tab or a NUL when -z option is used; only exists for C or R.

  14. path for "dst"; only exists for C or R.

  15. an LF or a NUL when -z option is used, to terminate the record.

可能的狀態(tài)字母是:

  • A:添加一個(gè)文件

  • C:將文件復(fù)制到新文件中

  • D:刪除文件

  • M:修改文件的內(nèi)容或模式

  • R:重命名文件

  • T:改變文件的類型

  • U:文件未合并(必須先完成合并,然后才能提交)

  • X:“未知”更改類型(最可能是一個(gè)錯(cuò)誤,請報(bào)告)

狀態(tài)字母 C 和 R 總是跟著一個(gè)分?jǐn)?shù)(表示移動或復(fù)制的來源和目標(biāo)之間的相似百分比)。狀態(tài)字母 M 后可以跟一個(gè)文件重寫的分?jǐn)?shù)(表示不相似性的百分比)。

如果文件是文件系統(tǒng)上的新文件并且與索引不同步,則 <sha1> 顯示為全0。

例:

:100644 100644 5be4a4...... 000000...... M file.c

如果沒有這個(gè)-z選項(xiàng),帶有“不尋常”字符的路徑名將按照配置變量的說明引用core.quotePath(請參閱 git-config [1] )。使用-z文件名是逐字輸出的,并且該行由 NUL 字節(jié)終止。

比較格式的合并

“混帳的Diff-樹” ,“混帳的Diff-文件” 和 “混帳DIFF --raw” 可以采取-c--cc選項(xiàng),也產(chǎn)生差異輸出合并提交。輸出與上述格式的不同之處在于:

  1. 每個(gè)父母都有一個(gè)冒號

  2. 還有更多的 “src” 模式和 “src” sha1

  3. 狀態(tài)是每個(gè)父級的連接狀態(tài)字符

  4. 沒有可選的 “分?jǐn)?shù)” 號碼

  5. 單一路徑,僅適用于 “dst”

例:

::100644 100644 100644 fabadb8... cc95eb0... 4866510... MM        describe.c

請注意,combined diff僅列出所有父母修改過的文件。

用 -p 生成補(bǔ)丁

當(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),它們不會產(chǎn)生上述輸出; 相反,他們生成一個(gè)補(bǔ)丁文件。您可以通過GIT_EXTERNAL_DIFFGIT_DIFF_OPTS環(huán)境變量自定義這些修補(bǔ)程序的創(chuàng)建。

-p 選項(xiàng)產(chǎn)生的東西與傳統(tǒng)的 diff 格式略有不同:

  1. 它前面有一個(gè) “git diff” 頭文件,它看起來像這樣:diff --git a / file1 b / file2

a/b/文件名是,除非重命名/副本所涉及的相同。尤其是,即使是創(chuàng)建或刪除,/dev/null也可not用于替換文件名a/b/文件名。

當(dāng)重命名/復(fù)制參與,file1file2示出了重命名/復(fù)制的源文件的名稱和重命名/復(fù)制分別產(chǎn)生,該文件的名稱。

  1. 它后跟一個(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è)百分號。100%的相似性指數(shù)值因此保留給兩個(gè)相同的文件,而100%相異性意味著來自舊文件的任何行都不會將其轉(zhuǎn)換為新的文件。

索引行包含更改前后的 SHA-1 校驗(yàn)和。如果文件模式?jīng)]有改變,則包含 <mode> ; 否則,單獨(dú)的行表示舊模式和新模式。

  1. 帶有“不常用”字符的路徑名將按照配置變量的說明引用core.quotePath(請參閱 git-config [1] )。

  2. file1輸出中的所有文件在提交之前引用文件,所有file2文件在提交之后引用文件。將每個(gè)更改順序應(yīng)用于每個(gè)文件是不正確的。例如,這個(gè)補(bǔ)丁會將 a 和 b :diff --git a / ab / b 重命名為重命名為 b diff --git a / bb / a 將重命名從 b 重命名為 a

結(jié)合 diff 格式

任何 diff-generating 命令都可以使用-c--cc選項(xiàng)combined diff在顯示合并時(shí)生成一個(gè)。這是顯示與 git-diff [1] 或 git-show [1]合并時(shí)的默認(rèn)格式。還要注意,您可以-m選擇這些命令中的任何一個(gè)來強(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);
  1. 它前面有一個(gè) “git diff” 頭,看起來像這樣(當(dāng)使用-c選項(xiàng)時(shí)):diff  - 組合文件

或者像這樣(當(dāng)使用--cc選項(xiàng)時(shí)):

diff --cc file

  1. 它后面跟著一個(gè)或多個(gè)擴(kuò)展標(biāo)題行(此示例顯示與兩個(gè)父級合并):index <hash>,<hash> .. <hash> mode <mode>,<mode> .. <mode>新文件模式 <mode> 刪除文件模式 <mode> ,<mode>

mode <mode>,<mode>..<mode>行僅在至少有一個(gè) <mode> 與其他行不同時(shí)出現(xiàn)。具有關(guān)于檢測到的內(nèi)容移動(重命名和復(fù)制檢測)的信息的擴(kuò)展標(biāo)題被設(shè)計(jì)為與兩個(gè) <tree-ish> 的差異一起工作,并且不被組合的差異格式使用。

  1. 緊接著是 two-line from-file/to-file header --- a / file +++ b / file

類似于傳統(tǒng)unified差異格式的雙行標(biāo)題,/dev/null用于表示創(chuàng)建或刪除的文件。

  1. 塊頭格式被修改以防止人們意外地將其提供給patch -p1。組合的差異格式是為了審查合并提交更改而創(chuàng)建的,并不適用于應(yīng)用。此更改與擴(kuò)展index標(biāo)頭中的更改類似:@@@ <from-file-range> <from-file-range> <to-file-range> @@@

@組合 diff 格式的塊頭中有(父數(shù)+ 1)個(gè)字符。

與傳統(tǒng)的unified差異格式不同,該格式顯示兩個(gè)文件 A 和 B ,其中有一列-(減號 - 出現(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列中的+字符表示該行出現(xiàn)在結(jié)果中,而 fileN沒有該行(換句話說,從該父母的角度來看,該行被添加)。

在上面的輸出示例中,函數(shù)簽名已從兩個(gè)文件中更改(因此 file1 和 file2 中的兩個(gè)-被刪除,以及++意味著已添加的一行不會出現(xiàn)在 file1 或 file2 中)。還有八個(gè)其他行與 file1 相同,但不會出現(xiàn)在 file2 中(因此前綴為+)。

在顯示時(shí)git diff-tree -c,它將合并提交的父項(xiàng)與合并結(jié)果進(jìn)行比較(即 file1..fileN 為父項(xiàng))。如圖所示git diff-files -c,它將兩個(gè)未解決的合并父項(xiàng)與正在工作的樹文件進(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輸出會通過組合路徑名的通用前綴和后綴來緊湊地格式化路徑名。例如,移動的改變arch/i386/Makefile,以arch/x86/Makefile在修改4線將示出這樣的:

arch/{i386 => x86}/Makefile    |   4 +--

--numstat選項(xiàng)提供了 diffstat(1)信息,但設(shè)計(jì)用于更簡單的機(jī)器消耗。--numstat輸出中的條目如下所示:

1        2        README3        1        arch/{i386 => x86}/Makefile

也就是說,從左到右:

  1. 增加的行數(shù);

  2. 標(biāo)簽;

  3. 刪除的行數(shù);

  4. 標(biāo)簽;

  5. 路徑名(可能帶有重命名/復(fù)制信息);

  6. 一個(gè)換行符。

當(dāng)-z輸出選項(xiàng)有效時(shí),輸出格式如下:

1        2        README NUL3        1        NUL arch/i386/Makefile NUL arch/x86/Makefile NUL

那是:

  1. 增加的行數(shù);

  2. 標(biāo)簽;

  3. 刪除的行數(shù);

  4. 標(biāo)簽;

  5. NUL(只有在重命名/復(fù)制時(shí)才存在);

  6. preimage 中的路徑名;

  7. NUL(只有在重命名/復(fù)制時(shí)才存在);

  8. postimage 中的路徑名(只有在重命名/復(fù)制時(shí)才存在);

  9. NUL。

NUL重命名之前的 preimage 路徑之前的額外內(nèi)容是允許讀取輸出的腳本判斷當(dāng)前正在讀取的記錄是單路徑記錄還是重命名/復(fù)制記錄,而不提前讀取。閱讀添加和刪除的行后,讀取NUL會產(chǎn)生路徑名,但如果是這樣NUL,該記錄將顯示兩個(gè)路徑。

例子

各種方法來檢查你的工作樹

$ git diff            (1)$ git diff --cached   (2)$ git diff HEAD       (3)
  1. 下一次提交的工作樹中的更改尚未完成。

  2. 索引和上次提交之間的變化; 如果你運(yùn)行 “git commit” 而沒有 “-a” 選項(xiàng),你會提交什么。

  3. 自上次提交以來工作樹中的更改; 你會運(yùn)行 “git commit -a”

與任意提交進(jìn)行比較

$ git diff test            (1)$ git diff HEAD -- ./test  (2)$ git diff HEAD^ HEAD      (3)
  1. 而不是使用當(dāng)前分支的尖端,與“測試”分支的尖端進(jìn)行比較。

  2. 與“測試”分支的尖端進(jìn)行比較,而不是與當(dāng)前分支的尖端進(jìn)行比較,但將比較限制為“測試”文件。

  3. 比較上次提交和上次提交之前的版本。

比較分支機(jī)構(gòu)

$ git diff topic master    (1)$ git diff topic..master   (2)$ git diff topic...master  (3)
  1. 主題提示與主分支之間的變化。

  2. 同上。

  3. 自主題分支啟動時(shí)發(fā)生在主分支上的更改。

限制差異輸出

$ git diff --diff-filter=MRC            (1)$ git diff --name-status                (2)$ git diff arch/i386 include/asm-i386   (3)
  1. 只顯示修改,重命名和復(fù)制,但不能添加或刪除。

  2. 只顯示名稱和變化的性質(zhì),但不顯示實(shí)際的差異輸出。

  3. 限制差異輸出到指定的子樹。

扼殺差異輸出

$ git diff --find-copies-harder -B -C  (1)$ git diff -R                          (2)
  1. 花費(fèi)額外的周期來查找重命名,復(fù)制和完整重寫(非常昂貴)。

  2. 輸出 diff 反向。

Previous article: Next article: