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 文件。
二、生成补丁
1. git diff
(1) 指定文件生成 patch 文件

git diff <filename> > test.patch 或 test.diff

eg. 比如我们修改了 Test.java,Test1.java 文件,我们只想 patch Test.java 文件,那么我们可以使用以下的命令

git diff Test.java > test.patch

想把所有的修改文件打成 patch,即 Test.java,Test1.java 文件,只需要使用下面的命令

git diff  > test.patch

(2) 指定 commit id 生成 patch

使用命令行

git diff  【commit id 1】 【commit id 2】 >  patch/diff文件名

2. git format-patch
当前分支所有超前master的提交:

扫描二维码关注公众号,回复: 16038278 查看本文章

git format-patch -M master

某次提交以后的所有 patch:

git format-patch [commit id]

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

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

git format-patch --root [commit id]

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

git format-patch [commit id 1]..[commit id 2]

eg.  git format-patch 365a..4e16    //–365a和4e16分别对应两次提交的commit id

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

git format-patch –n [commit id]

–n 指 patch数,

生成某次 commit 的 patch 文件:

git format-patch -1 [commit id]

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

git format-patch -3

过程是,将HEAD和HEAD^相比,生成0003.xxx.patch, 将HEAD^和HEAD^^相比,生成0002.xxx.patch, 将HEAD^^和HEAD^^^相比,生成0003.xxx.patch

git am时可以依编号从小到大进行,也可以git am path/*.patch(git am会自动依编好从小到大进行)

三、应用补丁
1. 检查 patch/diff 文件:
git apply --stat xxx.patch

检查能否应用成功

git apply --check xxx.patch/xxx.diff

2. 打补丁:
针对 git diff 生成的补丁:

git apply xxx.patch/xxx.diff

针对 git format-patch 生成的补丁:

git am xxx.patch

四、冲突解决
定位和解决git am冲突的方法_一程山水一程歌-CSDN博客

五、其他
1、包含二进制文件时的diff和apply
git diff HEAD^..HEAD --binary > foobar.patch

https://cloud.tencent.com/developer/article/1423939
https://www.jianshu.com/p/ec04de3f95cc

 

猜你喜欢

转载自blog.csdn.net/wanglei_11/article/details/130768993