git diff/patch 用于将所做的修改进行打包,然后再别的分支或给别人可以直接应用该patch,达到修改复用的效果。
diff命令
git diff > xxxx.patch 输出当前工作区相比版本库的差异
git diff xx.file > xxxx.patch
git diff --cached > xxx.patch
git diff commit_id1 commit_id2 > xxx.patch 输出commit_id2相对commit_id1的差异
git diff commit_id > xxx.patch 输出当前工作区相比版本 commit_id 的差异
基本用法:
git diff > xxxx.patch
这样将git diff的输出放在一个文件中,而diff的输出就是修改的补丁,是tracked的文件的修改记录(相对于commit在库中的修改)。
如果有新增的文件,并不在Git管理之内,也就是还没有commit在仓库中的文件,执行如下:
git diff --cached > modified.patch
如果还包含二进制文件,例如图片等
git diff --cached --binary > modified.patch
对某个 commit 生成相对上一次提交的 diff patch
先用 git log 找到两个 commit 记录的签名,然后利用:
git diff 上次提交id 本次提交id > modified.patch
————————————————---------------------------------------------------------
format-patch命令
git format-patch 详解
打包最近的一个patch:git format-patch HEAD^,有几个^就打包几个patch的内容;或git format-patch -n
git format-patch HEAD^ 有几个^就会打几个patch,从最近一次打起
git format-patch HEAD^^ 最近的二个patch内容
以下作用同上
git format-patch -1 // 打包最近1次提交的patch
git format-patch -n // 打包最近n次提交的patch,生成n个patch文件
git format-patch -m -n // 打包版本m与n之间的patch,不包括-m这次的提交
git format-patch xxx // 某次提交以后的所有patch,xxx是commit值
git format-patch -n xxx // 包括提交xxx在内的前n次提交,共n次
git format-patch xxx1..xxx2 // 某两次提交之间的所有patch,不包括xxx1这次的patch
将所有patch输出到一个指定位置的指定文件 git format-patch xxx --stdout > xxx.patch
————————————————--------------------------------------------------------------------
apply命令应用patch
git apply --stat xxx.patch
git apply --check xxx.patch
git apply xxx.patch
将一个patch应用到Git仓库中之前应该先
检查patch文件: git apply --stat xxx.patch
检查能否应用成功: git apply --check xxx.patch
将一个patch应用到Git仓库中的命令是: git apply xxx.patch
————————————————---------------------------------------------------------
am命令应用patch
git am的补丁必须是git format-patch生成的。
————————————————---------------------------------------------------------
两种patch文件的区别
diff仅保留了文件重A状态变成B状态的差别,而不会保留commit记录消息等信息,而format-patch则是完整保留了每次提交的完成信息,这也解释了diff可以多个commit生成单个patch,而format-patch则是每个commit都生成一个patch文件。
两者是成对使用的,即git apply使用的补丁必须是git diff生成的;git am的补丁必须是git format-patch生成的。当然补丁检查都是用git apply --check/--stat。
git apply 应用后文件改动到工作区,git am会自动add且commit,提交的信息用的是format-patch生成的patch里面的提交信息。
执行命令 git apply --reject xxxx.patch 自动合入 patch 中不冲突的代码改动,同时保留冲突的部分。这些存在冲突的改动内容会被单独存储到目标源文件的相应目录下,以后缀为 .rej 的文件进行保存。
依据生成的 *.rej 文件内容逐个手动解决冲突,然后删除这些 *.rej 文件。完成这一步骤的操作后,我们就可以继续执行 git am 的过程了。