git am 冲突解决

git am 冲突解决技巧

使用git am合patch的时候可能有冲突出现,这个时候,手动解决的办法是看看冲突在哪里,
然后手动的把那个patch和入。手动合入需要的时间太长.

我们可以用git apply --reject patch的方式合入。这里需要注意几个问题。

git apply只会看到文件,它把patch里的一个个diff段拆出来, 然后合入相应的文件里, 而且git
apply只会合入当前目录下的diff段,所以上面的命令要到所有diff段的最大的
一个目录里去执行,一般为了方便就在代码的根目录里执行。git apply后相当于修改了 原文见,所以要git add,git commit下。–reject的这个参数会把有冲突的段保存在一个 .rej的文件里。

所以,一般git am合patch的步骤可以是这样的:

git am patch –> 没有conflict,over!

有冲突的时候: cd code_root/
git apply --reject patch

在.rej文件里找见冲突的diff段,手动修改对应的代码

git add related_files

git am  --resolved

注意最后一个操作, 我们现在已经把git am的冲突解决,用git am --resovled可以继续git
am的操作把commit log也自动的打上!

git apply --reject xxxx.patch

自动合入 patch 中不冲突的代码改动,同时保留冲突的部分。这些存在冲突的改动内容会被单独存储到目标源文件的相应目录下,以后缀为 .rej 的文件进行保存。

比如对 ./test/someDeviceDriver.c 文件中的某些行合入代码改动失败,则会将这些发生冲突的行数及内容都保存在 ./test/someDeviceDriver.c.rej 文件中。我们可以在执行 git am 命令的目录下执行 find -name *.rej 命令以查看所有存在冲突的源文件位置。

例子:

比如,一个典型的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,github)