文本差異(Diff)比較
按行比較兩段文本,用顏色標出新增的行和刪除的行。適用於檢查配置檔案的改動、校對文件、或在不使用Git的情況下進行程式碼審查。所有比較都在瀏覽器內完成,輸入內容不會發送到伺服器。
逐行比對兩段文字
想弄清設定檔改了什麼,或某篇文字在何處動過筆,這便是該取來用的工具。它把兩段文字逐行對照,以不同顏色標出新增與刪去的行。一切都在瀏覽器內算完,貼入的東西不會被送往任何地方。
讀結果時值得知道的是:差異演算法尋的是「最短的編輯步驟」。 因此,人眼看作「這一段挪到了下面」的事,機器卻表述為一處刪去配上一處新增。 它並沒有表示「移動」的記號。另一點是:比對以行為單位,故而只差一個字的行,也會被整行報作已改。 此處最令人困惑的,是行尾空格或定位字元的不同——明明看著一樣,那一行卻被標成改過。差異大得離譜時,頭一個該疑的便是這個。至於換行字元的不同(Windows 的 CRLF 與類 Unix 系統的 LF),本工具會當作同一種換行處理,不會顯示為差異。
使用方法
- 把原文貼進 A 放入改動之前的內容。
- 把修訂稿貼進 B 放入改動之後的內容。
- 閱讀著色的差異 新增與刪去的行以不同顏色標出。
- 差異過大時疑心行尾 僅是行尾空格或定位字元不同,該行便會被標成改過。 換行字元(CRLF 與 LF)的不同會在比較前自動統一。
用好本工具的小技巧
- 將配置檔案(.env、YAML、JSON等)修改前後的內容貼上進來,即可一眼看出哪些行被新增或刪除。
- 即使沒有安裝Git,只需複製貼上兩個版本,也能進行簡易的程式碼審查或文件校對。
- 行的位置調換會被識別為"刪除+新增",而不是"移動"。當同一內容的行只是換了位置時,仍會顯示為差異,請留意這一點。
- 空格、換行符和大小寫都會被嚴格逐字元比較,因此僅縮進發生變化的行也會被判定為"已變更"。
- 比較長篇文章時,先將每個段落整理成一行再貼上,能讓差異結果按段落一目瞭然。
這些情境會用到
核對設定檔的改動
在推上生產之前,可以看出是否只改了您本想改的地方。
對照文字的校訂結果
把初稿與改稿並置,何處動過筆便一目了然。
不用 Git 也能審查
從未納入版本管理的檔案,照樣貼上便可比對。
確認輸出可否重現
把同一處理跑兩遍的結果拿來比較,確認並無出入。
差異的術語
- 新增的行
- 只出現在 B 中的行。
- 刪去的行
- 只出現在 A 中的行。僅僅挪了位置的行,同樣會以刪去配新增的形式浮現。
- 逐行比對
- 把每一行當作一個整體來比。只差一個字,整行便被標作已改。
- 換行字元
- 標示行尾的字元:Windows 用 CRLF,類 Unix 系統用 LF。本工具把 CRLF、LF、CR 都當作同一種換行,因此僅換行字元不同不會顯示為差異。
- 區塊
- 差異中改動聚在一處的那一整塊。
- 上下文
- 列在改動行上下的那些未變之行,納入其中是為了便於判斷位置。
常見問題
閒話 ― 用LCS(最長公共子序列)求差異的原理
檢測兩段文本差異的演算法中,亞利桑那大學的電腦科學家尤金·邁爾斯(Eugene Myers)於1986年在論文《An O(ND) Difference Algorithm and Its Variations》(發表於Algorithmica期刊)中提出的"Myers差分演算法"廣為人知。Git、SVN等主流版本控制系統的diff命令都採用了這一系列演算法,能高效檢測按行的新增和刪除。本工具也基於同樣的思路,通過求出最長公共子序列(LCS)將變化範圍縮小到最小。
最長公共子序列(LCS)是指兩個序列(這裡指行的排列)中都按順序出現的、最長的公共部分序列。兩段文本的差異,就是把不屬於這個LCS的行判定為"刪除"或"新增"求出來的,LCS越長,螢幕上顯示的變化就越少。藉助動態規劃(DP)這一演算法技巧,即使是行數很多的文本,也能在現實的時間內完成計算。
diff演算法也有其弱點。當某一行只是移動到了別的位置時,多數實現都不會將其識別為"移動",而是顯示為"刪除"和"新增"的組合。這就是為什麼行順序被大幅打亂的文本進行比較時,差異看起來會比實際變化更多的原因。瞭解這一特性,有助於在解讀差異結果時減少誤解。