当前位置:首页 > 开发工具 > Git 合并 patch 时的冲突处理一例

Git 合并 patch 时的冲突处理一例

2022年11月09日 21:24:13开发工具8

Work-2008 2010-12-14 16:09:06 阅读84 评论0   字号: 订阅

Git 合并 patch 时的冲突处理一例
2010-09-13 19:20

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都提交上去

之此,完成了冲突解决。

作者:gracioushe
来源链接:https://blog.csdn.net/gracioushe/article/details/6278842

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/tool/69043.html

标签: Git合并
分享给朋友:

“Git 合并 patch 时的冲突处理一例” 的相关文章

Git常用的基本命令

目录 1.克隆 2.新建分支 3.提交 4.提交到远程仓库 5.下拉 6. 7.切换分支 8.暂存...

Git的安装教程(完成clone一个项目到本地)

Git的安装教程(完成clone一个项目到本地)

官网下载安装包地址:点击进入 https://git-scm.com/download/win 但是官网下载比较慢,我们这里选择国内阿里镜像点击进入 https://npm.taobao.org/mirro...

git format-patch 使用方法

使用git format-patch生成所需要的patch: # git format-patch -s 1bbe3c8c197a35f79bfddaba099270a2e54ea9c7 please replace the hash code with your...

如何将idea项目上传到Git

如何将idea项目上传到Git

Git是一款免费的分布式版本控制工具。每个人的电脑都是一个完整的版本库,那么我们该如何将一个java项目上传到Git呢? 一、准备工作 1、Git下载及安装 https://jingyan.baidu.com/article/7f766dafba84f04101...

git重新设置账户和密码

git重新设置账户和密码 **清空所有用户名和密码(cmd以管理员身份运行):git config --system --unset credential.helper git config...

Git取消合并

git merge --abort 作者:hanchao5272 来源链接:https://blog.csdn.net/hanchao5272/article/details/82154327...

Git提交代码步骤

Git提交代码步骤

目录 1.Git提交代码步骤 1.1 第1步:同步远程仓库代码:git pull 1.2 第1步:查看当前状态:git status 1.3 第2步:提交代码到本地git缓...

git进行版本回退(文件恢复、恢复误提交、已提交)

文章目录 1.介绍 2.git的4个区 3.git文件的5种状态 4.回退命令...

git-github 子模块仓库更新(git submodule)/git中submodule子模块的添加、使用和删除

文章目录 一、git submodule背景 1. git将submodule有关的信息在哪? 2. 子模块的添加...

git查看当前用户名密码并修改

获取当前登陆用户: git config user.name //获取当前登录的用户 git config user.email //获取当前登录用户的邮箱 修改登陆用户: git config --global user.na...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。