前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >git 补丁 - diff 和 patch 使用详解

git 补丁 - diff 和 patch 使用详解

作者头像
程序员徐公
发布2019-05-10 18:42:38
33.5K0
发布2019-05-10 18:42:38
举报

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1423939

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(小乌龟)。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • diff 和 patch 的区别
  • git diff
    • 指定文件生成 patch 文件
      • 指定 commit id 生成 patch
      • git format-patch
      • 应用patch:
      • 冲突解决
      • 题外话
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档