如果您曾经尝试通过电子邮件或聊天协作处理文件并发现自己试图描述需要更改的内容,那么您会喜欢diff和patch。我编辑了许多文本文件。有时是代码。其他时候,它是角色扮演游戏(RPG)、编程书籍或一般通信的书面文字。有时进行更改并让我的合作者将我的更改与他们最初编写的内容进行比较是件好事。许多人默认使用LibreOffice等办公套件的评论或更改跟踪功能。不过,有时更简单的工具更有意义,为此,您可以查看diff和patch等工具的编程历史,它们提供了用于跟踪和应用共享文件更改的标准化格式。即使对于简单的文件,同步两个文件时也存在复杂性。一些项目被更改,其他项目被保留,新内容被添加,一些保持不变但被移动到文件中的不同位置。如果您接受所有更改并将旧文件替换为新文件,则将很难复制这些更改。它也是整体不透明的。如果有很多更改,则很难准确找出更改的内容。使用diff命令,您可以创建文件更改记录,使用patch,您可以在旧版本上“重放”这些更改,使其与新版本保持一致。设置假设您和我正在合作编写一份描述如何泡茶的文档。至此,tea.md文件中包含了原始复制粘贴的内容:烧开水。加热茶壶。在茶壶中加入茶和水。在茶壶上放一个滤茶器。浸泡6分钟。将茶倒入杯中。加牛奶。这似乎是合理的,但总有一些可以做的优化,所以你把文件发给我改进。为了阐明泡茶过程,我将文件复制为tea-revision.md,对其进行编辑,最后得到:在烤箱抽屉中加热茶壶。烧水。将茶叶放入滤茶器中。将过滤器和水加入茶壶中。浸泡6分钟。用茶壶盖保暖。将茶倒入杯中。可选择添加温牛奶。正如预期的那样,一些项目(“烧开水”和“将茶倒入杯中”)没有变化,而其他行(“热茶壶”)增加了。有些线路是全新的,有些线路相同但顺序不同。创建差异diff工具显示两个文件之间的差异。有几种不同的方式来查看结果,但我认为最清楚的是--unified(简称-u)视图,它显示添加或减去哪些行。以任何方式更改的行都被视为递减然后递增。默认情况下,diff将其输出打印到终端。将旧文件提供给diff,然后提供新文件:$diff--unifiedtea.mdtea-revised.md---tea.md2021-11-1310:26:25.082110219+1300+++tea-revised.md2021-11-1310:26:32.049110664+1300@@-1,7+1,7@@+加热烤箱抽屉里的茶壶。烧水。-加热茶壶。-在茶壶中加入茶和水。-在茶壶上放一个滤茶器。-浸泡6分钟。+将茶叶放入滤茶器中。+将过滤器和水加入茶壶中。+浸泡6分钟。用茶壶盖保暖。将茶倒入杯中。-添加牛奶。+可选择添加温牛奶。行首的加号(+)表示已将某些内容添加到旧文件中。行首的减号(-)表示该行已被删除或更改。使用diff创建补丁文件只是将diff--unified命令的输出放入文件中。您可以使用标准Bash重定向来执行此操作:$diff-utea.mdtea-revised.md>tea.patch该文件的内容与输出到终端的内容完全相同。我喜欢在Emacs中查看补丁文件,它根据添加或删除的内容对每一行进行颜色编码。Emacs中使用补丁应用修改的补丁文件一旦我有了补丁文件,我就可以将它发送给您进行审核,并可以选择将其应用于您的旧文件。您可以使用patch命令应用补丁。$patchtea.mdtea.patch添加了一些行,删除了一些行,最后,您得到了一个与我的版本相同的文件:$cattea.md在烤箱抽屉中加热茶壶。烧水。将茶叶放入滤茶器中。将过滤器和水加入茶壶中。浸泡6分钟。用茶壶盖保暖。将茶倒入杯中。可选择添加温牛奶。修补文件的次数没有限制。您可以迭代我的更改,生成一个新补丁,然后将其发送给我进行审核。发送修订而不是结果允许每个贡献者审查修订,决定他们想要保留或删除的内容,并准确地记录该过程。安装在Linux和macOS上,你已经有了diff和patch命令。在Windows上,您可以通过Cygwin获取差异和补丁,或使用Chocolatey搜索diffutils和补丁。如果您曾尝试通过电子邮件或聊天协作处理文件,并发现自己需要描述需要更改的内容,那么您一定会喜欢diff和patch。结构良好的文件(例如代码或逐行Markdown)易于比较、修补和维护。
