Linux中國

使用 Linux 的 diff 和 patch 對文件進行協作

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

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

通過 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 中查看補丁文件,它對每一行進行顏色編碼,取決於它是被添加還是被減去。

![Emacs中的補丁文件](/data/attachment/album/202112/01/102615lyxryrxdetb3nr6r.jpg "A patch file in Emacs")

用補丁應用修改

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

$ patch tea.md tea.patch

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

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

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

安裝

在 Linux 和 macOS 上,你已經有了 diffpatch 命令。在 Windows 上,你可以通過 Cygwin 獲得 diffpatch,或者使用 Chocolatey 搜索 diffutilspatch

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

via: https://opensource.com/article/21/11/linux-diff-patch

作者:Seth Kenlon 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國