如何处理 git am PATCH 时的失败
(2012-05-12 10:19:38)
标签:
gitam打patch代码冲突patchgit-am杂谈 |
打patch(补丁),尤其是使用git format-patch生成的patch,可以非常简单:
$ git am PATCH
不过,说它简单,这仅限于如果这些patch能够完美的被集成进你的代码库。一旦产生任何代码冲突,使用git
am就会变得有些复杂。
如果使用Google搜索“git am fail”,你会找到这个网页 http://kerneltrap.org/mailarchive/git/2007/2/22/239371。可惜,它的内容有些过时了。而且,我也无法在git手册中找到任何关于这个问题的有效解答(或者是我还没有把git手册看的更仔细)。
比如,一个典型的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
(译注:$ git status)
$ 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。
版权 Copyright:
原文 2011年10月31日,Bugdromer发表于 http://www.pizzhacks.com/bugdrome/2011/10/deal-with-git-am-failures/,此处为小刚徐译作。
Deal with git am failures
Posted on October
31, 2011 by bugdromer