亚洲国产日韩欧美一区二区三区,精品亚洲国产成人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-index  - 比較樹與工作樹或索引

概要

git diff-index [-m] [--cached] [<common diff options>] <tree-ish> [<path>…]

描述

將樹對象中發(fā)現(xiàn)的斑點的內(nèi)容和模式與工作樹中相應(yīng)的跟蹤文件或索引中的相應(yīng)路徑進(jìn)行比較。當(dāng)<path>參數(shù)存在時,只比較匹配這些模式的路徑。否則,將比較所有跟蹤的文件。

選項

-p   -u   --patch

生成補(bǔ)丁(請參閱生成補(bǔ)丁一節(jié))。

-s  - 無補(bǔ)丁

抑制差異輸出。對于像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)整實驗啟發(fā)式(默認(rèn)情況下是關(guān)閉的),這些啟發(fā)式技術(shù)改變了差異邊界以使修補(bǔ)程序更易于閱讀。

--minimal

花費額外的時間來確保生成最小可能的差異。

--patience

使用“patience diff”算法生成差異。

--histogram

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

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

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

default, myers

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

minimal

花費額外的時間來確保生成最小可能的差異。

patience

生成補(bǔ)丁時使用“patience diff”算法。

histogram

該算法將耐心算法擴(kuò)展為“support low-occurrence common elements(支持低出現(xiàn)率的通用元素)”。

例如,如果您將diff.algorithm變量配置為非默認(rèn)值并且想要使用默認(rèn)值,那么您必須使用--diff-algorithm=default選項。

--stat[=<width>[,<name-width>,<count>]]

生成一個diffstat。默認(rèn)情況下,文件名部分使用盡可能多的空間,其余部分使用圖形部分。最大寬度默認(rèn)為終端寬度,如果未連接到終端,則最大寬度為80列,并且可以被覆蓋<width>。文件名部分的寬度可以通過<name-width>逗號后面的另一個寬度來限制。圖形部分的寬度可以通過使用--stat-graph-width=<width>(影響所有生成統(tǒng)計圖的命令)或通過設(shè)置diff.statGraphWidth=<width>(不影響git format-patch)來限制。通過給出第三個參數(shù)<count>,可以將輸出限制在第一<count>行,...如果還有更多的話。

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

--numstat

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

--shortstat

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

--dirstat=<param1,param2,…>

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

changes

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

lines

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

files

通過計算更改的文件數(shù)量來計算dirstat數(shù)字。dirstat分析中每個更改的文件都相同。這是計算上最便宜的--dirstat行為,因為它不必查看文件內(nèi)容。

cumulative

計數(shù)父目錄的子目錄中的更改。請注意,使用時cumulative,報告的百分比總和可能超過100%。默認(rèn)(非累積)行為可以用noncumulative參數(shù)指定。

<limit>

整數(shù)參數(shù)指定截斷百分比(默認(rèn)為3%)。輸出中不顯示貢獻(xiàn)小于此百分比的目錄。

示例:以下內(nèi)容將計數(shù)已更改的文件,同時忽略占已更改文件總數(shù)少于10%的目錄,并累積父目錄中的子目錄計數(shù):--dirstat=files,10,cumulative

--summary

輸出擴(kuò)展頭信息的精簡摘要,如創(chuàng)建,重命名和模式更改。

--patch-with-stat

-p --stat的同義詞。

-z

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

如果沒有這個選項,帶有“unusual”字符的路徑名將按照配置變量的說明引用core.quotePath(請參閱git-config )。

--name-only

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

--name-status

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

--submodule=<format>

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

--color=<when>

顯示有色差異。--color(即沒有=<when>)是一樣的--color=always。<when>可以是一個always,neverauto。

--no-color

關(guān)閉有色差異。它和--color=never。一樣。

--word-diff=<mode>

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

color

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

plain

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

porcelain

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

none

再次禁用字差異。

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

--word-diff-regex=<regex>

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

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

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

正則表達(dá)式也可以通過diff驅(qū)動程序或配置選項來設(shè)置,請參閱gitattributes或git-config。顯式給予它將覆蓋任何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)記或空白錯誤。認(rèn)為空白錯誤由core.whitespace配置控制。默認(rèn)情況下,尾隨空格(包括單獨由空格組成的行)和空格字符(緊跟該行的初始縮進(jìn)內(nèi)的制表符后面的空格字符)將被視為空白錯誤。如果發(fā)現(xiàn)問題,則退出非零狀態(tài)。與--exit-code不兼容。

--ws-error-highlight=<kind>

突出顯示空白的錯誤contextold或者new把差異線。多個值以逗號分隔,none重置以前的值,default將列表重置為newall簡寫為old,new,context。如果未給出此選項,并且diff.wsErrorHighlight未設(shè)置配置變量,則只會new突出顯示行中的空白錯誤??瞻族e誤是彩色的color.diff.whitespace。

--full-index

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

--binary

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

--abbrev=<n>

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

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

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

它影響到一種改變的方式,這種改變相當(dāng)于整個文件的重寫,而不是像一系列刪除和插入混合在一起,只有幾行文本與上下文相匹配,但是作為一個單一的刪除舊的一切,隨后是一個單次插入所有新事物,并且數(shù)字m控制-B選項的這個方面(默認(rèn)為60%)。-B/70%指定只有少于30%的原始數(shù)據(jù)應(yīng)保留在Git的結(jié)果中,以便將其視為全部重寫(否則結(jié)果補(bǔ)丁將是一系列與上下文行混合的刪除和插入)。

與-M一起使用時,完全重寫的文件也被認(rèn)為是重命名的來源(通常-M僅考慮作為重命名源消失的文件),并且該數(shù)字n控制著-B選項的這個方面(默認(rèn)為50%)。-B20%指定添加和刪除相對于文件大小的20%或更多的更改有資格作為重命名為其他文件的可能來源。

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

檢測重命名。如果n被指定,則它是相似度指數(shù)的閾值(即與文件大小相比的添加/刪除量)。例如,-M90%如果超過90%的文件沒有改變,Git應(yīng)該考慮刪除/添加對是一個重命名。如果沒有%符號,該數(shù)字應(yīng)作為分?jǐn)?shù)讀取,并在其前面加小數(shù)點。即,-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)副本的原始文件在相同的變更集中被修改時,選項才會查找副本。該標(biāo)志使命令檢查未修改的文件作為復(fù)制源的候選項。對于大型項目來說這是一項非常昂貴的操作,因此請謹(jǐn)慎使用。給予多個-C選項具有相同的效果。

-D   --irreversible-delete

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

在與-Bdelete/create對的刪除部分一起使用時,還要省略原像。

-l<num>

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

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

選擇僅Added (A), Copied (C),Deleted (D),Modified (M),Renamed (R),其類型(即常規(guī)文件,符號鏈接,子模塊,...)changed (T), Unmerged (U), 是 Unknown (X),或已配對Broken(B)。可以使用任何過濾字符的組合(包括無)。當(dāng)*(全部或無)添加到組合中時,如果有任何文件與比較中的其他條件匹配,則選擇所有路徑; 如果沒有與其他標(biāo)準(zhǔn)匹配的文件,則不會選擇任何內(nèi)容。

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

-S<string>

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

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

-G<regex>

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

為了說明之間的區(qū)別-S<regex> --pickaxe-regex,并-G<regex>考慮在同一個文件中的以下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不會(因為該字符串的出現(xiàn)次數(shù)沒有改變)。

有關(guān)pickaxe更多信息,請參閱gitdiffcore中的條目。

--pickaxe-all

當(dāng)-S-G發(fā)現(xiàn)更改時,顯示該更改集中的所有更改,而不僅僅是包含<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>中的全局模式順序決定。所有具有與第一個模式相匹配的路徑名的文件將首先輸出,接下來將輸出所有具有匹配第二個模式(但不是第一個)的路徑名的文件,依此類推。最后輸出所有不匹配任何模式的路徑名的文件,就好像文件末尾有一個隱含的匹配模式一樣。如果多個路徑名具有相同的排名(它們匹配相同的模式但沒有更早的模式),則它們的輸出順序相對于彼此是正常順序。

按以下方式解析<orderfile>:

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

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

  • 每隔一行包含一個模式。

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

-R

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

--relative=<path>

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

-a   --text

將所有文件視為文本。

--ignore-space-at-eol

忽略EOL中的空白變化。

-b   --ignore-space-change

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

-w   --ignore-all-space

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

--ignore-blank-lines

忽略其行全部空白的更改。

--inter-hunk-context=<lines>

顯示差異hunk之間的上下文,直到指定的行數(shù),從而融合彼此接近的hunk。diff.interHunkContext如果配置選項未設(shè)置,則默認(rèn)為0或0。

-W   --function-context

顯示整個周圍的變化功能。

--exit-code

用類似于diff(1)的代碼退出程序。也就是說,如果存在差異,則1退出,0表示沒有差異。

--quiet

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

--ext-diff

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

--no-ext-diff

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

--textconv   --no-textconv

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

--ignore-submodules=<when>

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

--src-prefix=<prefix>

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

--dst-prefix=<prefix>

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

--no-prefix

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

--line-prefix=<prefix>

為每行輸出預(yù)留一個額外的前綴。

--ita-invisible-in-index

默認(rèn)情況下,由“git add -N”添加的條目顯示為“git diff”中的現(xiàn)有空文件和“git diff --cached”中的新文件。該選項使得該條目在“git diff”中顯示為新文件,而在“git diff --cached”中不存在。這個選項可以恢復(fù)--ita-visible-in-index。這兩個選項都是實驗性的,可以在將來刪除。

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

<tree-ish>

樹對象的ID來區(qū)分。

--cached

根本不考慮磁盤上的文件

-m

默認(rèn)情況下,記錄在索引但未檢出的文件被報告為已刪除。該標(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>…

比較由兩個參數(shù)命名的樹。

git-diff-files <pattern>…

比較索引和文件系統(tǒng)上的文件。

“git-diff-tree”命令通過打印正在比較的散列來開始輸出。之后,所有命令都會為每個更改的文件打印一個輸出行。

輸出行的格式如下:

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. 到結(jié)腸。

  2. 模式為“src”; 000000如果創(chuàng)建或未合并。

  3. 空間。

  4. 模式為“dst”; 000000如果刪除或未合并。

  5. 空間。

  6. sha1代表“src”; 0 {40}如果創(chuàng)建或未合并。

  7. 空間。

  8. sha1為“dst”; 0 {40}如果創(chuàng)建,不合并或“看工作樹”。

  9. 空間。

  10. 狀態(tài),然后是可選的“分?jǐn)?shù)”編號。

  11. 選項卡或NUL -z選項時使用。

  12. “src”的路徑

  13. 使用選項卡時-z選項卡或NUL ; 只存在于C或R.

  14. “dst”的路徑;只存在于C或R.

  15. 使用LF或NUL -z選項時,可以終止記錄。

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

  • A:添加一個文件

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

  • D:刪除文件

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

  • R:重命名文件

  • T:改變文件的類型

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

  • X:“unkown”更改類型(最可能是一個錯誤,請報告)

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

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

示例:

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

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

比較格式的合并

"git-diff-tree", "git-diff-files"和“"git-diff --raw"可以采取-c--cc選項,也產(chǎn)生差異輸出合并提交。輸出與上述格式的不同之處在于:

  1. 每個父母都有一個冒號

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

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

  4. 沒有可選的“score”號碼

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

示例:

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

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

用-p生成補(bǔ)丁

當(dāng)使用選項運行“git-diff-index”,“git-diff-tree”或“git-diff-files”時,不帶-p選項運行“git diff” --raw,使用“-p”運行“git log”選項,它們不會產(chǎn)生上述輸出;相反,他們生成一個補(bǔ)丁文件。您可以通過GIT_EXTERNAL_DIFFGIT_DIFF_OPTS環(huán)境變量自定義這些修補(bǔ)程序的創(chuàng)建。

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

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

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

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

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

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

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

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

結(jié)合diff格式

任何diff-generating命令都可以使用-c--cc選項combined diff在顯示合并時生成一個。這是顯示與git-diff或git-show合并時的默認(rèn)格式。還要注意,您可以-m選擇這些命令中的任何一個來強(qiáng)制生成合并的單個父代的差異。

一個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. 它前面有一個“git diff”header,看起來像這樣(當(dāng)使用-c選項時):diff  - 組合文件

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

diff --cc file

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

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

  1. 緊接著是兩行文件/文件頭--- 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)個字符。

與傳統(tǒng)的unified差異格式不同,該格式顯示兩個文件A和B,其中一列-(減號 - 出現(xiàn)在A中但在B中刪除),+(加 - 在A中丟失但添加到B)或" "(空格 - 不變)前綴,這種格式將兩個或多個文件file1,file2,...與一個文件X進(jìn)行比較,并顯示X與每個fileN的不同之處。每個fileN的一列都被預(yù)置在輸出行中,以指出X的行與其不同。

-N列中的字符表示該行出現(xiàn)在fileN中,但不出現(xiàn)在結(jié)果中。+N列中的一個字符表示該行出現(xiàn)在結(jié)果中,而fileN沒有該行(換句話說,從該父母的角度來看,該行被添加)。

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

在顯示時git diff-tree -c,它將合并提交的父項與合并結(jié)果進(jìn)行比較(即file1..fileN為父項)。如圖所示git diff-files -c,它將兩個未解決的合并父項與正在運行的樹文件進(jìn)行比較(即file1為階段2 aka“我們的版本”,file2為階段3 aka“他們的版本”)。

其他差異格式

--summary選項介紹新添加,刪除,重命名和復(fù)制的文件。--stat選項將diffstat(1)圖添加到輸出。這些選項可以與其他選項結(jié)合使用,如-p用于人類消費。

當(dāng)顯示涉及重命名或復(fù)制的更改時,--stat輸出會通過組合路徑名的通用前綴和后綴來緊湊地格式化路徑名。例如,移動的改變arch/i386/Makefile,以arch/x86/Makefile在修改4線將示出這樣的:

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

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

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

也就是說,從左到右:

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

  2. 標(biāo)簽;

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

  4. 標(biāo)簽;

  5. 路徑名(可能帶有rename/copy信息);

  6. 一個換行符。

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

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ù)制時才存在);

  6. preimage中的路徑名;

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

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

  9. NUL。

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

操作模式

您可以選擇是完全信任索引文件(使用--cached標(biāo)志),還是要求diff邏輯顯示任何與stat狀態(tài)不匹配的文件,因為它們“tentatively 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)備好提交。你想看看到底什么你要提交,而無需編寫一個新的樹對象,并比較這種方式,要做到這一點,你只是做

git diff-index --cached HEAD

例如:假設(shè)我已經(jīng)重命名commit.cgit-commit.c,并且我已經(jīng)完成了update-index在索引文件中使其生效。git diff-files根本不會顯示任何內(nèi)容,因為索引文件與我的工作目錄匹配。但做一個git diff-index確實如此:

torvalds@ppc970:~/git> git diff-index --cached HEAD-100644 blob    4161aecc6700a2eb579e842af0b7f22b98443f74        commit.c+100644 blob    4161aecc6700a2eb579e842af0b7f22b98443f74        git-commit.c

你可以很容易地看到上述是重命名。

實際上,git diff-index --cached 應(yīng)該完全等同于實際進(jìn)行git write-tree和比較。除此之外,你只是想檢查你的位置,這種情況要好得多。

因此,git diff-index --cached當(dāng)你問自己“我已經(jīng)標(biāo)記了什么被提交了,以及與以前的樹有什么不同”時,這樣做基本上非常有用。

非緩存模式

“非緩存”模式采用不同的方法,并且可能更有用,因為它不能用git write-tree+ 來模擬git diff-tree。因此這是默認(rèn)模式。非緩存版本會問這個問題:

向我展示HEAD和當(dāng)前簽出的區(qū)別
樹 - 索引內(nèi)容_and_不是最新的文件

這顯然是一個非常有用的問題,因為它告訴你可以提交什么。再一次,輸出與輸出相匹配git diff-tree -r,但帶有扭曲。

扭曲的是,如果某個文件與索引不匹配,我們就沒有支持存儲的東西,我們使用神奇的“全零”sha1來表明這一點。假設(shè)你已經(jīng)編輯過kernel/sched.c,但實際上還沒有完成git update-index- 沒有與新狀態(tài)關(guān)聯(lián)的“object”,你會得到:

torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD:100644 100664 7476bb... 000000...      kernel/sched.c

即它表明樹已經(jīng)改變,并且kernel/sched.c不是最新的并且可能包含新的東西。全零的sha1意味著要獲得真正的差異,您需要直接在工作目錄中查看對象,而不是執(zhí)行對象到對象的差異。

注意

和其他這種類型的命令一樣,git diff-index實際上根本不會查看文件的內(nèi)容。所以也許kernel / sched.c實際上并沒有改變,只是你觸及它而已。在任何一種情況下,都要注意你需要對它進(jìn)行更新索引以使索引同步。

注意

您可以將文件混合在一起顯示為“已更新”和“仍在工作目錄中”。你總是可以知道哪個文件處于哪個狀態(tài),因為“已被更新”的文件顯示有效的sha1,而“與索引不同步”的文件將始終有特殊的全零sha1。

Previous article: Next article: