在代码开发的过程中常常需要在源码的基础上进行修改,在合并代码的时候一般就会以patch的形式进行提交,那么生成patch和应用patch就需要了解一下了。
所谓的patch其实就是文件对比,在Linux上使用diff命令(ref2)就可以得到patch.具体的命令为
diff -uprN test1/ test2/ > test.patch
上述命令对比了test1路径下和test2路径下的代码差异,如果不需要对比某些内容,则在diff命令后使用–exclude-from=xx,在xx中指明哪些信息无需对比,如git信息等
test1/a.txt
123
123
test2/a.txt
123
123
456
test.patch
diff -uprN test1/a.txt test2/a.txt
+++ test2/a.txt 2018-08-01 14:31:55.000000000 +0800
@@ -1,3 +1,4 @@
123
123
+456
参数详解:
-u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息.
-p 显示代码所在的c函数的信息.
-r 递归地对比一个目录和它的所有子目录(即整个目录树).
-N 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分.
对比结果产生的test.patch就是我们需要的patch,假设现在需要未某一个未经修改的源码打上我们的patch,如给test1路径下的文件打上patch
cd test1
patch -p1 < test.patch
生成的补丁中, 路径信息包含了你的源码根目录的名称, 但其他人的源码根目录可能是其它名字, 所以, 打补丁时, 要进入你的源码根目录, 并且告诉patch工具, 请忽略补丁中的路径的第一级目录(参数-p1).
这样就可以将test.patch中的内容打到test1/a.txt中