Git 的 patch 功能支持开发者通过文件与别人分享自己的改动,本文记录 patch 使用方法。
简介 {#简介}
在同一个 git 管理仓库下,当然直接使用 git 的常用命令可以很好地和其他开发者共享工作,当开发者不处在同一个版本管理平台下,或仅作临时修改时,则可以通过 patch 打补丁的方式共享代码改动
- Git 提供了两种补丁方案,一种是通过
git diff
生成的.diff
文件,第二种是通过git format-patch
生成的.patch
文件。 - 通过
git diff
生成的文件不含有commit
信息,可以指定文件生成diff
,也可以指定单个commit
, 多个commit
生成 。 - 通过
git format-patch
生成的.patch
文件 含有commit
信息。一个commit
对应一个patch
文件。
生成 patch {#生成-patch}
git diff {#git-diff}
-
指定文件生成
patch
文件 -
patch
补丁即为根据git diff
生成的文本内容文件,最简单的生成方法为git diff > test.patch
。
比如我们修改了
A.java、B.java
文件,我们只想将A.java
文件的修改打成patch
,那么我们可以使用以下的命令: 想把所有的修改文件打成patch
,即A.java、B.java
文件,只需要使用下面的命令:
- 指定
commit id
生成patch
使用命令行
git format-patch {#git-format-patch}
-
当前分支所有超前
master
的提交: -
某次提交以后的所有
patch
: -
[commit id] 指的是 commit 名,可以通过 git log 查看。
-
从根到指定提交的所有
patch
: -
某两次提交之间的所有
patch
:
365a
和4e16
分别对应两次提交的名称
- 某次提交(含)之前的几次提交:
--n
指patch
数,07fe
对应提交的名称
- 单次提交即为:
git format-patch
生成的补丁文件默认从1开始顺序编号,并使用对应提交信息中的第一行作为文件名。- 如果使用了
--numbered-files
选项,则文件名只有编号,不包含提交信息; - 如果指定了
--stdout
选项,可指定输出位置,如当所有patch
输出到一个文件;可指定-o
指定patch
的存放目录。
应用 patch {#应用-patch}
git apply {#git-apply}
- 应用
git apply
命令应用patch
的原理是将patch
中的改动添加到工作区,应用后会相当于对文件做出修改而不惊动git
git apply
用于diff
和format-patch
输出的patch
使用步骤 {#使用步骤}
-
将生成的
patch
文件放在生成时候相同的位置 -
先检查patch文件格式:
-
测试patch是否能应用到当前分支
-
应用此
patch
打补丁 -
这种方式传递的修改将会丢失提交信息和作者信息,但可以兼容非 git 管理的代码。除此之外,git 还提供另一个命令更便于 git 库之间的
patch
传递。 -
过程中如果有冲突则会停止应用,报错:
解决冲突 {#解决冲突}
出现冲突的时候,这个时候需要我们手动解决冲突。
-
首先,执行以下命令,自动合入 patch 中不冲突的代码,同时保留冲突的部分
-
同时会生成后缀为
.rej
的文件,保存没有合并进去的部分的内容,可以参考这个进行冲突解决。
git am {#git-am}
-
format-patch
生成的patch
保存了更多提交信息。因此除了git apply
之外,还可以用更智能的git am
命令使用此patch
,会在修改文件的同时将commit
信息也一起应用到git
中。 -
git am
可以复现修改,保留作者信息,保留commit
信息,但 commit ID 无法保留。 -
git am
命令会在应用patch
失败时给出详细的错误信息,并允许手动解决冲突,是官方较为推荐的补丁应用方式。 -
在使用
git am
之前, 需要先git am --abort
一次,以放弃掉以前的am
信息。不然可能会遇到这样的错误。
-
git am
可以一次合并一个文件,或者一个目录下所有的patch
: -
再次声明,
am
复现的commit
的ID
会和之前不同 ,因此建议在有仓库管理的情况下用git pull
参考资料 {#参考资料}
- https://blog.csdn.net/IT_xiao_bai0516/article/details/121619389
- https://www.jb51.net/article/191549.htm
- https://blog.csdn.net/rclijia/article/details/109257603
- https://baijiahao.baidu.com/s?id=1627219440390872098&wfr=spider&for=pc
- http://note.alvinhtml.com/developer/git.html
文章链接:
https://www.zywvvd.com/notes/tools/git/git-patch/git-patch/