详解如何使⽤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使用详解
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 ⽣成patch 和打⼊patch的⽂章就介绍到这了,更多相关git ⽣成patch 和打⼊patch内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。