git apply、git am打补丁.diff 和 .patch【转】
本文转载自: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的一些命令参数**
- 我们创建一个文件夹,git init一下,模拟diff / patch源环境
$ mkdir gittest
$ git init
- 然后创建一个空文件 test,然后首次提交
$ touch test
$ git add .
$ git commit -m "test init"
- 在里面加入11111,add,commit(add 11111)一次;
在里面加入22222,add,commit(add 22222)一次;
...
在里面加入55555,add,commit(add 55555)一次;
一共提交5次,可以看到提交了5次。
生成patch / diff 文件(我们单独建一个文件夹来存patch和diff --> ~/patch/patch/):
在工作中,二者选一个就可以,看自己的需求。
patch相对于diff,多了提交记录,也就是说可以原封不动的把他人commit内容写上去,但是操作比diff麻烦一些
- ** 生成patch:**
我们记录一下最新的commit id : 21ebfb1ef6a0a9b56d46036c036e8377b56b2da5,有5次提交。
$ git format-patch 21ebfb1ef6a0a9b56d46036c036e8377b56b2da5 -5
生成了包含当前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
- 打patch(不包含commit内容)
- 检查patch是否可用,没显示文字,就说明可用,且无冲突;
git apply --check ~/patch/patch/0001-add-11111.patch
一般检查一个就可以。 - 打入patch,可以批量,也可以单个。
git apply ~/patch/patch/*.patch
- 肯定会成功,因为没有冲突。我们查看一下
git diff
- 检查patch是否可用,没显示文字,就说明可用,且无冲突;
5个patch都打上去了,接着就可以 git add / commit
提交了。但是这样没有commit记录。
- 打patch(包含commit内容
git am
)git checkout .
撤销一下- 检查patch是否可用,没显示文字,就说明可用,且无冲突;
git apply --check ~/patch/patch/0001-add-11111.patch
- 打入patch,可以批量,也可以单个。
**git am ~/patch/patch/*.patch
** - 肯定会成功,因为没有冲突。我们查看一下
gitk
- 检查patch是否可用,没显示文字,就说明可用,且无冲突;
我们发现已经自动commit,不用add、commit,可以直接push。
- **打diff **
git reset --hard 4c6eb312e94214a5f34fa3f119382ace647b1b3c
撤销一下- 检查diff是否可用,没显示文字,就说明可用,且无冲突;
git apply --check ~/patch/patch/test.diff
- 打入diff;
git apply ~/patch/patch/test.diff
- 肯定会成功,因为没有冲突。我们查看一下
git diff
- 检查diff是否可用,没显示文字,就说明可用,且无冲突;
接着就可以 git add / commit
提交了。但是这样没有commit记录。
打 patch / diff 补丁(有冲突):
我们还原gittest1/test的初始状态,然后修改一下test文件,写入00000,,然后add、commit。
- 打patch
- 检查patch是否可用,没显示文字,就说明可用,且无冲突;
git apply --check ~/patch/patch/0001-add-11111.patch
- 检查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
作者:yotods
链接:https://www.jianshu.com/p/e5d801b936b6
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
git apply、git am打补丁.diff 和 .patch【转】的更多相关文章
- git format-patch & git apply & git clean
一.打补丁 git format-patch & git apply 最近在工作中遇到打补丁的需求,一来觉得直接传文件有些low(而且我尝试了一下,差点把项目代码毁了) ,二来也是想学习一下, ...
- git diff 生成patch, git apply patch 打补丁方法说明,以及分支管理的简单操作。
git diff 简易操作说明 先git log 查看commit ID, 记录你想要打的补丁的ID 比如说: git log commit 4ff35d800fa62123a28b7bda2a04e ...
- git apply failed (转载)
转自:http://blog.csdn.net/aaronzzq/article/details/6955893 git version 1.6.0.4 几个新手刚刚开始接触 Git,为了维护核心仓库 ...
- svn/git的diff、patch
svn/git的diff.patch 前几天,正当我突突的写代码,企业微信嘀嘀一声响”在不,过来帮我看个bug”.本人一向助人为乐,高兴的冲了过去,然后就开始了一段长达1分钟的问题描述.很明显,此同学 ...
- Git:git diff 命令详解
工作目录 vs 暂存区 $ git diff <filename> 意义:查看文件在工作目录与暂存区的差别.如果还没 add 进暂存区,则查看文件自身修改前后的差别.也可查看和另一分支的区 ...
- git命令——git status、git diff
前言 当对项目做了更改时,我们通常需要知道具体改了哪些文件,哪些文件更改了没有暂存,哪些文件改了并且已加入到暂存区等待下次commit.上述任务使用git status都可以帮我们解决.但是想要知道文 ...
- 从VSS到SVN再到Git 记Git的基本操作
Source code control 一直是软件开发过程中重要的环节,从最初的纯文件备份,到使用工具进行管理.Source code control 工具的作用也不仅仅只是单纯的对同一个版本进行管理 ...
- 自定义 Git - 配置 Git
用git config配置 Git,要做的第一件事就是设置名字和邮箱地址: $ git config --global user.name "John Doe" $ git con ...
- git使用,Git的skil-map,git配置http/https/socks5代理
. 检出.克隆库: git clone git://git.openwrt.org/openwrt.git 2. git查看某个文件的修改历史 git log --pretty=oneline 文件名 ...
随机推荐
- 使用腾讯互动直播 遇到的坑 'GLIBC_2.14' not found 问题解决
第一.查看系统glibc版本库 strings /lib64/libc.so.6 |grep GLIBC_ 这里我们可以看到系统中最新的版本是2.12,这里我们升级2.14. 第二.下载和安装glib ...
- Hubtown
Hubtown 时间限制: 10 Sec 内存限制: 256 MB 题目描述 Hubtown is a large Nordic city which is home to n citizens. ...
- Codeforces 432D Prefixes and Suffixes kmp
手动转田神的大作:http://blog.csdn.net/tc_to_top/article/details/38793973 D. Prefixes and Suffixes time limit ...
- Spring 定时器 定时访问数据库并发送邮件
我这里有两个案例的方法: 第一种:使用Spring quartz: 我这里使用的jar:spring-context-support.jar.quartz-1.6.5.jar ============ ...
- AIO
IBM® 市场 (英文) 提交 我的 IBM 站点导航 学习 开发 社区 学习 Java technology 内容 概览 简单介绍 Asynchronous I/O 开始简单的异步 I/ ...
- SpringBoot中mybatis的自动生成
1.在pom文件中加入自动生成的插件 <!-- mybatis generator 自动生成代码插件 --> <plugin> <groupId>org.mybat ...
- Ubuntu 16.04安装Mac OS 12虚拟机资源(没成功,但资源还是可以用)
整理的Mac OS 12虚拟机资源.装虚拟机基本是按这样的套路: 1.先装VM 2.破解VM使其支持Mac OS 12,这个脚本基本是全平台支持,可以看里面的教程文档. 3.用镜像安装系统. 资源: ...
- Word文档转Markdown插件(Windows)
在线的转换,Shell脚本的转换都试过了,都没有原生Word文档集成的插件转换这么好用,并且没有Bug. 下载:http://www.writage.com/
- go语言学习之路五:Go语言内存分配机制make&new
Go有两种分配内存的机制,规则很简单,下面来简单介绍一下.1.new函数New()函数可以给一个值类型的数据分配内存(不知道什么是值类型请前往切片那一部分),调用成功后返回一个初始化的内存块指针,同时 ...
- Linux线上系统程序debug思路及方法
http://blog.csdn.net/wangzuxi/article/details/44766221