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 使用详解相关推荐

  1. Git补丁简单用法介绍(打补丁.diff 和 .patch 和 git apply、git am应用)

    打补丁.diff 和 .patch 和 git apply.git am应用 生成patch git format-patch -M master 生成指定patch,afc425592dc7dde9 ...

  2. 容器编排技术 -- Kubernetes kubectl patch 命令详解

    容器编排技术 -- Kubernetes kubectl patch 命令详解 1 kubectl patch 2 语法 3 示例 4 Flags kubectl patch 使用(patch)补丁修 ...

  3. Git学习系列之Git基本操作提交项目(图文详解)

    前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...

  4. 【经验之谈】Git使用之TortoiseGit配置VS详解

    2019独角兽企业重金招聘Python工程师标准>>> [经验之谈]Git使用之TortoiseGit配置VS详解 转载于:https://my.oschina.net/u/1416 ...

  5. Git实战:branch分支操作详解

    什么是分支 分支是指在主干道上分支的支线,可以前往不同的地方,也可以到达相同的终点(只是实现的路线不同).Git指向团队开发中的个体,各开发者可以有自己的分支,开发时不会影响其他分支的开发进度.分支完 ...

  6. git 主干修改合并到分支_idea+git合并分支解决冲突及详解步骤

    Git分支详解参考: 分支管理组成 1.1.master主干 在版本管理中,代码库应该仅有一个主干.此主干是和当前生产保持一致的,是可用的.稳定的可直接发布的版本,不能再主干上进行任何开发操作.git ...

  7. 远程服务器如何创建分支,Git 创建分支提交远程分支详解

    搜索热词 Git 创建分支提交远程分支详解 1.创建本地分支 git branch 分支名,例如:git branch 2.0.1.20120806 注:2.0.1.20120806是分支名称,可以随 ...

  8. git apply、git am打补丁.diff 和 .patch

    前提: 生成patch: git format-patch -M master 生成指定patch,0163bed3bf59ae74c36cc5138b4c24f1556d8304是commit id ...

  9. git checkout 命令所有参数用法详解

    阅读这篇文章你将得到什么? git 命令的帮助文档获取 git checkout 命令系统知识详解,所有参数哟 怎么系统学习一个git 命令 根据git 的帮助一步步的撸下去,这样够全吧 获取参考手册 ...

最新文章

  1. MySQL · 引擎分析 · InnoDB行锁分析
  2. sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并自定义子分类器的权重(weights)、计算融合模型的混淆矩阵、可视化混淆矩阵
  3. 深入理解 runtime
  4. i2c通信 msp430g2553_请教 AD7150 + MSP430G2553 i2C通讯问题该如何编码??
  5. 【C 语言】内存四区原理 ( 栈内存属性增长方向 | 栈内存开口方向 | 代码示例 )
  6. HTML5-canvas实例:刮刮乐游戏
  7. 【专访】PP租车孙览江:与有梦想的人一拍即合,PM都有改变世界的小情怀
  8. 可以操作excel吗_Excel快速填充,这四种方法你会吗?操作逆天告别加班
  9. 用上Latex实现编辑伪代码
  10. VB 判断是否文本文件
  11. Application Wizard生成的项目文件简介
  12. 电脑桌面天气计算机备忘录,有什么桌面软件可以显示:时间,天气,还有备忘录的?...
  13. 当不知轴承型号时如何寻找轴承故障频率_电机轴承的故障诊断与失效分析
  14. kettle Call From LAPTOP-14BPR3NI/192.168.1.2 to locahost:8020 failed on connection
  15. Cisco IGRP
  16. 怎么去掉WIN7窗口文本框中淡绿色的底色
  17. 求n的阶乘并显示过程
  18. Bugku web(1—35)
  19. Spine动画动态切换模型显示
  20. 新项目用到了AM5728芯片

热门文章

  1. 关于电脑和传真机连接的问题
  2. C#控制台应用程序:剪刀石头布
  3. Linux下的压缩解压缩命令详解
  4. CrystalReport水晶报表创建子报表
  5. 推荐几个使用java SpringBoot开发的cms系统
  6. c语言函数写巴德歌赫猜想,高三励志演讲稿:青春无悔
  7. 深圳—顺德—广州—深圳
  8. 情人节来了,什么甜言蜜语最好!我用Python分析几千条情话告诉你答案
  9. Python办公自动化学习笔记(二)—Python语法基础
  10. 有了台湾三巨散热风扇,机械设备散热不再是难题!