linux笔记 diff及patch的制作与使用

相关命令展示

为方便查阅博客使用,预先展示相关命令

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值