linux下与git打补丁

一、LINUX下生成补丁,与打补丁

说到patch命令,就不得不提到diff命令,也就是制作patch的必要工具。diff命令,在制作patch文件的时候,基本上只需要使用到diff -Nau 这个参数,如果比较的是文件夹,还要加上-r参数,所以一般直接使用Naur参数。

比较两个文件:diff -y a.txt b.txt
比较文件并生成补丁:diff -Nau a.txt b.txt > xxx.patch
比较目录并生成补丁:diff -Naru a b > xxx.patch (不管比较文件还是目录可直接使用这个)

patch命令里面的层数(-p0?-p1?)
参数-p来指定从第几层开始比较。比如有一个patch文件的补丁头是这样的:

代码:
--- old/modules/pcitableMon +++ new/modules/pcitableTue
p0:就表示从当前目录,找一个叫作new的目录,在它下面找一个叫modules的目录,再在它下面找一个叫pcitableMon的目录。

p1:就表示忽略第一层,从当前目录找一个叫modules的目录,在它下面找一个叫modules的目录。这样会忽略掉补丁头提到的new目录。依此类推

打补丁举例:
diff -uN old-file new-file >new.patch
把生成的new.patch给到别人
patch -p0 < new.patch //此时别人这边的old-file打上补丁后就和你这边最新的new-file一致。

1、处理单个文件补丁的方法:
产生补丁
diff -uN old-file new-file >new.patch
打补丁
把生成的new.patch给到别人
patch -p0 < new.patch //此时别人这边的old-file打上补丁后就和你这边最新的new-file一致。

取消补丁
patch -RE -p0 < new.patch //恢复打补丁之前的状态

2、对整个文件夹打补丁的情况:
产生补丁
diff -uNr from-docu to-docu >to-docu.patch
打补丁
cd to-docu
patch -p1 < to-docu.patch
取消补丁
patch -R -p1 注,冲突:
.orig 合并前文件备份。
.rej 文件里是冲突没合入的内容。

二、GIT补丁

2.1、生成适用git类型的patch补丁使用git format-patch生成所需要的patch,(推荐只适用于git的patch包含diff信息,包含提交人,提交时间等

当前分支所有超前master的提交:
git format-patch -M master

某次提交以后的所有patch:
git format-patch 4e16 --4e16指的是commit名

从根到指定提交的所有patch:
git format-patch --root 4e16

某两次提交之间的所有patch:
git format-patch 365a..4e16 --365a和4e16分别对应两次提交的名称

某次提交(含)之前的几次提交:
git format-patch –n 07fe --n指patch数,07fe对应提交的名称
故,单次提交即为:
git format-patch -1 07fe

生成的补丁文件默认从1开始顺序编号,并使用对应提交信息中的第一行作为文件名。如果使用了-- numbered-files选项,则文件名只有编号,不包含提交信息;
如果指定了--stdout选项,可指定输出位置,如当所有patch输出到一个文件;可指定-o

指定patch的存放目录;
git format-patch

2.1、生成diff类型补丁(生成标准的patch,只包含diff信息)
git diff 【commit sha1 id】 【commit sha1 id】 > 【diff文件名】
https://blog.csdn.net/wq6ylg08/article/details/88798254

2.2、打补丁

git apply
检查patch/diff是否能正常打入:
git apply --check 【path/to/xxx.patch】
git apply --check 【path/to/xxx.diff】

打入patch/diff(需要重新commit):
git apply 【path/to/xxx.patch】
git apply 【path/to/xxx.diff】

git am(会自动commit)
git am 可以一次合并一个文件,或者一个目录下所有的patch(且会自动提交)如参考中的举例:
git am 001 - xxx.patch(一次打一个文件)
git am path/*.path(一次性打多个文件)

参考:

Git打补丁参考:
https://blog.csdn.net/u012701023/article/details/82984026?utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control

https://zhuanlan.zhihu.com/p/50742897?utm_source=wechat_session

https://www.jianshu.com/p/ec04de3f95cc?utm_source=oschina-app

-------------------------------------- 适合自己的才是最好的!-----------------------------------------
原文地址:https://www.cnblogs.com/retry/p/14661414.html