速发国际365的最新网站-百特365平台可靠吗-日博365投注网

git生成patch和打patch

日常开发与合作过程中,对于code生成patch和打patch(应用patch)成为经常需要做的事情,使用方法(直接给出一些examples): 生成patch git diff > xxx.patc

git生成patch和打patch

日常开发与合作过程中,对于code生成patch和打patch(应用patch)成为经常需要做的事情,使用方法(直接给出一些examples):

生成patch

git diff > xxx.patch

#只想 patch Test.java 文件

git diff Test.java > test.patch

# 把所有的修改文件打成 patch

git diff > test.patch

git format-patch

$ git format-patch HEAD^ #生成最近的1次commit的patch

$ git format-patch HEAD^^ #生成最近的2次commit的patch

$ git format-patch HEAD^^^ #生成最近的3次commit的patch

$ git format-patch HEAD^^^^ #生成最近的4次commit的patch

$ git format-patch .. #生成两个commit间的修改的patch(生成的patch不包含r1. 都是具体的commit号)

$ git format-patch -1 #生成单个commit的patch

$ git format-patch #生成某commit以来的修改patch(不包含该commit)

$ git format-patch --root #生成从根到r1提交的所有patch

应用patch

git am会直接将patch的所有信息打上去,而且不用重新git add和git commit,author也是patch的author而不是打patch的人。git apply是另外一种打patch的命令,其与git am的区别是:git apply并不会将commit message等打上去,打完patch后需要重新git add和git commit。

检查patch的情况

$ git apply --stat 0001-limit-log-function.patch # 查看patch的情况

$ git apply --check 0001-limit-log-function.patch # 检查patch是否能够打上,如果没有任何输出,则说明无冲突,可以打上

打patch场景之一使用git diff生成的patch

$ git apply xxx.patch

打patch场景之二使用git format-patch生成的patch

$ git am 0001-limit-log-function.patch # 将名字为0001-limit-log-function.patch的patch打上

$ git am --signoff 0001-limit-log-function.patch # 添加-s或者--signoff,还可以把自己的名字添加为signed off by信息,作用是注明打patch的人是谁,因为有时打patch的人并不是patch的作者

$ git am ~/patch-set/*.patch # 将路径~/patch-set/*.patch 按照先后顺序打上

$ git am --abort # 当git am失败时,用以将已经在am过程中打上的patch废弃掉(比如有三个patch,打到第三个patch时有冲突,那么这条命令会把打上的前两个patch丢弃掉,返回没有打patch的状态)

$ git am --resolved # 当git am失败,解决完冲突后,这条命令会接着打patch

打patch发生冲突

解决patch冲突的过程是:如果不想打这一系列patch了,直接:git am --abort。如果还想打, 有两种解决方案:

方案一(个人推荐):

(1) 根据git am失败的信息,找到发生冲突的具体patch文件,然后用命令git apply --reject ,强行打这个patch,发生冲突的部分会保存为.rej文件(例如发生冲突的文件是a.txt,那么运行完这个命令后,发生conflict的部分会保存为a.txt.rej),未发生冲突的部分会成功打上patch(2) 根据.rej文件,通过编辑该patch文件的方式解决冲突(3) 废弃上一条am命令已经打了的patch:git am --abort(4) 重新打patch:git am ~/patch-set/*.patchpatch

方案二:

(1) 根据git am失败的信息,找到发生冲突的具体patch文件,然后用命令git apply --reject ,强行打这个patch,发生冲突的部分会保存为.rej文件(例如发生冲突的文件是a.txt,那么运行完这个命令后,发生conflict的部分会保存为a.txt.rej),未发生冲突的部分会成功打上patch(2) 根据.rej文件,通过编辑发生冲突的code文件的方式解决冲突(3) 将该patch涉及到的所有文件(不仅仅是发生冲突的文件)通过命令git add 添加到工作区中(4) 告诉git冲突已经解决,继续打patch: git am --resolved (git am --resolved 和 git am --continue是一样的)

分析:方案一和方案二主要区别是解决冲突的方法不一样。方案一是通过编辑patch文件的方式解决冲突,方案二是通过编辑冲突code文件的方式解决冲突。这两种方案区别比较大:经过实验,核心区别在于,方案二无法验证冲突有没有切实的解决。即使你在方案二的第二步乱改一通,也能“打完”发生冲突的patch(并没有检测修改后的code文件跟patch期望的是否相同)。因此,如果采用方案二,那么再解决code文件冲突后,需要人工去确认修改的正确性。

patch就是打补丁,通过git工具把代码的差分,生成patch文件,然后通过git工具可以直接把patch文件的内容,merge到代码里面。

生成patch的命令

git diff > patch //本地变更 git diff 的内容,生成patch文件git diff branchname --cached > patch //branch 之间差分生成patch文件git diff commit-id-new commit-id-old --name-only|xargs tar cjvf xxxxx-patch.tar.bz2 可以根据提交按照目录树快速生成补丁文件.git format-patch HEAD^ //最近一次提交节点的patchgit format-patch 节点A 节点B //两个节点之间的patch

使用patch

git apply patch //将patch文件内容差分到本地,在使用patch之前可以使用以下命令,来测试,是否可以将patch完美打入本地srcgit apply --check patch

最后补充一句,强制打patch。

git apply --reject xxx.patch

← 上一篇: 如何取消在电脑版QQ上记住密码
下一篇: 调试平台代码 →

相关推荐

加拿大旅游签证表格IMM5257中的UCI是什么意思?必须要填写吗?

加拿大旅游签证表格IMM5257中的UCI是什么意思?必须要填写吗?

加拿大旅游签证申请表IMM5257中的UCI的全名是“Unique Client Identifier”通用客户识别码,首次申请加拿大签证是不会有UCI号码的,可以留空不用填写

淘宝怎样更新版本 淘宝版本更新步骤

淘宝怎样更新版本 淘宝版本更新步骤

淘宝是中国最大的网络购物平台之一,随着用户需求的不断增长和技术的不断进步,淘宝也会不定期地进行版本更新以提供更好的用户体验和功

阴阳师招财猫哪里刷 御魂招财猫属性介绍

阴阳师招财猫哪里刷 御魂招财猫属性介绍

阴阳师招财猫好用么?御魂阴阳师招财猫怎么刷?阴阳师招财猫御魂搭配?想必这些是很多玩家的疑问。本篇攻略将详细为你解读阴阳师招财猫御

剑与家园哪些英雄值得培养升级 平民最强英雄选择

剑与家园哪些英雄值得培养升级 平民最强英雄选择

【平民最强英雄选择】 阿瓦隆 领袖型英雄,偏攻击,新手获得的第一个的英雄,各项能力平衡。技能是大范围的箭雨和召唤额外的士兵战斗,

梦幻西游69级升到100级要多少经验(技能到100和钱要多少)

梦幻西游69级升到100级要多少经验(技能到100和钱要多少)

以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 梦幻西游69级升到100级要多少经

吐鲁番酒店,吐鲁番酒店预订查询,吐鲁番宾馆住宿【携程酒店】

吐鲁番酒店,吐鲁番酒店预订查询,吐鲁番宾馆住宿【携程酒店】

吐鲁番酒店信息放心找吐鲁番酒店的酒店,携程酒店为您提供吐鲁番酒店酒店预订、实时酒店价格、特惠酒店预订以及吐鲁番酒店住宿推荐,精