驾驭git merge——git merge的规范化操作
这两天负责将一个开发了较长时间,代码量数万行的C语言项目(A项目)的代码分支合并到主线。由于之前参与过一些其他项目分支收编时采用git merge引入问题的修改,个人从心理上对git merge有所抵触。有个动图形象描述了git merge使用不当带来的灾难:
鉴于上述原因,平时从个人的调试分支向项目公共分支合并commit时一般也采用git cherry-pick的方式(详见另一篇博客),以尽量保持项目分支在通过gitk查看时是一条直线。原计划此次合入也采用git cherry-pick的方式:先将项目的git log导出到文件中,然后按照下图利用标记分段的方式过滤出我们项目开发的提交,再通过cherr-pick将这些提交合并到主线。
///begin1
commit xxxxxxxxxx
commit xxxxxxxxxx
commit xxxxxxxxxx
///end1
commit xxxxxxxxxx
commit xxxxxxxxxx
///begin2
commit xxxxxxxxxx
commit xxxxxxxxxx
commit xxxxxxxxxx
///end2
commit xxxxxxxxxx
commit xxxxxxxxxx
。。。。。。
但是由于开发分支历史上与其他项目的分支进行过多次合并,A项目与其他项目的commit相互穿插,很难进行标记分段;不得已只能采用git merge。既然git merge是最常用的命令而非洪水猛兽,造成问题的最大因素还是人,引入的问题多数因为使用不当。可以通过规范化操作避免问题,自己稍微梳理了下能够尽量避免问题的操作步骤:
目标:将develop分支上的提交合并到master分支。
步骤:
1.在master分支下执行git checkout -b master_for_merge创建并切换到用于合并的master_for_merge临时分支;
2.执行命令git merge develop将develop分支的内容合并到master_for_merge分支;
3.直接执行git add .和git commit -m "merge with conflict"两条命令生成一次提交;
这里需要注意,通常将develop分支合并过来是会产生冲突的,但是不建议现在修改,本来代码合并过来差异就很大,此时修复冲突如果不慎修改了其他地方引入问题,很难通过代码比对发现。
4.解决冲突:
在代码目录下执行grep -nr "<<<< HEAD" ./找到冲突的地方进行修改,修改完后执行git add .和git commit -m "fix conflict"两条命令生成一次提交;这样通过git show HEAD可以清楚的看到我们为修改冲突改了哪些内容;
至此用于合并代码的master_for_merge分支已经准备好了,为了进一步确认合并没问题我们再进行两次校验。
5.执行git diff master master_for_merge, 确认所有的差异都是develop分支上开发的内容,确认未合入develop分支外的其他内容;
6.执行git diff develop master_for_merge, 确认所有的差异都不是develop分支上开发的内容,确保合入不遗漏;
7.将步骤3生成的"merge with conflict"和步骤4生成的"fix conflict"两个commit通过git rebase的方式合并为一次commit.
8.测试验证master_for_merge分支代码,如果没问题在master分支下执行git merge master_for_merge就完成代码合并了.
按上述步骤merge的主要目的是可以通过步骤4,5,6查看冲突解决方式以及进一步确认代码合入是否有错和遗漏。
最后,如果可以,建议首选方式还是采用cherry-pick!
驾驭git merge——git merge的规范化操作的更多相关文章
- Git回滚merge操作
执行完merge操作后,没有修改代码 1.命令 ⑴ git reflog 查看merge操作的上一个提交记录的版本号 ⑵ git reset –hard 版本号 这样可以回滚到merge之前的状态 2 ...
- Git中的merge命令实现和工作方式
想象一下有例如以下情形:代码库中存在两个分支,而且每一个分支都进行了改动.最后你想要将当中的一个分支合并到其它的分支中.个人博客网址 http://swinghu.github.com/ 那么要问合并 ...
- Git中的merge命令实现中出现问题及其解决
Git中的merge命令实现和工作方式 2015年8月17日星期一 丹丹 git代码在合并两个分支的时候总是会出现一下的错误提示,不能正常的完成合并分支,错误提示如图所示: 但是在其他的终端是可以完成 ...
- Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase
上篇博客聊了<git分支管理之rebase 以及 cherry-pick相关操作>本篇博客我们就以Learning Git中的关卡进行展开.下方列举了LearningGit中的 merge ...
- git 中的 merge 和 rebase
示例分支:master . dev 把 dev 分支上的新内容合并到 master 上 先切换分支到master git checkout master 合并操作 git merge dev 或者 g ...
- git合并之 merge和rebase
合并有两种方法: git rebase 和git merge 优先用 rebase!!!! 区别: 1. 使用git merge git checkout dev git merge master 或 ...
- git dev 分支merge到master
code reviewer之后,需要把dev分支的代码merge到master分支.通过在azkaban的服务器上git pull,最终将代码上线. git dev 分支merge到master # ...
- Merge git repo into branch of another repo
git 两个repo merge You can't merge a repository into a branch. You can merge a branch from another rep ...
- Git merge && git rebase的用法
Git merge的用法: git merge Dev // Dev表示某分支,表示在当前分支合并Dev分支 git merge -m “Merge from Dev” Dev //-m可以加上m ...
随机推荐
- MyBatis映射文件的基本功能
#{}与${}区别 "#{}"使用的是preparedStatement方式预处理,就是使用了占位符来填充数据防止SQL注入. ${}使用的是statement方式进行sql语句的 ...
- 关于mybatis中llike模糊查询中#和$的使用
模糊查询: 工作中用到,写三种用法吧,第四种为大小写匹配查询 1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('% ...
- oracle函数 MIN([distinct|all]x)
[功能]统计数据表选中行x列的最大值. [参数]all表示对所有的值求最大值,distinct只对不同的值求最大值,默认为all 如果有参数distinct或all,需有空格与x(列)隔开. [参数] ...
- ros自定义消息
ros自定义消息可以根据自身项目需求定义和封装想要的数据类型和数据结构.具体可以参考维基百科关于ros自定义消息部分 这里我只是记录自定义消息的要点部分: 1.首先要在工作空间下功能包中创建一个msg ...
- 自动编码(AE)器的简单实现
一.目录 自动编码(AE)器的简单实现 一.目录 二.自动编码器的发展简述 2.1 自动编码器(Auto-Encoders,AE) 2.2 降噪自编码(Denoising Auto-Encoders, ...
- MapReduce数据流-Mapper
- JavaWeb项目结构和classpath:
以tomcat为例 项目结构 开发时的项目结构 蓝框 : 存放java文件 绿框 : 存放配置文件 红框 : 存放前台代码 这个项目结构大家都很熟悉,那么当项目被部署到tomcat中时,项目的结构会发 ...
- Scrapy五大核心组件简介
五大核心组件 scrapy框架主要由五大组件组成,他们分别是调度器(Scheduler),下载器(Downloader),爬虫(Spider),和实体管道(Item Pipeline),Scrapy引 ...
- 2018-8-10-WPF-使用-VisualStudio-2017-项目文件
title author date CreateTime categories WPF 使用 VisualStudio 2017 项目文件 lindexi 2018-08-10 19:16:53 +0 ...
- github下载慢,轻松提速教程
获取github的IP地址访问:https://www.ipaddress.com/ 网址 依次获取以下三个网址的IP github.comgithub.global.ssl.fastly.netco ...