Git 补丁— diff 和 patch 使用详解

1. diff 和 patch 的区别

Git 提供了两种补丁方案,一种是通过 git diff 生成的 .diff 文件,第二种是通过 git format-patch 生成的 .patch 文件。

通过 git diff 生成的文件不含有 commit 信息,可以指定文件生成 diff,也可以指定单个 commit, 多个 commit 生成 。通过 git format-patch 生成的 .patch 文件 含有 commmit 信息。一个 commit 对应一个 patch 文件。

在实际开发中,我们会经常用到补丁,不论是在代码迁移,还是bug修复中,都时常使用。

2. 生成patch

2.1 git diff

指定文件生成 patch 文件

patch 补丁即为根据 git diff 生成的文本内容文件,最简单的生成方法为 git diff > test.patch。

举例子:比如我们修改了 A.java、B.java 文件,我们只想将 A.java 文件的修改打成 patch,那么我们可以使用以下的命令:
  git diff A.java > test.patch

想把所有的修改文件打成 patch,即 A.java、B.java 文件,只需要使用下面的命令:
  git diff > test.patch

指定 commit id 生成 patch

使用命令行
  git diff 【commit sha1 id】 【commit sha1 id】 > 【diff文件名】

3. 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】

举例:	
git format-patch 365a..4e16
–365a和4e16分别对应两次提交的名称

某次提交(含)之前的几次提交:
  git format-patch –n 【commit id】

举例:
git format-patch –n 07fe
–n 指 patc h数,07fe 对应提交的名称

故,单次提交即为:

  git format-patch -1 【commit id】

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

3. 应用patch

先检查patch文件:
  git apply --stat xxx.patch

检查能否应用成功
  git apply --check xxx.patch

打补丁:
  git apply xxx.patch

如果应用 patch 出现问题:

比如,一个典型的git apply失败,可能是这样的:
在这里插入图片描述
正如你所见,如果冲突发生,git只是输出上述信息,然后就停下来。一个小冲突会导致整个patch都不会被集成。

4. 冲突解决

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

首先,执行以下命令,自动合入 patch 中不冲突的代码,同时保留冲突的部分
  git apply --reject xxxx.patch

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


题外话

在实际开发当中,我们 apply patch 的时候,通常会使用 git 图形工具,因为一旦产生冲突,解决比较方便,比较常用的 git 工具有 sourceTree, TortoiseGit(小乌龟)。

  • 9
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ʚ兔子的先森ɞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值