热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:驾驭gitmerge——gitmerge的规范化操作

这两天负责将一个开发了较长时间,代码量数万行的C语言项目(A项目)的代码分支合并到主线。由于之前参与过一些其他项目分支收编时采用gitmerge引入问题的修改,个

  这两天负责将一个开发了较长时间,代码量数万行的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 "<<<

     至此用于合并代码的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常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • Thisworkcameoutofthediscussioninhttps://github.com/typesafehub/config/issues/272 ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
author-avatar
liu-zebing_284
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有