驾驭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!

原文地址:https://www.cnblogs.com/leituhaomo/p/12126508.html

时间: 2024-10-26 13:51:10

驾驭git merge——git merge的规范化操作的相关文章

Git中的merge命令实现和工作方式

想象一下有如下情形:代码库中存在两个分支,并且每个分支都进行了修改,最后你想要将其中的一个分支合并到其他的分支中.个人博客网址 http://swinghu.github.com/ 那么要问合并的处理过程是怎么样的呢?Git是对每个分支,依据分支的历史数据按照序列化操作,还是它只是合并每个分支里文件的最后版本?这是一个问题,我想对git的merge操作有必要进行分析一下. 回忆一下,我们知道Git的版本库内部结构是以有向无环图(directed acyclic graph)组织起来的:每一次co

使用Git中的Merge与Rebase与开源项目同步代码

基于开源项目的开发有两种主要工作模式.模式1是在从开源项目中拉出一个分支,在这个分支中开发新feature,完成后合并到upstream中.适用于本身是开源项目的developer.模式2是从开源项目中拉出分支后独立发展,但定期从upstream拉更新(如重要版本升级时).无论是哪种,都会面临本地分支与upstream同步代码的问题.为此,git主要提供了两种方式:一种是merge, 一种是rebase.下面通过例子简单过一下它们的基本流程. 假设开源项目的git地址为git://xxx.org

Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase

上篇博客聊了<git分支管理之rebase 以及 cherry-pick相关操作>本篇博客我们就以Learning Git中的关卡进行展开.下方列举了LearningGit中的 merge.rebase.reset.revert.cherry-pick 以及交互式rebase相关关卡的操作以及对应的解析.后边在聊交互式rebase操作是,不单单给出了LearningGit中的内容,而且给出了真正的Git分支在交互式rebase操作时的具体案例. learngitbranching的地址为:ht

git merge时merge/squash merge/rebase merge的区别

1. merge $ git checkout master $ git merge dev 这是最基本的 merge,会把分支的提交历史原封不动地拷贝过来,如果 master 此后已经有了新的提交,那么本次 merge 时还会额外自动创建一条 commit 信息用于记录本次 merge 操作. 2. squash merge $ git checkout master $ git merge --squash dev 字面意思,相比?merge?来说会减少分支合并的记录,会被压缩为一条 com

细说git merge &amp; git rebase

git merge和git rebase两个都是用来合并两个分支用的,在使用过程中,这两个概念容易混淆. 在此,对这两个git技巧的用法进行详细描述,希望能帮助一些热爱git的朋友. ------------------------------------------------------------------------------------------------------ git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 同样git re

git dev 分支merge到master

code reviewer之后,需要把dev分支的代码merge到master分支.通过在azkaban的服务器上git pull,最终将代码上线. git dev 分支merge到master # 检出到dev分支 git checkout dev # 拉取dev最新代码到当前文件夹 git pull # 检出到master分支 git checkout master # 将dev分支合并到master git merge dev # 将本地的master分支推送到origin主机 git p

【Git】Git远程操作详解

Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Git远程操作. git clone git remote git fetch git pull git push 本文针对初级用户,从最简单的讲起,但是需要读者对Git的基本用法有所了解.同时,本文覆盖了上面5个命令的几乎所有的常用用法,所以对于熟练用户也有参考价值. 一.git clone 远程操作

Git上手(3)基础操作

初始化操作    $ git config -global user.name <name> #设置提交者名字    $ git config -global user.email <email> #设置提交者邮箱    $ git config -global core.editor <editor> #设置默认文本编辑器    $ git config -global merge.tool <tool> #设置解决合并冲突时差异分析工具    $ git

Git 初學筆記 - 指令操作教學

Git 是分散式的版本控制系統, 從架設.簡易操作.設定, 此篇主要是整理 基本操作.遠端操作 等. 註: Git 的範圍太廣了, 把這篇當作是初學入門就好了. 注意事項 由 project/.git/config 可知: (若有更多, 亦可由此得知) origin(remote) 是 Repository 的版本 master(branch) 是 local 端, 正在修改的版本 平常沒事不要去動到 origin, 如果動到, 可用 git reset --hard 回覆到沒修改的狀態. Gi