git patch

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 的过程了。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值