如何使用diff 和 patch 命令對檔案進行協作?
導讀 | 如果你曾經試圖透過電子郵件或聊天來協作處理檔案,並且發現自己試圖描述需要修改的地方,那麼你會喜歡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 —unified 的輸出放到一個檔案中。你可以用標準的 Bash 重定向來做這件事:
$ diff -u tea.md tea-revised.md > tea.patch
該檔案的內容與輸出到終端的內容完全相同。我喜歡在 Emacs 中檢視補丁檔案,它對每一行進行顏色編碼,取決於它是被新增還是被減去。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 差異檔案(diff)和補丁檔案(patch)簡介
- 如何製作patch檔案及如何打patch 附帶linux打補丁命令Linux
- patch檔案的製作與使用
- Git - 使用命令和P4Merge進行diffGit
- 探究如何使用敏捷專案管理進行團隊協作?敏捷專案管理
- Diff and Patch
- Patch檔案的生成和使用
- 如何透過文件協作進行專案管理?專案管理
- Git 打補丁– patch 和 diff 的使用(詳細)Git
- Git 打補丁-- patch 和 diff 的使用(詳細)Git
- Mac電腦如何對檔案進行分類和整理Mac
- 使用git-diff時如何忽略某些檔案Git
- 使用GnuPG對檔案進行加密(轉)加密
- 如何批次對檔案進行重新命名?
- C#如何使用HttpClient對大檔案進行斷點上傳和下載C#HTTPclient斷點
- 如何使用git 生成patch 和打入patchGit
- 十分鐘學習diff和patch
- 如何利用 github 進行多人協作開發Github
- Java中使用jcifs庫操作SMB協議進行檔案操作Java協議
- 如何使用scp進行遠端複製檔案?
- 使用動態規劃 實現字元級Diff & Patch動態規劃字元
- 使用版本控制來進行翻譯協作
- 在Linux環境下使用OpenSSL對訊息和檔案進行加密Linux加密
- Vue原始碼學習(十四):diff演算法patch比對Vue原始碼演算法
- 如何讓IT團隊和安全團隊之間更好地進行協作
- Android 使用 Socket 對大檔案進行加密傳輸Android加密
- 透過線上的文件協作進行專案管理專案管理
- OGG -使用CMDSEC 檔案限制某個系統使用者對OGG 進行特定命令操作。
- 如何在命令列中使用 ftp 命令上傳和下載檔案命令列FTP
- git 生成patch和使用patchGit
- 呼叫ejb對本地檔案進行讀寫要如何做
- 使用svn進行檔案和資料夾的忽略
- 如何使用curl命令下載檔案
- 如何使用任務管理軟體改進協作策略?
- 使用 7-Zip 進行檔案分割與合併(命令列示例)命令列
- Mac電腦如何將檔案進行分類和整理?Mac
- vue對CSV檔案進行表格預覽Vue
- Linux下如何對目錄中的檔案進行統計Linux