首页 > 其他分享 >git打patch

git打patch

时间:2023-06-06 15:33:08浏览次数:41  
标签:git format -- am patch apply

原文地址:https://www.jb51.net/article/191549.htm

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

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

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

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

如上图所示:使用命令:

git format-patch e795fefabc

然后生成的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,format,--,am,patch,apply
From: https://www.cnblogs.com/zuiniub/p/17460694.html

相关文章

  • 【转】Git Fork操作与配置
    转自https://blog.csdn.net/liuqiao0327/article/details/110671028?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-110671028-blog-128612125.235%5Ev37%5Epc_relevant_anti_vip_base&depth_1-utm_s......
  • git报错would clobber existing tag
    使用vscode拉取代码出现报错:解决问题如下:1.在terminal直接输入gitpull完成对代码的拉取,代码虽然拉取了,但是vscode的git工具还是不能用2.在terminal输入gitfetch--tags-f,先完成对本地代码tag的强制更新。3.再使用vscode的git工具拉取代码 ......
  • 【转】git的分支什么时候用
    转自https://zhuanlan.zhihu.com/p/631382940Git的分支功能可以让你在同一代码库中独立地开发不同的功能或修复不同的bug,而不会影响主干分支的稳定性。以下是使用Git分支的一些情况:开发新功能:如果你需要开发一个新的功能,可以在主干分支上创建一个新的分支,然后在该分支上进......
  • 【转】Git子仓库深入浅出
    转自https://zhuanlan.zhihu.com/p/100214931在前端日常开发中,我们经常git来当做代码版本管理工具,使用中基本都是一个项目一个Git仓库的形式,那么当我们的代码中碰到了业务级别的需要复用的代码,我们一般怎么做呢?我们大致的考虑一下,一般有两种方案:抽象成NPM包进行复用使......
  • git如何完整迁移仓库
    如何完整迁移git仓库到另一个远程地址。项目中遇到git仓库迁移,很常见。如何把一个项目中所有的分支,tag等迁移到另一个仓库地址,需要执行一个特别的克隆命令,然后镜像push到新的仓库地址。具体步骤如下:1.打开命令行工具2.以bare的方式克隆老的仓库gitclone--bareht......
  • github 主流代码托管平台
    GitHub是一个基于web技术的代码托管平台,它提供了免费的远程仓库,开发者们可以将自己的代码存储在这个远程仓库中,并且可以与其他开发者进行协作。GitHub最初是为开源项目服务的,但现在已经成为了一个广泛使用的工具,不仅适用于开源项目,也适用于私有项目。一。方便的集成:作......
  • Set up SSH for Git and Mercurial on Mac OSX/Linux
    https://confluence.atlassian.com/pages/viewpage.action?pageId=270827678http://www.worldhello.net/gotgithub/index.html......
  • GitHub/Bitbucket 通过 SSH 密钥连接
    序言项目托管服务较好的当属 GitHub 和 Bitbucket 了,二者都支持 Git 版本控制。二者最大的区别是:GitHub很火正常访问,Bitbucket最近访问有点问题(…)GitHub私有库需要付费,Bitbucket私有库免费GitHub只支持Git,Bitbucket同时支持Mercurial废话不多说,开始配置Step1:......
  • git 多用户配置
    第一步删除全局用户名和邮箱配置#添加全局用户信息gitconfig--globaluser.name"用户名"gitconfig--globaluser.email"邮箱"#删除全局用户信息gitconfig--global--unsetuser.namegitconfig--global--unsetuser.email第二步生成key并添加至远端$ssh-......
  • Ubuntu下git的安装与使用
    Ubuntu下git的安装与使用Ubuntu下git的安装与使用与Windows下的大致相同,只不过个人感觉在Ubuntu下使用git更方便。首先,确认你的系统是否已安装git,可以通过git指令进行查看,如果没有,在命令行模式下输入sudoapt-getinstallgit命令进行安装。安装完成后进行git配置,输入指令gitconfi......