Git Diff



Git 中的 git diff 命令提供了對跨各種倉庫狀態和物件的更改的詳細分析,包括工作樹、索引、樹、合併結果、blob 物件和磁碟檔案。

它提供了對差異的全面瞭解,使其成為有效理解和管理版本控制的關鍵。

命令 git diff 是一個靈活的 Git 命令,它可以:

  • 顯示對索引和工作樹所做的更改。

  • 顯示索引和特定樹(如 HEAD)之間的差異。

  • 評估兩個不同樹之間的差異。

  • 顯示合併結果之間的差異。

  • 比較磁碟上的單個檔案或 blob 物件。

它提供了對各種 Git 狀態和物件之間差異的徹底瞭解,這對於理解更改和有效處理版本控制至關重要。

git diff [<options>] [--] [<path>…​]
  • 命令 git diff [<options>] [--] [<path>...] 允許我們檢視相對於暫存區(或索引)的更改,這將顯示尚未為即將到來的提交暫存的更改。

  • 差異顯示了可以使用 git add 新增到索引的更改。

git diff [<options>] --no-index [--] <path> <path>
  • 它避免使用 Git 的索引,並直接在檔案系統上比較兩個提供的路徑。

  • 除非我們正在比較受 Git 管理的工作樹內的路徑,並且至少有一個路徑位於工作樹之外。

  • 或者除非 Git 沒有管理工作樹,否則我們必須使用 --no-index 選項

  • --exit-code 選項(指示路徑之間是否存在差異)由此版本的 git diff 暗示。

git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…​]
  • 它評估與給定的 <commit> 相比,為即將到來的提交暫存的更改。

  • 如果沒有提供 <commit>,則預設使用 HEAD

  • 如果沒有提供 <commit> 並且 HEAD 不存在(例如,未建立的分支),則將顯示所有已暫存的修改。

  • --merge-base 選項使用 <commit> 和 HEAD 的合併基,而不是使用 <commit>。

  • --staged--cached 可互換。

git diff [<options>] [--merge-base] <commit> [--] [<path>…​]
  • 它評估我們工作樹相對於指定的 <commit> 的修改。

  • 要將一個分支的頂端與最新的提交進行比較,請使用 HEAD

  • 要比較另一個分支的頂端,請使用分支的名稱。

  • 要查詢比較的基礎,--merge-base 計算 <commit> 和 HEAD 之間的合併基。

  • 例如,git diff $(git merge-base A HEAD) 等同於 git diff --merge-base A

git diff [<options>] [--merge-base] <commit> <commit> [--] [<path>…]
  • 它比較兩個給定的 <commit> 物件的更改。

  • 如果指定了 --merge-base,則計算這兩個提交的合併基以確定比較的 before 部分。

  • 例如,git diff $(git merge-base A B) Bgit diff --merge-base A B 相同。

git diff [<options>] <commit> <commit>…​ <commit> [--] [<path>…​]
  • 它用於檢視合併提交產生的更改。

  • 合併本身必須是第一個列出的 <commit>,後續提交是其父提交。

  • 諸如 ^@^! 之類的字尾使定義所需的修訂變得容易。

  • 例如,合併提交 A 的組合差異由 git diff A A^@git diff A^!git show A 生成。

git diff [<commit>] <commit>..<commit> [--] [<path>…​]
  • 與不帶 .. 的形式一樣,允許我們檢視兩個隨機 <commit> 物件之間的差異。

  • 預設情況下,當其中一側缺少 <commit> 時,使用 HEAD 進行比較。

  • 此命令有助於將提交與當前工作狀態進行比較,或分析某些提交之間的差異。

git diff [<options>] <blob> <blob>
  • Git 命令 git diff [<options>] <blob> <blob> 比較並顯示兩個 blob 物件的原始內容之間的差異。

  • 我們可以使用此命令直接比較儲存庫中檔案或物件的內容。

選項

git diff 命令具有以下選項:

比較更改

以下是可用於比較更改的命令列表:

  • git diff - 顯示未暫存的更改。

  • git diff --cachedgit diff --staged - 顯示已暫存的更改。

  • git diff <commit1><commit2> - 顯示兩個不同提交之間的更改。

  • git diff <branch1><branch2> - 顯示兩個不同分支之間的更改。

基於輸出格式

以下是基於輸出格式使用的選項列表:

  • --stat - 顯示更改的摘要,即每個檔案的新增和刪除行數。

  • --name-only - 只顯示已更改檔案的名稱。

  • --name-status - 顯示已更改檔案的名稱和狀態,無論是新增、刪除還是修改。

  • --color - 顯示彩色輸出,有助於可讀性。

基於限制輸出

以下是基於限制輸出使用的選項:

  • -U<n> - 顯示具有 <n> 行上下文內容的統一差異,例如 -U5 顯示五行上下文內容。

  • --word-diff - 在單詞級別顯示更改並突出顯示它們。

基於忽略更改

以下是基於忽略更改使用的選項:

  • --ignore-space-at-eol - 忽略行尾的空格更改。

  • --ignore-space-change - 忽略空格數量的更改。

  • --ignore-all-space - 忽略所有空格。

使用補丁

以下是基於使用補丁的選項:

  • -p--patch - 以補丁格式顯示差異。

  • 這些選項告訴 Git 自動生成補丁。

組合選項

可以組合使用兩個或多個選項,例如 --stat--cached

-s

--no-patch

  • 在 Git 中,-s--no-patch 選項完全抑制 diff 機制的輸出。

  • 當我們希望隱藏來自諸如 git show 之類命令的補丁輸出時,此選項非常有用,因為這些命令預設情況下會顯示補丁。

  • 此外,此選項可以反轉之前在命令列或別名中提供的選項(如 --patch--stat)的效果。

--output=<file>

  • Git 的 --output=<file> 選項允許我們將命令的輸出定向到指定的檔案,而不是標準輸出 (stdout)。

  • 這對於立即將命令輸出或結果儲存到檔案中以進行處理或將來參考非常有用。

--output-indicator-new=<char>

--output-indicator-old=<char>

--output-indicator-context=<char>

  • Git 允許我們使用 --output-indicator-new=<char>--output-indicator-old=<char>--output-indicator-context=<char> 選項來自定義用於表示建立的補丁中的新行、舊行或上下文行的字元。

  • 這些字元預設為新行使用 +,現有行使用 -,上下文行使用 ' '(空格)。

  • 可以使用這些引數自定義補丁中圖形化顯示差異的方式。

--raw

  • 當使用 --raw 選項生成 diff 輸出時,Git 會生成檔案更改的機器可讀表示。

  • 對於指令碼編寫和自動化處理,此格式非常有用。

--patch-with-raw

  • 在 Git 中,-p --raw 等效於 --patch-with-raw 選項。

  • 它生成一個包含原始格式輸出的補丁。

--indent-heuristic

  • Git 有一個名為 --indent-heuristic 的選項,它會啟用一種啟發式方法,該方法會修改 diff 塊邊界以提高補丁的可讀性。

  • 透過增強 diff 中更改的可視清晰度,這種預設啟用的啟發式方法旨在使它們更容易理解和審查。

--no-indent-heuristic

  • Git 選項 --no-indent-heuristic 將關閉修改 diff 塊邊界以使補丁更易於閱讀的啟發式方法。

--minimal

  • Git 中的 --minimal 選項確保透過花費額外的時間來最佳化輸出以生成儘可能小的 diff。

--patience

  • Git 中的--patience選項使用patience diff演算法來生成差異。

以上所有提到的選項在你除錯、審查更改或準備提交時都很有幫助。

廣告