参考:
"Introduction: Using diff and patch (tutorial)"
http://www.linuxtutorialblog.com/post/introduction-using-diff-and-patch-tutorial


1. 一般的patch方式

生成patch >
diff originalfile updatedfile > patchfile.patch
还原 >
patch originalfile -i patchfile.patch -o updatedfile

2. 带上下文信息的patch方式

一般的patch方式生成的信息不带上下文信息,只带行信息。如果不小心选错了原始文件,patch后的结果被破坏也许还不知道,这样不安全。

生成patch >
diff -c originalfile updatefile > patchfile.patch

还原 >
patch -i patchfile.patch -o updatefile
这里没写出原始文件名,是因为patchfile.patch里面已经携带了。当然也可以不指定输出文件名,如果这样的话,原始文件直接被更新。

3. 目录及其文件的patch

生成patch >
diff -cr originaldirectory/ updatedirectory/ > patchfile.patch

还原 >
比如把orignaldirectory 和 patchfile.patch拷贝到一个目录下,运行:
patch -p0 -i patchfile.patch
其中 -p 用于告诉patch要去掉路径中多少'/'。


4. 恢复到原始文件
如果想恢复到patch之前,接上面的例子,可以运行下面的command:
patch -p0 -R -i patchfile.patch


5. unified format
只被GNU diff和patch支持,类似context format,但是更紧凑
比如生成kernel的patch方式,通常如下:
diff -Nur /patch/to/original/kernel /path/to/your/kernel > changes.patch
其中-N: Treat absent files as empty