Git 补丁— diff 和 patch 使用详解
Git 补丁— diff 和 patch 使用详解
- 1. diff 和 patch 的区别
- 2. 生成patch
- 2.1 git diff
- 3. git format-patch
- 3. 应用patch
- 4. 冲突解决
- 题外话
1. diff 和 patch 的区别
Git 提供了两种补丁方案,一种是通过 git diff 生成的 .diff 文件,第二种是通过 git format-patch 生成的 .patch 文件。
通过 git diff 生成的文件不含有 commit 信息,可以指定文件生成 diff,也可以指定单个 commit, 多个 commit 生成 。通过 git format-patch 生成的 .patch 文件 含有 commmit 信息。一个 commit 对应一个 patch 文件。
在实际开发中,我们会经常用到补丁,不论是在代码迁移,还是bug修复中,都时常使用。
2. 生成patch
2.1 git diff
指定文件生成 patch 文件
patch 补丁即为根据 git diff 生成的文本内容文件,最简单的生成方法为 git diff > test.patch。
举例子:比如我们修改了 A.java、B.java 文件,我们只想将 A.java 文件的修改打成 patch,那么我们可以使用以下的命令:
git diff A.java > test.patch
想把所有的修改文件打成 patch,即 A.java、B.java 文件,只需要使用下面的命令:
git diff > test.patch
指定 commit id 生成 patch
使用命令行
git diff 【commit sha1 id】 【commit sha1 id】 > 【diff文件名】
3. git format-patch
当前分支所有超前master的提交:
git format-patch -M master
某次提交以后的所有 patch:
git format-patch [commit id]
[commit id] 指的是 commit 名,可以通过 git log 查看。
从根到指定提交的所有patch:
git format-patch --root 4e16
某两次提交之间的所有patch:
git format-patch 【commit sha1 id】..【commit sha1 id】
举例:
git format-patch 365a..4e16
–365a和4e16分别对应两次提交的名称
某次提交(含)之前的几次提交:
git format-patch –n 【commit id】
举例:
git format-patch –n 07fe
–n 指 patc h数,07fe 对应提交的名称
故,单次提交即为:
git format-patch -1 【commit id】
git format-patch 生成的补丁文件默认从1开始顺序编号,并使用对应提交信息中的第一行作为文件名。如果使用了-- numbered-files 选项,则文件名只有编号,不包含提交信息;如果指定了–stdout选项,可指定输出位置,如当所有patch输出到一个文件;可指定 -o 指定 patch 的存放目录;
3. 应用patch
先检查patch文件:
git apply --stat xxx.patch
检查能否应用成功
git apply --check xxx.patch
打补丁:
git apply xxx.patch
如果应用 patch 出现问题:
比如,一个典型的git apply失败,可能是这样的:
正如你所见,如果冲突发生,git只是输出上述信息,然后就停下来。一个小冲突会导致整个patch都不会被集成。
4. 冲突解决
当我们打补丁出现冲突的时候,这个时候需要我们手动解决冲突。
首先,执行以下命令,自动合入 patch 中不冲突的代码,同时保留冲突的部分
git apply --reject xxxx.patch
同时会生成后缀为 .rej 的文件,保存没有合并进去的部分的内容,可以参考这个进行冲突解决。
题外话
在实际开发当中,我们 apply patch 的时候,通常会使用 git 图形工具,因为一旦产生冲突,解决比较方便,比较常用的 git 工具有 sourceTree, TortoiseGit(小乌龟)。
Git 补丁— diff 和 patch 使用详解相关推荐
- Git补丁简单用法介绍(打补丁.diff 和 .patch 和 git apply、git am应用)
打补丁.diff 和 .patch 和 git apply.git am应用 生成patch git format-patch -M master 生成指定patch,afc425592dc7dde9 ...
- 容器编排技术 -- Kubernetes kubectl patch 命令详解
容器编排技术 -- Kubernetes kubectl patch 命令详解 1 kubectl patch 2 语法 3 示例 4 Flags kubectl patch 使用(patch)补丁修 ...
- Git学习系列之Git基本操作提交项目(图文详解)
前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...
- 【经验之谈】Git使用之TortoiseGit配置VS详解
2019独角兽企业重金招聘Python工程师标准>>> [经验之谈]Git使用之TortoiseGit配置VS详解 转载于:https://my.oschina.net/u/1416 ...
- Git实战:branch分支操作详解
什么是分支 分支是指在主干道上分支的支线,可以前往不同的地方,也可以到达相同的终点(只是实现的路线不同).Git指向团队开发中的个体,各开发者可以有自己的分支,开发时不会影响其他分支的开发进度.分支完 ...
- git 主干修改合并到分支_idea+git合并分支解决冲突及详解步骤
Git分支详解参考: 分支管理组成 1.1.master主干 在版本管理中,代码库应该仅有一个主干.此主干是和当前生产保持一致的,是可用的.稳定的可直接发布的版本,不能再主干上进行任何开发操作.git ...
- 远程服务器如何创建分支,Git 创建分支提交远程分支详解
搜索热词 Git 创建分支提交远程分支详解 1.创建本地分支 git branch 分支名,例如:git branch 2.0.1.20120806 注:2.0.1.20120806是分支名称,可以随 ...
- git apply、git am打补丁.diff 和 .patch
前提: 生成patch: git format-patch -M master 生成指定patch,0163bed3bf59ae74c36cc5138b4c24f1556d8304是commit id ...
- git checkout 命令所有参数用法详解
阅读这篇文章你将得到什么? git 命令的帮助文档获取 git checkout 命令系统知识详解,所有参数哟 怎么系统学习一个git 命令 根据git 的帮助一步步的撸下去,这样够全吧 获取参考手册 ...
最新文章
- MySQL · 引擎分析 · InnoDB行锁分析
- sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并自定义子分类器的权重(weights)、计算融合模型的混淆矩阵、可视化混淆矩阵
- 深入理解 runtime
- i2c通信 msp430g2553_请教 AD7150 + MSP430G2553 i2C通讯问题该如何编码??
- 【C 语言】内存四区原理 ( 栈内存属性增长方向 | 栈内存开口方向 | 代码示例 )
- HTML5-canvas实例:刮刮乐游戏
- 【专访】PP租车孙览江:与有梦想的人一拍即合,PM都有改变世界的小情怀
- 可以操作excel吗_Excel快速填充,这四种方法你会吗?操作逆天告别加班
- 用上Latex实现编辑伪代码
- VB 判断是否文本文件
- Application Wizard生成的项目文件简介
- 电脑桌面天气计算机备忘录,有什么桌面软件可以显示:时间,天气,还有备忘录的?...
- 当不知轴承型号时如何寻找轴承故障频率_电机轴承的故障诊断与失效分析
- kettle Call From LAPTOP-14BPR3NI/192.168.1.2 to locahost:8020 failed on connection
- Cisco IGRP
- 怎么去掉WIN7窗口文本框中淡绿色的底色
- 求n的阶乘并显示过程
- Bugku web(1—35)
- Spine动画动态切换模型显示
- 新项目用到了AM5728芯片