写点什么

git 补丁 - diff 和 patch 使用详解 (1)

发布于: 2021 年 11 月 07 日

当前分支所有超前 master 的提交:


git format-patch -M master


某次提交以后的所有 patch:


git format-patch [commit id]


[commit id] 指的是 commit 名,可以通过 git log 查看。


从根到指定提交的所有 patch:


git format-patch --root 4e16


某两次提交之间的所有 patch:


git format-patch 【commit sha1 id】..【commit sha1 id】


eg


git format-patch 365a..4e16


–365a 和 4e16 分别对应两次提交的名称


某次提交(含)之前的几次提交:


git format-patch –n 07fe


–n 指 patc h 数,07fe 对应提交的名称


故,单次提交即为:


git format-patch -1 07fe


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


指定 patch 的存放目录;




应用 patch:




先检查 patch 文件:


git apply --stat xxx.patch


检查能否应用成功


git apply --check xxx.patch


打补丁:


git am --signoff < xxx.patch


(使用-s 或–signoff 选项,可以 commit 信息中加入 Signed-off-by 信息)


如果应用 patch 出现问题:


比如,一个典型的 git am 失败,可能是这样的:


$ git am PATCH


Applying: PACTH DESCRIPTION


error: patch failed: file.c:137


error: file.c: patch do


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


es not apply


error: patch failed: Makefile:24


error: libavfilter/Makefile: patch does not apply


Patch failed at 0001 PATCH DESCRIPTION


When you have resolved this problem run "git am --resolved".


If you would prefer to skip this patch, instead run "git am --skip".


To restore the original branch and stop patching run "git am --abort".


正如你所见,如果冲突发生,git 只是输出上述信息,然后就停下来。一个小冲突会导致整个 patch 都不会被集成。




冲突解决




当我们打补丁出现冲突的时候,这个时候需要我们手动解决冲突。


第一步:首先,执行以下命令,自动合入 patch 中不冲突的代码,同时保留冲突的部分


git apply --reject xxxx.patch


同时会生成后缀为 .rej 的文件,保存没有合并进去的部分的内容,可以参考这个进行冲突解决。


第二步:2、解决完冲突后删除后缀为 .rej 的文件,并执行 并执行 git add.添加改动到暂存区


第三步: 执行 git am --resolved,最后 push 上去。




题外话

评论

发布
暂无评论
git 补丁 -  diff 和 patch 使用详解(1)