如何使用diff 和 patch 命令對檔案進行協作?

大雄45發表於2022-01-01
導讀 如果你曾經試圖透過電子郵件或聊天來協作處理檔案,並且發現自己試圖描述需要修改的地方,那麼你會喜歡diff和patch 的。

我編輯過很多文字檔案。有時是程式碼。其他時候是角色扮演遊戲(RPG)、程式設計書籍或一般信件的書面文字。有時候,做一個修改,而能讓我的協作者把我的修改和他們原來寫的東西進行比較就更好了。許多人預設使用辦公套件(如 LibreOffice)的註釋或更改跟蹤功能。不過有時更簡單的工具更有意義,為此,你可以看看像 diff 和 patch 這樣的工具的程式設計歷史,它們為跟蹤和應用共享檔案的變化提供了標準化的格式。

即使對於簡單的檔案,在同步兩個檔案時也有複雜性。一些專案被改變,另一些被保留,新的內容被新增,還有一些保持不變,但被移到檔案的不同位置。如果接受所有的變化,並且用新檔案替換舊檔案,就很難複製變化。它也是整體不透明的。如果變化很多,就很難挑出到底發生了什麼變化。

透過 diff  ,你可以建立一個檔案變化的記錄,透過 patch 你可以在舊版本上“重放”這些變化,使其與新版本保持一致。

設定

假設你和我正在合作編寫一個描述如何泡茶的檔案。

到目前為止,檔案 tea.md 包含原始的複製貼上來的內容:

燒開水。
加熱茶壺。
在茶壺中加入茶和水。
在茶壺上放置一個茶葉濾網。
浸泡 6 分鐘。
將茶倒入杯中。
加入牛奶。
這似乎很合理,但總有一些最佳化可以做,所以你把檔案發給我改進。為了澄清泡茶過程,我把檔案複製為tea-revision.md,並進行編輯,最後是這樣的:

在烤箱的抽屜中加熱茶壺。
燒開水。
將茶葉放入茶葉濾網。
將濾網和水加入茶壺。
浸泡 6 分鐘。用茶壺罩保溫。
將茶倒入杯中。
可以選擇加入溫牛奶。

正如預期的那樣,一些專案(“燒開水”和“將茶倒入杯中”)沒有變化,而其他行(“加熱茶壺”)則有增加。有些行是全新的,有些行是相同的,但順序不同。

建立一個差異

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 @@
+在烤箱的抽屜中加熱茶壺。
燒開水。
-加熱茶壺。
-在茶壺中加入茶和水。
-在茶壺上放置一個茶葉濾網。
-浸泡 6 分鐘。
+將茶葉放入茶葉濾網。
+將濾網和水加入茶壺。
+浸泡 6 分鐘。用茶壺罩保溫。
 將茶倒入杯中。
-加入牛奶。
+可以選擇加入溫牛奶。

行首的加號(+)表示在舊檔案中增加了一些內容。行首的減號(-)表示被刪除或改變的行。

用 diff 建立一個補丁

補丁檔案就是將 diff —unified  的輸出放到一個檔案中。你可以用標準的 Bash 重定向來做這件事:

$ diff -u tea.md tea-revised.md > tea.patch

該檔案的內容與輸出到終端的內容完全相同。我喜歡在 Emacs 中檢視補丁檔案,它對每一行進行顏色編碼,取決於它是被新增還是被減去。

如何使用diff 和 patch 命令對檔案進行協作?如何使用diff 和 patch 命令對檔案進行協作?

 

Emacs中的補丁檔案

用補丁應用修改

一旦我有了補丁檔案,我就可以把它發給你,讓你審查,並且可以選擇應用到你的舊檔案中。你可以用 patch 命令來應用一個補丁。

$ patch tea.md tea.patch

增加了一些行,減少了一些行,最後,你得到了一個與我的版本相同的檔案:

$ cat tea.md
在烤箱的抽屜中加熱茶壺。
燒開水。
將茶葉放入茶葉濾網。
將濾網和水加入茶壺。
浸泡 6 分鐘。用茶壺罩保溫。
將茶倒入杯中。
可以選擇加入溫牛奶。

你可以給一個檔案打多少次補丁,這是沒有限制的。你可以對我的修改進行迭代,生成一個新的補丁,然後發給我稽核。傳送修改內容而不是結果,可以讓每個貢獻者審查修改的內容,決定他們要保留或刪除的內容,並準確地記錄過程。

安裝

在   和 macOS 上,你已經有了 diff 和 patch 命令。在 Windows 上,你可以透過 Cygwin 獲得 diff 和 patch,或者使用 Chocolatey 搜尋 diffutils 和 patch。

如果你曾經試圖透過電子郵件或聊天來協作處理檔案,並且發現自己需要 描述 需要修改的地方,那麼你會喜歡 diff 和 patch。一個結構嚴謹的檔案,如程式碼或以行為單位的 Markdown,很容易進行差異比較、補丁和維護。

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2850388/,如需轉載,請註明出處,否則將追究法律責任。

相關文章