git 补丁 - diff 和 patch 使用详解 Love The Way You Lie 2022-02-13 10:49 384阅读 0赞 * [Git下载及配置环境变量][Git] * [Git 命令行教程及实例教程][Git 1] * [Git ssh 配置及使用][Git ssh] * [ git ssh 配置多个账户][git ssh] * [Git config 使用说明][Git config] * [Git 配置别名 —— 让命令变得更简单][Git _ _] * [git 设置 mergetool,difftool 为 BeyondCompare ][git _ mergetool_difftool _ BeyondCompare] * [git 补丁 - diff 和 patch 使用详解][git _ - diff _ patch] ## diff 和 patch 的区别 ## Git 提供了两种补丁方案,一种是通过 git diff 生成的 .diff 文件,第二种是通过 git format-patch 生成的 .patch 文件。 通过 git diff 生成的文件不含有 commit 信息,可以指定文件生成 diff,也可以指定单个 commit, 多个 commit 生成 。通过 git format-patch 生成的 .patch 文件 含有 commmit 信息。一个 commit 对应一个 patch 文件。 在开发当中,有时候,我们需要进行代码迁移,这时候就可以使用补丁,方便又快捷 -------------------- ## git diff ## ### 指定文件生成 patch 文件 ### patch 补丁即为根据 git diff 生成的文本内容文件,最简单的生成方法为 git diff > test.patch。 举例子:比如我们修改了 Test.java,Test1.java 文件,我们只想 patch Test.java 文件,那么我们可以使用以下的命令 git diff Test.java > test.patch 想把所有的修改文件打成 patch,即 Test.java,Test1.java 文件,只需要使用下面的命令 git diff > test.patch ### 指定 commit id 生成 patch ### 使用命令行 git diff 【commit sha1 id】 【commit sha1 id】 > 【diff文件名】 ## git format-patch ## 当前分支所有超前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 does 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 上去。 -------------------- ## 题外话 ## 在实际开发当中,我们 apply patch 的时候,通常会使用 git 图形工具,因为一旦产生冲突,解决比较方便,比较常用的 git 工具有 sourceTree, TortoiseGit(小乌龟)。 ![Android 技术人][Android] **扫一扫,欢迎关注我的公众号。如果你有好的文章,也欢迎你的投稿。** [Git]: http://blog.csdn.net/gdutxiaoxu/article/details/53573286 [Git 1]: http://blog.csdn.net/gdutxiaoxu/article/details/53573339 [Git ssh]: http://blog.csdn.net/gdutxiaoxu/article/details/53573399 [git ssh]: http://blog.csdn.net/gdutxiaoxu/article/details/53573426 [Git config]: http://blog.csdn.net/gdutxiaoxu/article/details/79253737 [Git _ _]: http://blog.csdn.net/gdutxiaoxu/article/details/79254607 [git _ mergetool_difftool _ BeyondCompare]: https://blog.csdn.net/gdutxiaoxu/article/details/80455810 [git _ - diff _ patch]: https://blog.csdn.net/gdutxiaoxu/article/details/89606676 [Android]: https://raw.githubusercontent.com/gdutxiaoxu/blog_pic/master/19_04/20190402200538.png
还没有评论,来说两句吧...