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 文件里是冲突没合入的内容。
https://blog.csdn.net/zxng_work/article/details/77852560
二、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
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(一次性打多个文件)
参考:
https://zhuanlan.zhihu.com/p/50742897?utm_source=wechat_session
https://www.jianshu.com/p/ec04de3f95cc?utm_source=oschina-app