服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|

服务器之家 - 服务器系统 - Linux - 使用 Linux 的 diff 和 patch 对文件进行协作

使用 Linux 的 diff 和 patch 对文件进行协作

2021-12-03 22:56Linux中国Seth Kenlon Linux

如果你曾经试图通过电子邮件或聊天来协作处理文件,并且发现自己试图描述需要修改的地方,那么你会喜欢 diff 和 patch 的。

使用 Linux 的 diff 和 patch 对文件进行协作

如果你曾经试图通过电子邮件或聊天来协作处理文件,并且发现自己试图描述需要修改的地方,那么你会喜欢 diff 和 patch 的。

我编辑过很多文本文件。有时是代码。其他时候是角色扮演游戏(RPG)、编程书籍或一般信件的书面文字。有时候,做一个修改,而能让我的协作者把我的修改和他们原来写的东西进行比较就更好了。许多人默认使用办公套件(如 LibreOffice)的注释或更改跟踪功能。不过有时更简单的工具更有意义,为此,你可以看看像 diff 和 patch 这样的工具的编程历史,它们为跟踪和应用共享文件的变化提供了标准化的格式。

即使对于简单的文件,在同步两个文件时也有复杂性。一些项目被改变,另一些被保留,新的内容被添加,还有一些保持不变,但被移到文件的不同位置。如果接受所有的变化,并且用新文件替换旧文件,就很难复制变化。它也是整体不透明的。如果变化很多,就很难挑出到底发生了什么变化。

通过 diff 命令,你可以创建一个文件变化的记录,通过 patch 你可以在旧版本上“重放”这些变化,使其与新版本保持一致。

设置

假设你和我正在合作编写一个描述如何泡茶的文件。

到目前为止,文件 tea.md 包含原始的复制粘贴来的内容:

  1. 烧开水。
  2. 加热茶壶。
  3. 在茶壶中加入茶和水。
  4. 在茶壶上放置一个茶叶滤网。
  5. 浸泡 6 分钟。
  6. 将茶倒入杯中。
  7. 加入牛奶。

这似乎很合理,但总有一些优化可以做,所以你把文件发给我改进。为了澄清泡茶过程,我把文件复制为tea-revision.md,并进行编辑,最后是这样的:

  1. 在烤箱的抽屉中加热茶壶。
  2. 烧开水。
  3. 将茶叶放入茶叶滤网。
  4. 将滤网和水加入茶壶。
  5. 浸泡 6 分钟。用茶壶罩保温。
  6. 将茶倒入杯中。
  7. 可以选择加入温牛奶。

正如预期的那样,一些项目(“烧开水”和“将茶倒入杯中”)没有变化,而其他行(“加热茶壶”)则有增加。有些行是全新的,有些行是相同的,但顺序不同。

创建一个差异

diff 工具会显示两个文件之间的差异。有几种不同的方法来查看结果,但我认为最清楚的是 —unified(简写为 -u)视图,它显示哪些行被增加或减少了。以任何方式改变的行都被视为先减后增的行。默认情况下,diff 将其输出打印到终端。

向 diff 提供旧文件,然后是新文件:

  1. $ diff --unified tea.md tea-revised.md 
  2. --- tea.md      2021-11-13 10:26:25.082110219 +1300
  3. +++ tea-revised.md      2021-11-13 10:26:32.049110664 +1300
  4. @@ -1,7 +1,7 @@
  5. +在烤箱的抽屉中加热茶壶。
  6. 烧开水。
  7. -加热茶壶。
  8. -在茶壶中加入茶和水。
  9. -在茶壶上放置一个茶叶滤网。
  10. -浸泡 6 分钟。
  11. +将茶叶放入茶叶滤网。
  12. +将滤网和水加入茶壶。
  13. +浸泡 6 分钟。用茶壶罩保温。
  14.  将茶倒入杯中。
  15. -加入牛奶。
  16. +可以选择加入温牛奶。

行首的加号(+)表示在旧文件中增加了一些内容。行首的减号(-)表示被删除或改变的行。

用 diff 创建一个补丁

补丁文件就是将 diff —unified 命令的输出放到一个文件中。你可以用标准的 Bash 重定向来做这件事:

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

该文件的内容与输出到终端的内容完全相同。我喜欢在 Emacs 中查看补丁文件,它对每一行进行颜色编码,取决于它是被添加还是被减去。

 

使用 Linux 的 diff 和 patch 对文件进行协作

Emacs中的补丁文件

用补丁应用修改

一旦我有了补丁文件,我就可以把它发给你,让你审查,并且可以选择应用到你的旧文件中。你可以用 patch 命令来应用一个补丁。

  1. $ patch tea.md tea.patch

增加了一些行,减少了一些行,最后,你得到了一个与我的版本相同的文件:

  1. $ cat tea.md
  2. 在烤箱的抽屉中加热茶壶。
  3. 烧开水。
  4. 将茶叶放入茶叶滤网。
  5. 将滤网和水加入茶壶。
  6. 浸泡 6 分钟。用茶壶罩保温。
  7. 将茶倒入杯中。
  8. 可以选择加入温牛奶。

你可以给一个文件打多少次补丁,这是没有限制的。你可以对我的修改进行迭代,生成一个新的补丁,然后发给我审核。发送修改内容而不是结果,可以让每个贡献者审查修改的内容,决定他们要保留或删除的内容,并准确地记录过程。

安装

在 Linux 和 macOS 上,你已经有了 diff 和 patch 命令。在 Windows 上,你可以通过 Cygwin 获得 diff 和 patch,或者使用 Chocolatey 搜索 diffutils 和 patch。

如果你曾经试图通过电子邮件或聊天来协作处理文件,并且发现自己需要 描述 需要修改的地方,那么你会喜欢 diff 和 patch。一个结构严谨的文件,如代码或以行为单位的 Markdown,很容易进行差异比较、补丁和维护。

原文链接:https://linux.cn/article-14037-1.html

延伸 · 阅读

精彩推荐
  • Linux如何在Linux中使用man帮助使用man命令

    如何在Linux中使用man帮助使用man命令

    使用man帮助能够使用man命令对系统进行操作,还能查询一些相关文件,下面小编就给大家介绍下Linux使用man帮助的方法,感兴趣的朋友可以看看 ...

    linux技术网5632019-10-17
  • Linux详解Linux中获取全球唯一标示符UUID的方法

    详解Linux中获取全球唯一标示符UUID的方法

    这篇文章主要介绍了Linux中获取全球唯一标示符UUID的方法,UUID经常被用于分布式系统中,需要的朋友可以参考下...

    OSChina10632019-06-20
  • LinuxLinux 命令 su 和 sudo 的区别

    Linux 命令 su 和 sudo 的区别

    之前一直对 su 和 sudo 这两个命令犯迷糊,最近专门搜了这方面的资料,总算是把两者的关系以及用法搞清楚了,这篇文章来系统总结一下。 ...

    良许Linux7182021-11-01
  • Linux如何在RAID软磁盘阵列上搭建linux系统

    如何在RAID软磁盘阵列上搭建linux系统

    新配了台电脑,准备装个双系统,windows用来打游戏,linux用来写代码。专门买了两块1T硬盘,想用来搭建RAID0,使用并行I/O来提升电脑的性能。 ...

    Linux教程网4432019-11-22
  • Linuxlinux大于2T的磁盘使用GPT分区的方法分享

    linux大于2T的磁盘使用GPT分区的方法分享

    众所周知,在linux下磁盘分区大于2TB的时候我不能使用常用Fdisk命令。是不是就没有办法在linux使用大容量的磁盘呢?答案:不是...

    Linux教程网4832020-11-19
  • Linux在 systemd 中使用控制组管理资源

    在 systemd 中使用控制组管理资源

    systemd 和 SystemV 之间的一个主要差异是管理进程的方式。SystemV 将每个进程视作一个独立的实体。systemd 将相关的进程集中到一个控制组,简写做 cgroup,并将...

    Linux中国4902021-10-14
  • Linux查看Linux系统版本信息的方法小结

    查看Linux系统版本信息的方法小结

    这篇文章主要介绍了查看Linux系统版本信息的方法小结,主要针对RedHat系的Linux的命令,需要的朋友可以参考下...

    cnblogs3242019-07-16
  • LinuxLinux file命令的使用

    Linux file命令的使用

    这篇文章主要介绍了Linux file命令的使用,帮助大家更好的理解和学习Linux,感兴趣的朋友可以了解下...

    Dabelv3322020-08-28