diff -u file1.txt file2.txt > patchfile
创建一个补丁文件,其中包含patch
将 file1.txt 转换为与 file2.txt 完全相同的指令
难道不能用cp
命令来完成吗?我可以想象,当文件太大并且必须通过网络传输时,这种方法可能会节省带宽,这会很有用。是否有其他方式使用 diff/patch 在其他场景中会有优势?
答案1
差异可能比仅仅比较一个文件与另一个文件更复杂。可以比较整个目录层次结构。考虑一下我想要修复 GCC 中的错误的示例。我的更改在 4 或 5 个文件中添加了一两行,并删除了这些文件和其他文件中的几行。如果我想将这些更改传达给某人(可能会纳入 GCC),我的选择是
- 复制整个源树
- 仅复制已更改的文件
- 仅提供我所做的更改
复制整个源代码树没有意义,但是其他两个选项又如何呢?这正是问题的核心。现在考虑一下其他人也和我一样处理同一个文件,并且我们都将更改交给某人。此人如何知道我们做了什么以及更改是否兼容(文件的不同部分)或冲突(文件的相同行)?他会区分它们! diff 可以告诉他这些文件彼此之间以及与未修改的源文件有何不同。如果需要差异,那么首先发送差异更有意义。差异还可以包含来自多个文件的更改,因此虽然我总共编辑了 9 个文件,但我可以提供一个差异文件来描述这些更改。
差异还可以用于提供历史记录。如果三个月前的更改导致了我今天才发现的错误怎么办?如果我可以缩小引入错误的时间范围并将其隔离到特定更改,那么我可以使用 diff 来“撤消”或恢复更改。如果我只是复制文件,这不是我能轻易做到的事情。
这一切都与源版本控制有关,程序可以将文件历史记录为从创建到今天的一系列差异。差异提供历史记录(我可以重新创建文件,因为它在任何特定的一天),我可以看到谁应该责怪破坏某些东西(差异有一个所有者),并且我可以通过给上游项目提供特定的差异来轻松提交对上游项目的更改(也许当我做了很多改变时他们只对一项改变感兴趣)。
总之,是的,比和cp
更容易,但是和 的效用大于跟踪文件更改方式很重要的情况。diff
patch
diff
patch
cp
答案2
当您获得补丁时,您通常可以(除非您对完全相同的行进行了更改)将该补丁应用于您自己也更改过的一组文件。
该补丁包含有关旧版本的信息和文件的新状态。如果您获得复制的文件,您不知道原始文件是什么(旧状态),并且您无法轻松地将差异应用于已更改的文件(或文件集)。因此,对于源文件集来说,主要关心的不是空间保留,而是前后信息。
在(上下文/统一)差异之前,这通常是通过编辑器的指令来完成的(在 X 之后插入一行,删除 Y 行),但这只有在您知道这些指令开始的状态时才有效。因此,与仅复制的“解决方案”有相同的问题。
答案3
如果您使用 diff,您就可以看到到底发生了哪些变化,因此使用 diff/patch 可以防止某人在文件中做出不必要的更改。
答案4
简而言之可以。如果你在 youtube 上观看一些 Thinkg Big Larry Wall 视频,他会谈论 diff/patch 是如何开始的以及它们解决了哪些问题,本质上,它是关于减少通过互联网通信的大小,同时保持补丁的灵活性和人类可读性。
如果您在本地系统上并且不关心这些事情,那么cp
或 就rsync
可以了。