驾驭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 ...
随机推荐
- 复杂SQL示例 (排行榜需求)
公司项目要求做出排行榜,根据六组数据依次排行,关联多表,SQL记录下来方便日后查看 " ?><!DOCTYPE mapper PUBLIC "-//mybatis.or ...
- Warning!程序员们小心被技术绑架
通常我们说程序员需要在某个技术方向上积累到一定的厚度,要能够运用技术有效地解决实际问题.可是当程序员在某一项技术上浸淫时间长了之后,却经常会出现另外的问题,那就是:看待问题时受限于自身的技术积累. 我 ...
- QT开发ROS遇到问题:execute_process(/usr/bin/python"/home/fu/catkin_ws/build/catkin_genetated/generate_cached_setup.py)..........
具体如上图显示,网上给的方法是重装ros和重新创建ROS工作空间.经过这样做以后发现问题依然存在. 最后考虑可能是没有加载ROS的环境变量.(我的qtcreator中已经有了创建ros工程的项目,但是 ...
- TCP/IP,UDP,HTTP,SOCKET之间的区别和关系
TCP/IP TCP/IP代表传输控制协议/网际协议,指的是一系列协组.可分为四个层次:数据链路层.网络层.传输层和应用层. 在网络层:有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协 ...
- LOJ6079「2017 山东一轮集训 Day7」养猫
养ImmortalCO k可重区间问题 的增强版:有上下界! 直接都选择s[i],然后再把一些调整到e[i] 考虑通过最大流的“最大”,使得至少每k个有me个e, 通过最大流的“上界”,限制每k个最多 ...
- Linux 正文处理命令及tar命令 利用vi编辑器创建和编辑正文文件
要点回顾 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cp /etc/passwd . cat ./passwd >1.txt cp /etc/group ...
- poj 1092 Farmland (Geometry)
1092 -- Farmland 怎么最近做几何题都这么蛋疼,提交C++过不了交G++就过了.据我估计,原因是用了atan2这个函数,或者是其他一些函数造成了精度的影响.不管怎样,这题最后还是过了~ ...
- Open Source Projects Released By Google
Open Source Projects Released By Google Google has released over 20 million lines of code and over 9 ...
- H3C 主机单播IP包发送
- H3C LMI协议标准