详解如何使用git 生成patch 和打入patch

平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用git 生成patch 给到我们,那我们就需要把客户给到patch 打入到我们的project ,基于这样一个场景,我把git 如何生成patch 和如何打入patch 做总结

生成patch 的方法:(我这里描述的生成patch 是根据commit 记录生成的)

1.例如首先先通过git log 查看有哪一些commit

2.把第一次commit 提交以后的(不包括第一次提交)都生成patch

如上图所示:使用命令:git format-patche795fefabc

然后生成的patch 文件如下图所示

打入patch 的方法:

把生成的patch 文件copy 到一个文件夹中来(这里我创建了patch 文件夹)。如下图所示

由于这些patch显然是用git format-patch来生成的,所以用git的工具应该就可以很好的做好。git am 就是作这件事情。

在使用git am之前, 你要首先git am --abort 一次,来放弃掉以前的am信息,这样才可以进行一次全新的am。
不然会遇到这样的错误。

.git/rebase-apply still exists but mbox given.

git am 可以一次合并一个文件,或者一个目录下所有的patch,如下图所示:

1 使用git format-patch生成所需要的patch:

当前分支所有超前master的提交:

git format-patch -M master

某次提交以后的所有patch:

git format-patch 4e16 --4e16指的是commit名

从根到指定提交的所有patch:

git format-patch --root 4e16

某两次提交之间的所有patch:

git format-patch 365a..4e16 --365a和4e16分别对应两次提交的名称

某次提交(含)之前的几次提交:

git format-patch –n 07fe --n指patch数,07fe对应提交的名称

故,单次提交即为:

git format-patch -1 07fe

git format-patch生成的补丁文件默认从1开始顺序编号,并使用对应提交信息中的第一行作为文件名。如果使用了-- numbered-files选项,则文件名只有编号,不包含提交信息;如果指定了--stdout选项,可指定输出位置,如当所有patch输出到一个文件;可指定-o <dir>指定patch的存放目录;

2应用patch:

先检查patch文件:git apply --stat newpatch.patch
检查能否应用成功:git apply --check newpatch.patch
打补丁:git am --signoff < newpatch.patch

(使用-s或--signoff选项,可以commit信息中加入Signed-off-by信息)

如果应用patch出现问题:

比如,一个典型的git am失败,可能是这样的:

$ git am PATCH
Applying: PACTH DESCRIPTION
error: patch failed: file.c:137
error: file.c: patch does not apply
error: patch failed: Makefile:24
error: libavfilter/Makefile: patch does not apply
Patch failed at 0001 PATCH DESCRIPTION
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".

正如你所见,如果冲突发生,git只是输出上述信息,然后就停下来。一个小冲突会导致整个patch都不会被集成。

处理这种问题的最简单方法是先使用 git am --abort,然后手动的添加此patch, patch -p1 < PATCH,手动解决掉代码冲突,最后使用 git commit -a 提交代码。但是这样做有个问题就是你会失去PATCH中原本包含的commit信息(比如From,Date,Subject,Signed-off-by等)。应该有一种更聪明的方法。

在 .git/rebase-apply 目录下,存放着相应的补丁文件,名字是“0001” (在更新的git版本中,存放补丁文件的目录名有所改变,这里使用的git版本是 1.7.4.1)。

事实上,你可以使用 git apply 命令打patch(git apply 是git中的patch命令)。如同使用 patch -p1 命令时一样,然后手动解决代码冲突(检视生成的 .rej 文件,与冲突文件比较,修改冲突内容,并最终把文件加入到index中):

$ git apply PATCH --reject
$ edit edit edit
(译注:根据.rej文件手动解决所有冲突)
$ git add FIXED_FILES
$ git am --resolved

就这么简单!

想多一些解释,好吧。git am 并不改变index,你需要使用 git apply --reject 打patch(保存在 .git/rebase-apply),手动解决代码冲突,(译注:使用 git status 列出所有涉及文件),把所有文件(不仅仅是引起冲突的文件)添加到(git add)index,最后告诉 git am 你已经解决(--resolved)了问题。这样做的好处是你不需要重新编辑commit信息。而且,如果你正在打的是一系列patch(就是说你在打的是多个patch,比如 git am *.patch)你不需要使用 git am --abort,然后又 git am。

参考资料:

Git-format-patch(1) - Linux man page

How to create and apply a patch with Git

到此这篇关于详解如何使用git 生成patch 和打入patch的文章就介绍到这了,更多相关git 生成patch 和打入patch内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Git 撤销操作、删除文件和恢复文件

    大致介绍 经过前面的学习,已经建立了版本库,并上传了文件,这次来学习对这些文件进行基本的操作,即: ◆ 撤销操作 ◆ 删除文件 ◆ 恢复文件 我在此之前,已经将三个文件提交到了版本库 撤销操作 撤销操作的语法: git checkout -- 文件名 撤销操作一般有两种情况: ◆ 文件修改后还没有提交到暂存区,进行撤销操作之后,文件恢复到和版本库中一模一样 ◆文件修改后提交到了暂存区,进行撤销之后,文件恢复到在提交到暂存区之前的状态 现在index.htm中的内容是: index.html 我们

  • Git如何修改远程仓库地址

    公司搬移, 作为git仓库的服务器IP地址变了. 本地代码挺多,重新检出太占时间,可以修改一个什么配置让我本地仓库和新的远程仓库建立关联吗, 答案是肯定的! 方法有很多,这里简单介绍几种: 以下均以项目git_test为例: 老地址:http://192.168.1.12:9797/john/git_test.git 新地址:http://192.168.100.235:9797/john/git_test.git 远程仓库名称: origin 方法一 通过命令直接修改远程地址 进入git_te

  • Git客户端图文详解 如何安装配置GitHub操作流程攻略

    Git介绍 分布式 : Git版本控制系统是一个分布式的系统, 是用来保存工程源代码历史状态的命令行工具; 保存点 : Git的保存点可以追踪源码中的文件, 并能得到某一个时间点上的整个工程项目额状态; 可以在该保存点将多人提交的源码合并, 也可以会退到某一个保存点上; Git离线操作性 :Git可以离线进行代码提交, 因此它称得上是完全的分布式处理, Git所有的操作不需要在线进行; 这意味着Git的速度要比SVN等工具快得多, 因为SVN等工具需要在线时才能操作, 如果网络环境不好, 提交代

  • Git 常用命令速查表(图文+表格)

    一. Git 常用命令速查 git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支 git branch -r 查看远程所有分支 git commit -am "init" 提交并且加注释 git remote add origin git@192.168.1.119:ndshow git push origin master 将文件给推到服务器上 git remote show origin

  • Git客户端TortoiseGit(Windows系统)的使用方法

    本文环境: 操作系统:Windows XP SP3 Git客户端:TortoiseGit-1.8.8.0-32bit 一.安装Git客户端 全部安装均采用默认! 1. 安装支撑软件 msysgit: https://code.google.com/p/msysgit/downloads/list?q=full+installer+official+git 当前最新版本为v1.9.0. 2. 安装TortoiseGit 首先,要安装Windows Installer 4.5. 然后,安装Torto

  • VSCode配置Git的方法步骤随记

    vscode中对git进行了集成,很多操作只需点击就能操作,无需写一些git指令. 不过这就需要你对vscode进行配置.下面我会讲到git的配置与免密码上传github. 一.安装Git管理工具,可上官网安装,安装路径https://git-scm.com/,安装路径默认C:\Program Files\Git,可自行修改,这里我是安装在D:\Program Files\Git. 二.安装完Git之后,如图配置好环境变量path路径的信息,一般会自动配置成功,配置完成后电脑就可以使用Git了.

  • Git使用小坑 Out of memory错误的解决方法

    最近公司将内部使用的代码由svn迁到了git上,所以也必须学者使用Git命令. 虽说git的模式和svn区别很大,但想必也不是什么难事.但没曾想在第一步git clone的时候就踩到了一个大坑--废话不多提,先看错误代码: 复制代码 代码如下: Cloning into XXXX... remote: Couting objects: 125627, done. remote: Compressing objects: 100% (47061/47061), done. fatal: Out o

  • Git 创建分支提交远程分支详解

    Git 创建分支提交远程分支详解 1.创建本地分支 git branch 分支名,例如:git branch 2.0.1.20120806 注:2.0.1.20120806是分支名称,可以随便定义. 2.切换本地分支 git checkout 分支名,例如从master切换到分支:git checkout 2.0.1.20120806 3.远程分支就是本地分支push到服务器上.比如master就是一个最典型的远程分支(默认). git push origin 2.0.1.20120806 4.

  • git提交空目录的方法

    前言 git和 svn不同,仅仅跟踪文件的变动,不跟踪目录.所以,一个空目录,如果里面没有文件,即便 git add 这个目录,另外在别处 check out 的时候,是没有这个空目录的. 只跟踪文件变化,不跟踪目录,这么设计是有原因的.但这会带来一些小麻烦.有时候,确实需要在代码仓库中保留某个空目录.比如测试时需要用到的空目录.下面来看看如何解决. 其实这里有两种情况: 一.目录是空的 这种情况下只需要在目录下创建.gitkeep文件,然后在项目的.gitignore中设置不忽略.gitkee

  • 详解如何使用git 生成patch 和打入patch

    平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用git 生成patch 给到我们,那我们就需要把客户给到patch 打入到我们的project ,基于这样一个场景,我把git 如何生成patch 和如何打入patch 做总结 生成patch 的方法:(我这里描述的生成patch 是根据commit 记录生成的) 1.例如首先先通过git log 查看有哪一些commit 2.把第一次commit 提交以后的(不包括第一次提交)都生成patch 如上图所示:使用命令:git

  • 详解IOS开发中生成推送的pem文件

    详解IOS开发中生成推送的pem文件 具体步骤如下: 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录到 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/index.action )并点击 App IDs 2. 创建一个不使用通配符的 App ID .通配符 ID 不能用于推送通知服务.例如,  com.itotem.ip

  • 详解使用zxing库生成QR-Code二维码

    详解使用zxing库生成QR-Code二维码 最近因为一些工作需要,需要根据实际的信息生成QR-Code二维码图片文件,自然想到zxing库了,具体的代码很简单,做个备忘. 首先是引入zxing库,我是使用maven构建项目的,添加依赖: <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0<

  • 详解用Pytest+Allure生成漂亮的HTML图形化测试报告

    对于软件测试工作来说,测试报告是非常重要的工作产出.一个漂亮.清晰.格式规范.内容完整的测试报告,既能最大化我们的测试工作产出,又能够减少开发人员和测试人员的沟通成本. 本篇文章将介绍如何使用开源的测试报告生成框架Allure生成规范.格式统一.美观的测试报告. 通过这篇文章的介绍,你将能够: 将Allure与Pytest测试框架相结合: 如何定制化测试报告内容 执行测试之后,生成Allure格式的测试报告. 如何与Jenkins集成. 将测试环境信息展示到测试报告中. 1.Allure测试报告

  • 详解Linux动态库生成与使用指南

    Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件. 在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用. 程序执行时,再去加载动态库文件.如果动态库已经加载,则不必重复加载,从而能节省内存空间. Linux下生成和使用动态库的步骤如下: 编写源文件. 将一个或几个源文件编译链接,生成共享库. 通过 -L<path> -lxxx 的gcc选项链接生成的libxxx.so

  • 详解idea切换git账号的两个方法

    两个方法可能都行,可能都不行,可能行一个,每个人遇到的问题不一样,自行排查吧 方法一:win10/win7凭据管理器处修改! 1.win10点击Cortana小圆圈,输入凭据管理器,点击凭据管理器 win7:`计算机 > 控制面板 > 用户账户和家庭安全 > 凭据管理器 > 普通凭据` 2.在windows凭据的普通凭据下更改对应的凭据(git账号和密码) 方法二:idea中不记住密码 在idea的设置中,搜索password,在Passwords中,选择Do not save选项

  • 详解vscode使用git所遇到的坑

    今天给vscode配置git的时候,差点没把我送走,我在配置git项目的时候会,看了一个博客文章的教学,其中配置路径的方法如下 1. 在git bash 中使用 命令 : where git 的路径 2.然后按照上面的路径配置到 vscode下的Git:path中,如下 然后当我使用vscode的push命令时 就出现如下错误 我百度了很多篇解决办法的文章,千姿百态,结果还是一个样报这个错误, 后来我突然发现别人的路径明显不是ming64下的git.exe,这一次我抱着最后的希望更改了路径 如下

  • 详解idea从git上拉取maven项目详细步骤

    刚从Eclipse转Intellij,对于它的各种操作也是一脸懵逼,但觉得使用起来还不错,今天就说一下我用Idea导入git中的Maven项目的详细步骤: 1. 首先打开Intellji Idea,选择check out from Version Control,选择Git(图片上选到gitHub了,抱歉抱歉). 2. 上一步完成后会出现如下界面,该界面有三个参数,第一个填的是你git的Url,第二个是你要建的项目的路径,第三个当然是存放的目录的名称啦,没什么含量. 3. 点击clone会出现如

  • 详解idea中Git的Stash Changes和UnStash Changes用法

    1,先从git上pull(拉)代码. 我们本地进行了一些代码编辑. 图上红框为新增方法 2,使用git的stash Changes功能,如下图 3,查看本地代码变化,可以看到自己新加的方法没有了,又回到了从git上pull下来的最新状态 4,查看git的UnStash Changes功能 点击上图view,可以对比代码,点击 apply stash ,可以将stash的代码恢复到本地 到此这篇关于详解idea中Git的Stash Changes和UnStash Changes用法的文章就介绍到这

  • 详解版本控制利器Git,SVN的异同以及适用范围

    使用git不久,粗浅理解: 1)适用对象不同.Git适用于参与开源项目的开发者.他们由于水平高,更在乎的是效率而不是易用性.Svn则不同,它适合普通的公司开发团队.使用起来更加容易. 2)使用的场合不同.Git适用于通过Internet,有多个开发角色的单个项目开发,Svn适合企业内部由项目经理统一协调的多个并行项目的开发. 3)权限管理策略不同.Git没有严格的权限管理控制,只要有帐号,就可以导出.导入代码,甚至执行回退操作.Svn则有严格的权限管理,可以按组.按个人进行针对某个子目录的权限控

随机推荐