使用 Linux 的 diff 和 patch 對文件進行協(xié)作
如果你曾經(jīng)試圖通過電子郵件或聊天來協(xié)作處理文件,并且發(fā)現(xiàn)自己試圖描述需要修改的地方,那么你會喜歡
diff
和patch
的。
我編輯過很多文本文件。有時是代碼。其他時候是角色扮演游戲(RPG)、編程書籍或一般信件的書面文字。有時候,做一個修改,而能讓我的協(xié)作者把我的修改和他們原來寫的東西進行比較就更好了。許多人默認使用辦公套件(如 LibreOffice)的注釋或更改跟蹤功能。不過有時更簡單的工具更有意義,為此,你可以看看像 diff
和 patch
這樣的工具的編程歷史,它們?yōu)楦櫤蛻霉蚕砦募淖兓峁┝藰藴驶母袷健?/p>
即使對于簡單的文件,在同步兩個文件時也有復雜性。一些項目被改變,另一些被保留,新的內(nèi)容被添加,還有一些保持不變,但被移到文件的不同位置。如果接受所有的變化,并且用新文件替換舊文件,就很難復制變化。它也是整體不透明的。如果變化很多,就很難挑出到底發(fā)生了什么變化。
通過 diff
命令,你可以創(chuàng)建一個文件變化的記錄,通過 patch
你可以在舊版本上“重放”這些變化,使其與新版本保持一致。
設置
假設你和我正在合作編寫一個描述如何泡茶的文件。
到目前為止,文件 tea.md
包含原始的復制粘貼來的內(nèi)容:
燒開水。
加熱茶壺。
在茶壺中加入茶和水。
在茶壺上放置一個茶葉濾網(wǎng)。
浸泡 6 分鐘。
將茶倒入杯中。
加入牛奶。
這似乎很合理,但總有一些優(yōu)化可以做,所以你把文件發(fā)給我改進。為了澄清泡茶過程,我把文件復制為tea-revision.md
,并進行編輯,最后是這樣的:
在烤箱的抽屜中加熱茶壺。
燒開水。
將茶葉放入茶葉濾網(wǎng)。
將濾網(wǎng)和水加入茶壺。
浸泡 6 分鐘。用茶壺罩保溫。
將茶倒入杯中。
可以選擇加入溫牛奶。
正如預期的那樣,一些項目(“燒開水”和“將茶倒入杯中”)沒有變化,而其他行(“加熱茶壺”)則有增加。有些行是全新的,有些行是相同的,但順序不同。
創(chuàng)建一個差異
diff
工具會顯示兩個文件之間的差異。有幾種不同的方法來查看結果,但我認為最清楚的是 —unified
(簡寫為 -u
)視圖,它顯示哪些行被增加或減少了。以任何方式改變的行都被視為先減后增的行。默認情況下,diff
將其輸出打印到終端。
向 diff
提供舊文件,然后是新文件:
$ diff --unified tea.md tea-revised.md
--- tea.md 2021-11-13 10:26:25.082110219 +1300
+++ tea-revised.md 2021-11-13 10:26:32.049110664 +1300
@@ -1,7 +1,7 @@
+在烤箱的抽屜中加熱茶壺。
燒開水。
-加熱茶壺。
-在茶壺中加入茶和水。
-在茶壺上放置一個茶葉濾網(wǎng)。
-浸泡 6 分鐘。
+將茶葉放入茶葉濾網(wǎng)。
+將濾網(wǎng)和水加入茶壺。
+浸泡 6 分鐘。用茶壺罩保溫。
將茶倒入杯中。
-加入牛奶。
+可以選擇加入溫牛奶。
行首的加號(+
)表示在舊文件中增加了一些內(nèi)容。行首的減號(-
)表示被刪除或改變的行。
用 diff 創(chuàng)建一個補丁
補丁文件就是將 diff —unified
命令的輸出放到一個文件中。你可以用標準的 Bash 重定向來做這件事:
$ diff -u tea.md tea-revised.md > tea.patch
該文件的內(nèi)容與輸出到終端的內(nèi)容完全相同。我喜歡在 Emacs 中查看補丁文件,它對每一行進行顏色編碼,取決于它是被添加還是被減去。
Emacs中的補丁文件
用補丁應用修改
一旦我有了補丁文件,我就可以把它發(fā)給你,讓你審查,并且可以選擇應用到你的舊文件中。你可以用 patch
命令來應用一個補丁。
$ patch tea.md tea.patch
增加了一些行,減少了一些行,最后,你得到了一個與我的版本相同的文件:
$ cat tea.md
在烤箱的抽屜中加熱茶壺。
燒開水。
將茶葉放入茶葉濾網(wǎng)。
將濾網(wǎng)和水加入茶壺。
浸泡 6 分鐘。用茶壺罩保溫。
將茶倒入杯中。
可以選擇加入溫牛奶。
你可以給一個文件打多少次補丁,這是沒有限制的。你可以對我的修改進行迭代,生成一個新的補丁,然后發(fā)給我審核。發(fā)送修改內(nèi)容而不是結果,可以讓每個貢獻者審查修改的內(nèi)容,決定他們要保留或刪除的內(nèi)容,并準確地記錄過程。
安裝
在 Linux 和 macOS 上,你已經(jīng)有了 diff
和 patch
命令。在 Windows 上,你可以通過 Cygwin 獲得 diff
和 patch
,或者使用 Chocolatey 搜索 diffutils 和 patch。
如果你曾經(jīng)試圖通過電子郵件或聊天來協(xié)作處理文件,并且發(fā)現(xiàn)自己需要 描述 需要修改的地方,那么你會喜歡 diff
和 patch
。一個結構嚴謹?shù)奈募?,如代碼或以行為單位的 Markdown,很容易進行差異比較、補丁和維護。