相关命令展示
为方便查阅博客使用,预先展示相关命令
diff命令
diff -uN old.txt new.txt > patch_test.patch
单个文件,不需要使用-r参数
diff 选项参数 旧文件(夹) 新文件(夹) > 补丁
diff命令的常用选项参数
-r
递归recursion 将新旧版本代码所在目录所有文件递归比较,包括子目录
-N
确保补丁正确无误地处理已创建或删除文件的情况
-u
默认为输出每个需要修改的代码块的前后3行,如需指定行数,则使用-uNUM,更改NUM为所需行数
patch命令
在旧文件目录下
patch -p0 < patch_test.patch
注意!patch必须在旧文件夹中打,否则将会发生错误!
patch命令的格式
patch将diff生成的补丁记录下的差异信息,应用到旧文件上
patch 选项参数 < 补丁 # patch中已含有新旧文件的信息,无须将新旧文件作为参数输入
patch的常用选项参数
-pNUM
NUM表示忽略的文件夹层数,忽略patch文件中新旧文件的父目录层数
以desktop/diff_patch_test/old为例
-p0为在desktop目录下找diff_patch_test再找old
-p1则是忽略第一层的desktop目录,直接从当前目录下找diff_patch_test再找old
(存疑)
-E
empty 如果发现空文件,则删除,常见于需要删除旧文件夹中某个旧文件整体的情况,以及恢复补丁时删除之前新写的无效文件
-R
reverse 取消打的补丁
通过patch恢复源文件
当补丁错误时,可以使用-RE选项参数恢复源文件,意为取消打的补丁,并删除空文件
patch -RE -p0 <patch_test.patch
案例1:单个文件的补丁制作与替换
以单个文件为例,diff与patch制作及打补丁呈现过程
1.源文件(旧)
old.txt
11111111
22222222
33333333
44444444
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
2.目的文件(新)
new.txt
11111111
55555555
66666666
77777777
aaaaaaaa
eeeeeeee
ffffffff
gggggggg
3.通过diff命令制作patch文件
在该文件目录下
diff -uN old.txt new.txt > patch_test.patch
因此处为单个文件,不需要使用-r参数
diff命令的格式
diff 选项参数 旧文件(夹) 新文件(夹) > 补丁
diff命令的常用选项参数
-r
递归recursion 将新旧版本代码所在目录所有文件递归比较,包括子目录
-N
确保补丁正确无误地处理已创建或删除文件的情况
-u
默认为输出每个需要修改的代码块的前后3行,如需指定行数,则使用-uNUM,更改NUM为所需行数
4.查看patch文件的组成
--- old.txt 2023-02-09 10:17:20.787930669 +0800 # 补丁头 ---开头表示旧文件
+++ new.txt 2023-02-09 10:18:54.989109075 +0800 # 补丁头 +++开头表示新文件
@@ -1,8 +1,8 @@ # @@开头表示块位置 是文件需要修改前后的定位行及段落区间等信息,以@@结束
# -1,8表示需要修改的代码块在旧文件的行号,以及修改前该代码块区间的总行数
# +1,8表示需要修改的代码块在新文件的行号,以及修改后该代码块区间的总行数
11111111 #块内容 块内容的首列缩进1字符,空白表示引用/未作增删 -表示删去的内容 +表示增加的内容
-22222222
-33333333
-44444444
+55555555
+66666666
+77777777
aaaaaaaa
-bbbbbbbb
-cccccccc
-dddddddd
+eeeeeeee
+ffffffff
+gggggggg
5.打patch
在旧文件目录下
patch -p0 < patch_test.patch
注意!patch必须在旧文件夹中打,否则将会发生错误!
错误如下:
patch命令的格式
patch将diff生成的补丁记录下的差异信息,应用到旧文件上
patch 选项参数 < 补丁 # patch中已含有新旧文件的信息,无须将新旧文件作为参数输入
patch的常用选项参数
-pNUM
NUM表示忽略的文件夹层数,忽略patch文件中新旧文件的父目录层数
以desktop/diff_patch_test/old为例
-p0为在desktop目录下找diff_patch_test再找old
-p1则是忽略第一层的desktop目录,直接从当前目录下找diff_patch_test再找old
(存疑)
-E
empty 如果发现空文件,则删除,常见于需要删除旧文件夹中某个旧文件整体的情况,以及恢复补丁时删除之前新写的无效文件
-R
reverse 取消打的补丁
通过patch恢复源文件
当补丁错误时,可以使用-RE选项参数恢复源文件,意为取消打的补丁,并删除空文件
patch -RE -p0 <patch_test.patch
案例2:文件夹的补丁制作与替换
原理基本与上相同
与单个文件不同,在diff制作补丁时,需遍历整个文件夹,因此需要加-r选项参数
注意打补丁时需要到旧文件夹的目录下!
此处的-p1参数,是因为新旧文件夹中的改动通常在new文件夹和old文件夹里,需要忽略首层的old和new文件夹,将内容物替换
# 制作补丁
diff -uNr old_docu new_docu > new_docu.patch
# 打补丁
cd new_docu # 需要到旧文件夹目录下!
patch -p1 < old_docu.patch # 注意选项参数-p1
# 如有需要,取消补丁
#patch -R -p1 <new_docu.patch
案例3:git打补丁实战
1.生成
对于git的补丁有两种方案
git diff
生成UNIX标准补丁.diff文件
git format-patch
生成Git专用.patch文件
.diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件
.patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件
2.检查和应用
检查补丁状态
git apply --stat patch_name.patch
检查补丁是否可打入
git apply --check patch_name.patch
正式打入
git apply patch_name.patch
References
补丁的制作与应用
git生成patch和应用
如何用git生成pitch