git version 1.6.0.4
几个新手刚刚开始接触 Git,为了维护核心仓库的“纯洁”,避免太多无关信息被误提交进仓库(再次批评一些图形化工具默认的“Select All”),采用了核心仓库只读,邮件提交 patch,审核后再提交的工作流程。
期间有时会遇到合并冲突,正常的原因一般是未及时下载新版本产生了冲突,特殊一点的原因是手工修改 patch 内容导致的。有时候看注释写得不够准确,忍不住就改了,有时候是 Geany 保存时自动去除了 patch 原文中的行尾空格,有时候是文件回车格式、BOM 等变动了,总之合并 patch 的时候,如果生成 patch 的“原稿”找不到,一般就产生了冲突,比如:
$ git am 0001-BUG-Sybase.patch
Applying: CHG: 读取Sybase如果时间为空,设置默认时间的修改
error: patch failed: source.php:38
error: source.php: patch does not apply
Patch failed at 0001.
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".
刚开始一看有些懵,因为没有任何冲突在哪里的提示,后来找到一种方法,am 操作出问题后先手工 apply:
$ git apply --reject 0001-BUG-Sybase.patch
Checking patch source.php...
error: while searching for:
// 注释
// 以下为几行代码片断
error: patch failed: source.php:38
Applying patch source.php with 1 rejects...
Rejected hunk #1.
这样,就把没有冲突的文件先合并了,剩下有冲突的作了标记。先看输出,error: while searching for: 说明是这段代码有冲突,error: patch failed: source.php:38 指明了产生冲突的代码片断的开始行号,相应的,patch 中应该有这么一段:
diff --git a/source.php b/source.php
index 8770441..4e77b8a 100644
--- a/source.php
+++ b/source.php
@@ -38,27 +38,23 @@ class Site extends Module
// 注释
// 以下为几行代码片断
同时,还会产生一个 source.php.rej 文件,里面也是上面这段因为冲突无法合并的代码片断。
现在,在这段代码中查找冲突原因,并对文件进行修改,source.php.rej 参考完了可以删掉。改好之后,用 git add 把 source.php 添加到缓冲区,同时也要把其他没有冲突合并成功了的文件也加进来,因为在作 apply 操作的时候他们也发生了变化:
$ git add source.php
$ git add 其他 apply 进来的文件们
最后:
$ git am --resolved
Applying: CHG: 读取Sybase如果时间为空,设置默认时间的修改
大功告成。
中间如果处理乱了,用 git reset 恢复即可,所以合并 patch 在一个“干净”的分支上处理更好。
注意,根据我自身实践的流程是:
1. git am one-patch 此时,即使有错误使用git status看到没有任何修改
2. git apply --reject one-patch 此时将会把能修改的文件修改了,不能修改的文件会生成一个.rej文件,此时git status可以看到正常patch的文件,以及生成的一个untrack的.rej文件
3. 根据生成的.rej文件知道错误,然后再修改错误
4. git add 添加修改的文件
5. git am --resolved 此时将会把补丁中修改的文件以及log都提交上去
之此,完成了冲突解决。
相关推荐
Git打Patch就这么简单Git打Patch就这么简单Git打Patch就这么简单Git打Patch就这么简单
主要介绍了idea+git合并分支解决冲突及详解步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在使用git pull代码时,经常会碰到有冲突的情况,本文简单的介绍 实际开发中使用git如何解决以上问题。
git图形化的代码冲突处理工具
在vscode上针对git可视化操作,在git pull后出现冲突的解决方式
Atom-merge-conflicts.zip,解决atom中的git合并冲突合并冲突,atom是一个用web技术构建的开源文本编辑器。
git 处理冲突 以及 基本操作等一些信息,提供大家学习。
史上最全的eclipes git解决冲突方法,快来下载下载!!!!
一个更好的Vimdiff Git合并工具
为了避免git合并时发生冲突,做了一个基本的变更日志管理器。 安装 将软件包作为开发依赖项添加到您的项目中: npm install -D changelogify 并为您的包脚本: "scripts": { "changelog": "node node_modules/....
git master 合并的钩子
Git合并分支TortoiseGit
描述了合并某一次提交的代码的方式,描述了合并某一系统提交的方式,并且描述了合并某一个文件和拷贝某一分文件的方法
我们在项目中使用git进行自动化测试代码管理和维护,随着自动化测试代码提交的人数增加,越来越多的问题也随之暴露出来,今天想要跟大家分享的是关于git代码合并的冲突问题。 最初自动化代码是有一个人搭建起来,...
主要介绍了详解git合并冲突解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
需要被合并的commit信息,将pick命令改为 s 命令,将s合并到pick上,时间上是s向更早的pick上合并;ESC 输入 :wq 回车 弹出信息,ESC 输入 :wq 回车 打印出成功 git log oneline -n,查看n条log信息,已修改
主要介绍了详解如何使用git 生成patch 和打入patch,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Composer JSON Git合并驱动程序提供了一种机制,可以更有效地合并在单独的分支/开发历史记录中同时进行修改的composer.json和composer.lock文件。 当作曲者JSON文件要求的合并比简单的“快速前进”更为复杂时,将...
TortoiseGit代码合并流程