当前位置: 首页 > news >正文

git 生成 Patch 和打 Patch

在程序员的日常开发与合作过程中,对于 code 的生成 patch 和打 patch (应用 patch) 成为经常需要做的事情。

使用方法(直接给一些 examples):

1. 生成 patch

1.1 git diff > xxx.patch

#只想 patch Test.java 文件
git diff Test.java > test.patch
# 把所有的修改文件打成 patch
git diff > test.patch

1.2.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 <r1>..<r2>  #生成两个commit间的修改的patch(包含两个commit. <r1>和<r2>都是具体的commit号)
$ git format-patch -1 <r1>     #生成单个commit的patch
$ git format-patch <r1>        #生成某commit以来的修改patch(不包含该commit)
$ git format-patch --root <r1> #生成从根到r1提交的所有patch

2, 应用 patch

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

2.1 检查 patch 的情况

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

2.2 使用 git diff 生成的 patch

$ git apply xxx.patch

2.3 使用 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

2.4 打 Patch 的过程中发生了冲突

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

2.4.1 方案一(个人推荐):

(1) 根据 git am 失败的信息,找到发生冲突的具体 patch 文件,然后用命令 git apply --reject <patch_name>,强行打这个 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

2.4.2 方案二:

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

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

http://www.xdnf.cn/news/1330759.html

相关文章:

  • 在完全没有无线网络(Wi-Fi)和移动网络(蜂窝数据)的环境下,使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本2)
  • 汽车ECU实现数据安全存储(机密性保护)的一种方案
  • 网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!
  • uni-app跨端开发最后一公里:详解应用上架各大应用商店全流程
  • 云计算学习100天-第26天
  • 《CDN加速的安全隐患与解决办法:如何构建更安全的网络加速体系》
  • 【Ansible】变量、机密、事实
  • Ubuntu-安装Epics Archiver Appliance教程
  • ansible playbook 实战案例roles | 实现基于firewalld添加端口
  • 如何使用matlab将目录下不同的excel表合并成一个表
  • 四川方言语音识别数据集,1500小时合规真人采集,高质量标注助力ASR与大模型训练
  • CISP-PTE之路--10文
  • java17学习笔记
  • python numpy.random的基础教程(附opencv 图片转数组、数组转图片)
  • cv2.bitwise_and是 OpenCV 中用于执行按位与运算的核心函数,主要用于图像处理中的像素级操作
  • 计算机视觉 图片处理 在骨架化过程中,每次迭代都会从图像的边缘移除一层像素,直到只剩下单像素宽度的骨架
  • 【图像算法 - 19】慧眼识苗:基于深度学习与OpenCV的大棚农作物生长情况智能识别检测系统
  • Kubernetes集群安装部署--flannel
  • InnoDB为什么使用B+树实现索引?
  • 从繁琐到优雅:Java Lambda 表达式全解析与实战指南
  • 【Spring Boot把日志记录到文件里面】
  • sfc_os!SfcQueueValidationRequest函数分析之sfc_os!IsFileInQueue
  • Android面试指南(三)
  • STM32学习笔记15-SPI通信软件控制
  • 《Java 多线程全面解析:从基础到生产者消费者模型》
  • InfoNES模拟器HarmonyOS移植指南
  • 从数据孤岛到实时互联:Canal 驱动的系统间数据同步实战指南
  • 排查Redis数据倾斜引发的性能瓶颈
  • python学习DAY46打卡
  • 迁移学习(Transfer Learning)