Git 补丁— diff 和 patch 使用详解

2023-11-07

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(小乌龟)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git 补丁— diff 和 patch 使用详解 的相关文章

  • 让 TeXstudio 在 linux mint 中工作:找不到文件“url.sty”。

    刚刚切换到 Linux Mint 以前的顽固 Windows 用户 我在尝试安装 TeXstudio 时遇到一些问题 Sudo apt get install texstudio 给了我一个正确的安装 至少 我是这么认为的 但是当我尝试构建
  • Gitlab 备份错误:包对象因信号 9 死亡

    我有一个存储库 有 2 个分支 大小为 3 5GB 每个分支大约 1 5GB git 本身就有 700MB 这是错误 备份失败 失败的 失败 opt gitlab embedded bin git git dir mountdata git
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • 如果 git 凭证管理器显示令牌,它如何安全

    I have credential helper manager core 这是 Windows 凭据管理器的新助手 我不明白如果你可以让 git 显示你的凭据 它如何安全git credential fill 重现步骤 通过执行命令确认凭
  • 如何从暂存区删除单个文件(撤消 git add)?

    情况 我有一个 Git 存储库 其中文件已在索引中 我对几个文件进行了更改 打开 Git 并使用 git add 将这些文件添加到我的暂存区域 问题 如何从暂存区域中删除这些文件之一 但不将其从索引中删除或撤消对文件本身的更改 如果我正确理
  • 如何在 Windows 上应用差异补丁?

    有很多程序可以创建差异补丁 但我在尝试应用一个程序时遇到了很大的困难 我正在尝试分发补丁 但用户向我询问了如何应用该补丁 于是我尝试自己弄清楚 结果发现我毫无头绪 而且我能找到的大多数工具都是命令行的 我可以处理命令行 但是如果没有一个漂亮
  • 使用 ssh-keygen 创建 SSH 密钥不会创建 .ssh 文件夹

    我正在尝试使用 msysgit 创建我的公共 私有 rsa 密钥对 我运行这个命令 ssh keygen C email protected cdn cgi l email protection t rsa 一切看起来都很好 我收到消息了
  • 为什么我的 Dockerfile CMD 不起作用?

    所以在我的 Dockerfile 的末尾我有这样的内容 WORKDIR home CMD django admin startproject whattt CMD bin bash 当我创建映像然后运行容器时 一切都按预期运行 没有错误 D
  • git Push Remote:警告:hooks.mailinglist 有多个值

    我刚刚从使用 gitosis 升级到 gitolite 电子邮件通知适用于所有存储库 但对于 gitolite admin 存储库 我在推送时收到此警告 推送很好 git push remote warning hooks announce
  • Git:repo 包含一个空目录 - 会发生什么?

    Git 跟踪文件 而不是目录 https stackoverflow com questions 5091017 和我们目前不能add空目录 https stackoverflow com questions 11600188 The 标准
  • Web 应用程序的带宽和流量模拟器?

    您能否建议如何创建一个测试环境来模拟 Web 应用程序中的各种类型的带宽和流量 或者也许是一个针对本地主机执行此操作的开源程序 我认为在编写网络应用程序时这是一个非常重要的主题 但这不是一个常见的主题 我能想象创建这种环境的唯一方法是在本地
  • 无法让 TeamCity 使用默认私钥向 GitHub 进行身份验证

    我正在尝试让 TeamCity 构建我的私人 GitHub 存储库 当我显式设置密钥文件的路径时 我能够成功让我的 VCS 根通过连接测试 然而 尽管进行了大量的谷歌搜索 当我使用 默认私钥 选项时 我无法让它工作 我明白了com jcra
  • Sublime Text 2 的 git 提交错误[重复]

    这个问题在这里已经有答案了 我正在 Udacity 上学习 如何使用 Git 和 GitHub 课程 我正在按照示例进行操作 但遇到了问题 我自己尝试通过谷歌搜索和反复试验来解决问题大约两个小时 我认为是时候在 StackOverflow
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • Git合并策略:空格使默认显示不冲突并带来意想不到的结果

    经过多次试验 我得到了这个简单的测试用例场景 a gt b gt c master gt d gt b gt e branch Where b 是樱桃精选b e is a merge from master b 之后完成c and c对相同
  • 将 git dcommits 切换到 svn 分支

    I had master dcommit到 和rebase来自 颠覆trunk 我创建了一个中间 Subversion 分支tc 合并来自 2 个不同分支的更改 使用 git branch master git svn branch tc
  • 如何使用和理解wso2 git仓库?

    我刚刚开始对wso2感兴趣 我正在寻找移动设备管理解决方案 所以我测试了 wso2 EMM 但我发现了一些限制 我想知道是否可以自己实现 我的问题是我完全迷失在 wso2 git 存储库中 有没有我错过的指导书或逻辑 如果有人帮助我解决这个
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例

随机推荐

  • 网络渗透测试——MAC泛洪攻击

    使用Kali虚拟机对eNSP模拟交换机进行MAC地址泛洪攻击 一 攻击效果 交换机向所有端口转发 泛洪 从而截取数据包 二 攻击原理 攻击者 kali虚拟机 向eNSP模拟的交换机发送大量不同Mac地址的无用的数据包 占满该交换机的MAC地
  • 【css】纯css实现图片发光效果

    html div class box h1 我是图片 h1 div css 初始化 取消页面元素的内外边距 padding 0 margin 0 body 弹性布局 让页面元素垂直 水平居中 display flex justify con
  • 配置Windows10虚拟机并使用VMware tools共享文件

    下载VMware workstation Download VMware Workstation Prohttps www vmware com products workstation pro workstation pro evalua
  • matlab 特征选择算法,特征选择、特征提取matlab算法实现(模式识别)

    提供了模式识别特征选择和特征提取详尽的matlab算法代码实现 6 特征选择 6 1 问题 对 threethreelarge m 数据 采用任意一种特征选择算法 选择2个特征 6 2 思路 采用简单特征选择法 simple feature
  • MySQL基本概念、PyMySQL操作及数据库事务操作

    目录 一 数据库概念及其分类 1 1数据库概念 1 2数据库分类 1 2 1关系型数据库 1 2 2 非关系型数据库 二 SQL Structured Query Lanaguage结构化查询语言 2 1SQL语言分类 2 2 SQL语句常
  • 学习记录(C语言)

    一 初识转义字符 转义字符有哪些 其中 表示打印一个单独的单引号或者双引号 n表示换行 t相当于tab键 ddd ddd表示1 3个八进制数字例如打印 130 八进制的130相当于十进制的88再对照ASCII码表88对应的符号为X 同理 x
  • Python网络爬虫原理及实践

    作者 京东物流 田禹 1 网络爬虫 网络爬虫 是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 网络爬虫相关技术和框架繁多 针对场景的不同可以选择不同的网络爬虫技术 2 Scrapy框架 Python 2 1 Scrapy架构 2
  • windows 安装 yarn

    windows 安装 yarn 下载node js http nodejs cn download 通过 Chocolatey 安装 以管理员身份打开 cmd exe SystemRoot System32 WindowsPowerShel
  • 时间数组传到数据库

    1 数据库 有数据 想精确到时分秒 就写datatime 不想要就写data 2 vue页面 写一个数组 可以放 开始时间 结束时间 3 把dataRange数组的索引 0 赋给workTimeBegin 1 赋给workTimeEnd 这
  • 给exe添加管理员权限的几种方法&修改exe兼容性属性的方法

    有些程序我们必须以管理员权限才能运行 但是我们又不想 右键 gt 以管理员权限运行 那么我们就只有给exe增加管理员权限了 1 如果是vs编译的exe可以通过配置属性 项目 XXX 属性 配置属性 链接器 清单文件 然后重新编译 可以根据需
  • delphi .dfm文件汉字不显示_搞定Delphi模块化之Package

    Package的优点 应用程序可以被高度的模块化 而且可以逐渐交付完成的功能给客户 维护方便 可以只更新单一的模块功能 提升程序的载入速度 Package的缺点 有些情形下使用Package只能间接的方式取得资料 变量 类 Package
  • springboot项目上传文件过大导致java heap space 的问题解决方案(windows和linux)

    windows 点击项目 run as debug as Run Configuration Debug Configuration java application Arguments Xmx1024m Xms1024m XX NewRa
  • 万物云原生下的服务进化

    导读 在万物云原生下的环境下 Java的市场份额也因耗资源 启动慢等缺点 导致在云原生环境里被放大而降低 通过这篇文章 读者可以更好地了解如何在云原生环境下通过升级相关版本和使用GraalVM打出原生镜像到方式 优化Java应用的性能和资源
  • 【详细齐全】FIO使用方法 及参数解析(文章末尾)

    linux 使用FIO测试磁盘iops 方法详解 FIO是测试IOPS的非常好的工具 用来对硬件进行压力测试和验证 支持13种不同的I O引擎 包括 sync mmap libaio posixaio SG v3 splice null n
  • 安装fastdfs及java操作

    1 安装 libfastcommon git地址 https github com happyfish100 libfastcommon git 安装 git clone https github com happyfish100 libf
  • key-value数据库

    传统的文件系统中 需要维护目录的层次结构 使用dentry inode directory等复杂结构保存元数据的信息 而面对更多定制文件系统的需求 越来越多的系统考虑使用key value形式保存文件系统中的元数据信息 使用数据库来保存这些
  • Windows 安装完mysql 后 配置环境变量、重置密码、开启远程连接

    第一步 配置环境变量 系统变量 Path在最后一段添加 D ruanjian mysql 8 0 17 winx64 bin 这个是你安装mysql bin的位置 第二步用临时密码登录并重置密码 mysql gt mysql u root
  • yum默认安装位置及被占进程运行:/var/run/yum.pid 已被锁定,PID 为 4032 的另一个程序正在运行。

    yum install XX 默认安装位置是 usr lib64 在安装过程出现下面进程被占用 解决 rm f var run yum pid
  • 9个开源自动化测试框架,质量保证测试工程师用起来

    自动化测试框架由一组最佳实践 通用工具和库组成 可帮助测试人员评估多个Web和移动应用的功能 安全性 可用性和可访问性 而在 软件开发世界中有很多的自动化测试框架 该如何选择 虽然技术团队可以构建复杂的自动化测试框架 但是当可以选择现有的开
  • Git 补丁— diff 和 patch 使用详解

    Git 补丁 diff 和 patch 使用详解 1 diff 和 patch 的区别 2 生成patch 2 1 git diff 3 git format patch 3 应用patch 4 冲突解决 题外话 1 diff 和 patc