热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gitapply、gitam打补丁.diff和.patch【转】

本文转载自:https:www.jianshu.compe5d801b936b6前提:生成patch:gitformat-patch-Mmaster

本文转载自:https://www.jianshu.com/p/e5d801b936b6

前提:

生成patch:
git format-patch -M master
生成指定patch,0163bed3bf59ae74c36cc5138b4c24f1556d8304是commit id,-1是指从当前id开始,向下提交次数,包含此次且计数从1开始。
也就是说,我想要打出0163bed3bf59ae74c36cc5138b4c24f1556d8304当前的patch,则:
git format-patch 0163bed3bf59ae74c36cc5138b4c24f1556d8304 -1
想要打出0163bed3bf59ae74c36cc5138b4c24f1556d8304和它之前的一次提交的patch,则:
git format-patch 0163bed3bf59ae74c36cc5138b4c24f1556d8304 -2
生成diff:
git diff (id1) (id2) --binary --(path) > 目标文件路径
比如要生成frameworks/base/下的diff,保存到~/gittest/下的f_b.diff:(注意:旧的id1在前)
git diff 206b47c132a80870c06d87c69a548bbfeebecd2d b5ce3e4ebe9503e370d734cecc12482bca023fdf --binary -- frameworks/base/ > ~/gittest/f_b.diff

打入 patch / diff:
git apply xxx.patch
git apply xxx.diff
检查 patch / diff:
git apply --check xxx.patch
git apply --check xxx.diff
若git和需要打patch的文件不在一个目录:(git在framework下,patch要打入frameworks/base/下)
git apply --check --directory=base/ xxx.patch
git apply --directory=base/ xxx.patch
** git am 后面会说到,以及生产patch和打入patch的一些命令参数**

  1. 我们创建一个文件夹,git init一下,模拟diff / patch源环境
$ mkdir gittest
$ git init
  1. 然后创建一个空文件 test,然后首次提交
$ touch test
$ git add .
$ git commit -m "test init" 
  1. 在里面加入11111,add,commit(add 11111)一次;
    在里面加入22222,add,commit(add 22222)一次;
    ...
    在里面加入55555,add,commit(add 55555)一次;
    一共提交5次,可以看到提交了5次。
 
gitk

生成patch / diff 文件(我们单独建一个文件夹来存patch和diff --> ~/patch/patch/):

在工作中,二者选一个就可以,看自己的需求。
patch相对于diff,多了提交记录,也就是说可以原封不动的把他人commit内容写上去,但是操作比diff麻烦一些

  • ** 生成patch:**
    我们记录一下最新的commit id : 21ebfb1ef6a0a9b56d46036c036e8377b56b2da5,有5次提交。
$ git format-patch 21ebfb1ef6a0a9b56d46036c036e8377b56b2da5 -5 
 
git patch

生成了包含当前id和之前的4个id的patch,一共5个,命名也有规律000X+commit的内容.patch
我们把这5个移到~/patch/patch/中。

  • ** 生成diff:**
    我们记录要生成diff的区间,!!包上不包下!!

就是说我要生成 11111~55555的diff
id1 是 test init的id;1cf68afcf3e089a349c8ee534dc3ff44d11a6624
id2是add 55555的id。21ebfb1ef6a0a9b56d46036c036e8377b56b2da5

$ git diff 1cf68afcf3e089a349c8ee534dc3ff44d11a6624 21ebfb1ef6a0a9b56d46036c036e8377b56b2da5 --binary -- . > ~/patch/patch/test.diff

diff 多次提交可以是一个文件,但是patch不行,因为它里面有commit记录!

打 patch / diff 补丁(无冲突):

我们在当前目录创建一个需要打补丁的文件夹(gittest1),里面也有一个空的test文件。
然后我们把patch/diff打入gittest1/test。
执行最开始的1、2即可,改一下文件夹名称就ok

 
gittest1
  • 打patch(不包含commit内容)
    1. 检查patch是否可用,没显示文字,就说明可用,且无冲突;
      git apply --check ~/patch/patch/0001-add-11111.patch
      一般检查一个就可以。
    2. 打入patch,可以批量,也可以单个。
      git apply ~/patch/patch/*.patch
    3. 肯定会成功,因为没有冲突。我们查看一下
      git diff

 

 
git diff

5个patch都打上去了,接着就可以 git add / commit提交了。 但是这样没有commit记录。

 

  • 打patch(包含commit内容 git am git checkout . 撤销一下
    1. 检查patch是否可用,没显示文字,就说明可用,且无冲突;
      git apply --check ~/patch/patch/0001-add-11111.patch
    2. 打入patch,可以批量,也可以单个。
      ** git am ~/patch/patch/*.patch **
    3. 肯定会成功,因为没有冲突。我们查看一下
       
       

      gitk
 
gitk

我们发现已经自动commit,不用add、commit,可以直接push。

  • **打diff ** git reset --hard 4c6eb312e94214a5f34fa3f119382ace647b1b3c 撤销一下
    1. 检查diff是否可用,没显示文字,就说明可用,且无冲突;
      git apply --check ~/patch/patch/test.diff
    2. 打入diff;
      git apply ~/patch/patch/test.diff
    3. 肯定会成功,因为没有冲突。我们查看一下
      git diff

 

 
git diff

接着就可以 git add / commit提交了。 但是这样没有commit记录。

 

打 patch / diff 补丁(有冲突):

我们还原gittest1/test的初始状态,然后修改一下test文件,写入00000,,然后add、commit。

 
add 00000
  • 打patch
    1. 检查patch是否可用,没显示文字,就说明可用,且无冲突;
      git apply --check ~/patch/patch/0001-add-11111.patch

error: 打补丁失败:test:0
error: test:补丁未应用

说明是可以用,但是有冲突。
  2. 打入patch,可以批量,也可以单个。 > 因为在check的时候知道已经有冲突了,就不好用apply来打patch,如果一定要用的话,建议一个一个apply,所以很麻烦,不如用diff。 在这里要用到 **git am** ** `` git am ~/patch/patch/*.patch `` ** 

正应用:add 11111
error: 打补丁失败:test:0
error: test:补丁未应用
补丁失败于 0001 add 11111
失败的补丁文件副本位于:
/home/deshui/yudeshui/log/gittest1/.git/rebase-apply/patch
当您解决了此问题后,执行 "git am --continue"。
如果您想跳过此补丁,则执行 "git am --skip"。
要恢复原分支并停止打补丁,执行 "git am --abort"。

这行话告诉你,patch冲突了,但是有三个选项 ``git am --continue``、``git am --skip``、``git am --abort`` ** 这时候不要动!不要动!不要动!** 1. 解决冲突。 > **我们 `` gedit test ``,在里面手动加入11111**,因为我们加入了00000,导致错行,所以接下来的4个patch都会有冲突。 2. 提交记录。 `` git add test `` `` git am --continue `` 

正应用:add 11111
正应用:add 22222
error: 打补丁失败:test:1
error: test:补丁未应用
补丁失败于 0002 add 22222
失败的补丁文件副本位于:
~/gittest1/.git/rebase-apply/patch
当您解决了此问题后,执行 "git am --continue"。
如果您想跳过此补丁,则执行 "git am --skip"。
要恢复原分支并停止打补丁,执行 "git am --abort"。

我们``gitk``一下,发现已经commit已经有add 11111的记录了! ** 同上操作,一直修改到44444 ** `` git add test `` `` git am --continue `` 

正应用:add 44444
正应用:add 55555

这样就完整的解决冲突,保留commit了。

![git am finish](http://upload-images.jianshu.io/upload_images/3153157-f2a6520f1ed25382.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - **打diff ** ``git reset --hard 0050cda7f22df985d79b9b98da9bfc282ea10ef1 `` 撤销到add 00000 1. 检查diff是否可用,肯定有冲突。 `` git apply --check ~/patch/patch/test.diff `` 

error: 打补丁失败:test:0
error: test:补丁未应用

  2. 打入diff; `` git apply --reject --ignore-whitespace ~/patch/patch/test.diff 2>&1 | tee ~/patch/patch/testdiff.log`` 

这里reject是生成一个.rej的文件,是一个差异文件。
ignore-whitespace是忽略多余的空格。
2>&1是值错误信息
tee 错误信息输出到控制台
~/patch/patch/testdiff.log 错误信息保存在这个文件里
*********输出log**********
检查补丁 test...
error: 当查询:
error: 打补丁失败:test:0
应用 test 个补丁,其中 1 个被拒绝...
拒绝第 #1 个片段。
*********输出log**********

  3. 这时候我们发现,文件夹多了一个test.rej的文件,打开它。 

diff a/test b/test (rejected hunks)
@@ -0,0 +1,5 @@
+11111
+22222
+33333
+44444
+55555

这个告诉我们,要在test中加入的信息,我们打开test补上就可以了。手动! 然后add / commit 就可以了。 ###END 
Git


作者:yotods
链接:https://www.jianshu.com/p/e5d801b936b6
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

推荐阅读
  • 基于Web的Kafka管理工具Kafkamanager首次访问Web界面的详细配置指南(附图解)
    首次访问Kafkamanager Web界面时,需要对Kafka集群进行配置。这一过程相对简单,用户只需依次点击【Cluster】>【Add Cluster】,按照提示完成相关设置即可。本文将通过图文并茂的方式,详细介绍每一步的配置步骤,帮助用户快速上手Kafkamanager。 ... [详细]
  • Git命令基础应用指南
    本指南详细介绍了Git命令的基础应用,包括如何使用`git clone`从远程服务器克隆仓库(例如:`git clone [url/path/repository]`)以及如何克隆本地仓库(例如:`git clone [local/path/repository]`)。此外,还提供了常见的Git操作技巧,帮助开发者高效管理代码版本。 ... [详细]
  • 本文详细介绍了在 Android 7.1 系统中调整屏幕分辨率和默认音量设置的方法。针对系统默认音量过大的问题,提供了具体的步骤来降低系统、铃声、媒体和闹钟的默认音量,以提升用户体验。此外,还涵盖了如何通过系统设置或使用第三方工具来优化屏幕分辨率,确保设备显示效果更加清晰和流畅。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • Flutter 开发中集成极光推送的详细步骤
    本文详细介绍了如何在 Flutter 项目中集成极光推送服务,包括配置和测试的具体步骤。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • Git核心命令全解析:掌握日常开发必备技能
    本文深入解析了 Git 的核心命令,帮助开发者掌握日常开发中的必备技能。从 `git init` 命令开始,介绍了如何将当前目录转变为 Git 可管理的仓库。接着详细讲解了 `git add` 命令的使用方法,包括如何将文件(如 `readme.txt`)添加到暂存区,以便在后续提交时进行版本控制。此外,还探讨了其他关键命令,如 `git commit` 和 `git push`,以确保代码变更能够安全地保存和同步到远程仓库。通过这些命令的综合应用,开发者可以更加高效地管理和协作项目。 ... [详细]
  • MyISAM和InnoDB是MySQL中最为广泛使用的两种存储引擎,每种引擎都有其独特的优势和适用场景。MyISAM引擎以其简单的结构和高效的读取速度著称,适用于以读操作为主、对事务支持要求不高的应用。而InnoDB引擎则以其强大的事务处理能力和行级锁定机制,在需要高并发写操作和数据完整性的场景下表现出色。选择合适的存储引擎应综合考虑业务需求、性能要求和数据一致性等因素。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 使用 `git stash` 可以将当前未提交的修改保存到一个临时存储区,以便在后续恢复工作目录时使用。例如,在处理中间状态时,可以通过 `git stash` 命令将当前的所有未提交更改推送到一个新的储藏中,从而保持工作目录的整洁。此外,本文还将详细介绍如何解决 `git stash pop` 时可能出现的冲突问题,帮助用户高效地管理代码变更。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有