Git的代码合入流程详解

目录
  • 总述
  • Rebase解决冲突
    • 适用情况
    • 操作方式
    • Squash解决冲突
    • 适用情况
    • 操作方式
    • Merge执行合入

总述

代码合入流程用于减轻代码合入复杂度、简化主分支历史(具有线性的历史)、保证合入代码对主分支的HEAD有效
代码合入分为两步

  • 解决冲突:将需要合入的分支变基到目标分支之上。保证合入代码对目标分支的HEAD有效。此时会解决所有代码冲突。
  • 执行合入:向目标分支提交merge请求,执行合入CI后完成合入。

其中第一步“解决冲突”的方法分为两种种情况:

  • Squash。如 feature分支 向 dev分支 合入;存在冲突的合入。此时会出现 合入过程冲突多、合入结果复杂(commit多)、合入message不清晰(未能完整描述改动内容)的问题。此时不需要保存历史commit,仅需要干净的将feature合入master。
  • Rebase。如 hotfix分支 向 dev分支 合入;feature分支 向 feature分支 合入。此时冲突少、合入结果简单、需要保存历史commit。

其中第二步“执行合入”应采用 merge no-fast-forward 的方式。确保合入信息可追溯和易回退。

Rebase解决冲突

适用情况

  • hotfix → develop
  • feature → feature
  • develop → master

其中commit数量少(1~2个),开发周期短(1day)。

操作方式

其中dev分支向master分支合入。通过执行 git log --all --graph --decorate 可看到如下图。两个分支已经分开,如果通过在master分支git merge合入且存在冲突,那么会触发三方合并在master生成merge commit污染主分支提交历史,这是我们不想看到的。

此时我们执行以下流程解决问题

git checkout dev  && git pull dev
git rebase master // 保证master与remote仓库一致
// 若发生冲突执行 git mergetool  解决冲突
git rebase --continue

此时可以看到master分支和dev分支干净得合在一起。经过单元测试并确认我们的改动没有bug后,我们可以push并开启mr。

Squash解决冲突

适用情况

  • feature → develop
  • gitlab → gerrit (此处为泊车自动同步代码中用到)

其中commit数量多(> 2个),开发周期长(> 1day),冲突量大(每个commit可能都有冲突)。

操作方式

此处仍然是将dev合入master。其中dev分支提交历史混乱(有tmp提交),commit号多且每个commit都与master有冲突。此时在master分支执行 git merge dev 会触发三方合并,且保留不必要的commit历史。不必要的提交信息如图

操作的初始状态如图

此处我们执行如下操作,在master分支解决冲突并压缩提交。随后checkout一个提交分支并开启mr。这有利于简化主分支提交。但需要小心,dev分支不能再使用,需要重新从master分支拉取新的dev。

git checkout master // 保证master与remote一致
git merge --squash dev
// 解决冲突  git mergetools  、  git commit -m <总结此次提交的所有内容>
git checkout -b <mr-branch>
git push xxxx

mater结果如图

Merge执行合入

这里强调使用merge no fast forward的目的是保留合入信息。

git checkout master
git merge --no-ff dev

以上就是Git的代码合入流程详解的详细内容,更多关于Git代码合入流程的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用git命令将本地代码上传到GitHub

    一.创建githubrepository(仓库) 1.登录GitHub 创建GitHub仓库,首先需要登录GitHub,GitHub网址:https://github.com.如果没有GitHub账号,需要先注册GitHub账号,这里不在演示如何注册GitHub账号,直接登录GitHub. 2.创建repository(仓库) 创建repository仓库有两种方式. 2.1.使用右上角的向下倒三角进行创建,如下图所示: 2.2.使用左边的New repository按钮创建,如下图所示: 3.

  • nodejs制作一个文档同步工具自动同步到gitee中的实现代码

    初衷 之所以要做这个工具是为了让自己可以随时用电脑时能记录日常工作或生活.一般只需要简单记录下就行了.这样我在家里的和公司里的记录都能同步看到. 这样后期整理的时候看到几个关键词就能想起来具体的事情,有的也可以为日后整理成文章做一个草稿,这样写文章才能有头有尾,否则想到什么说什么是非常不利于写出文章的. 一开始我使用手动同步的方式,但是发现很麻烦,之后就直接用了个批处理文件来一次性同步. git pull git add . git commit -m '同步' git push git sta

  • 解决Git Revert 再次合代码无效问题

    目录 背景 Demo复现该问题 用Squash方式解决该问题 小结 背景 将开发分支dev合并进主分支main以后,如果发现bug需要回滚代码时,我们常使用git revert完成操作,但是当我们将dev上的bug修复之后想再把它合进main却会发现,dev上的功能代码合不进去了,原因是这些功能代码的commit已经在main分支上了(虽然被revert了,但仍在),所以git会拒绝合进重复的commit. 本人最近就遇到了这种问题场景,查阅网上资料推荐的做法一般是把main之前的revert再

  • 关于IDEA中Git暂存代码的使用

    目录 一 问题引入 二 解决方法 三 总结 一 问题引入 ​ 在日常工作中, 通常都按照迭代功能划分分支开发, 即一个迭代一个分支. 正常迭代开发-测试-上线没有问题. 可是突然上个分支有一个很紧急的问题bug,需要修改优化, 此时都是在新分支上开发, 随意进行分支切换, 很容易导致代码混乱,不利于代码管理, 那么有没有一个办法可以暂存当前代码状态呢? 类似小时候玩游戏, 玩到一半想存档, 玩其他的或看电视, 下次再继续玩,还是当前状态. 二 解决方法 通过IDEA来完成操作 在新分支中, 点击

  • VS2022 Git提交代码的实现

    目录 第一种方法 第二种方法 第三种方法 第一种方法 在fork和pull request后,克隆对方的源代码到一个新文件夹,将所有项目文件复制到用VS2022创建的新项目工程中(里面也包含了git文件夹,这个最重要),打开这个项目工程后,可在右侧看到如下图的工具栏. 这时候就可以按照需求修改代码,通过图形界面来提交,这里面的操作就可以自己摸索. 第二种方法 完全通过类似于Git Bash的linux命令操作. 第三种方法 在一个新项目中,直接创建一个Git库. 右侧也同样会出现Git工具栏.

  • 使用git命令上传代码

    利用git将本地代码提交到远程服务器一般分为如下5个步骤: 一.查看当前文件的状态 使用git status命令可以查看有那些文件进行了修改,一般有下面几个状态: 1.Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged. 2.Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 3.deleted: 文件已删除,本地删除,服务器上还没有删除. 示例如下: 打开git bash客户端,然后输入g

  • Git的代码合入流程详解

    目录 总述 Rebase解决冲突 适用情况 操作方式 Squash解决冲突 适用情况 操作方式 Merge执行合入 总述 代码合入流程用于减轻代码合入复杂度.简化主分支历史(具有线性的历史).保证合入代码对主分支的HEAD有效.代码合入分为两步 解决冲突:将需要合入的分支变基到目标分支之上.保证合入代码对目标分支的HEAD有效.此时会解决所有代码冲突. 执行合入:向目标分支提交merge请求,执行合入CI后完成合入. 其中第一步“解决冲突”的方法分为两种种情况: Squash.如 feature

  • OpenDataV低代码平台新增组件流程详解

    目录 正文 创建组件目录和文件 初始化组件文件 组件配置项 样式配置 属性配置 属性使用 总结 正文 OpenDataV计划采用子库的方式添加子组件,即每一个组件都当做一个子库,子库有自己的依赖,而项目本身的依赖只针对框架,因此每一个组件我们都当做一个子库来开发.下面我带着大家一步步详细的开发一个数字展示组件. 创建组件目录和文件 进入组件库目录下 所有的可拖拽组件都存放在src/resource/components目录下 cd src/resource/components 根据组件名称创建

  • Java代码生成器的制作流程详解

    1. 前言 前几天写了篇关于Mybatis Plus代码生成器的文章,不少同学私下问我这个代码生成器是如何运作的,为什么要用到一些模板引擎,所以今天来说明下代码生成器的流程. 2. 代码生成器的使用场景 我们在编码中存在很多样板代码,格式较为固定,结构随着项目的迭代也比较稳定,而且数量巨大,这种代码写多了也没有什么技术含量,在这种情况下代码生成器可以有效提高我们的效率,其它情况并不适于使用代码生成器. 3. 代码生成器的制作流程 首先我们要制作模板,把样板代码的固定格式抽出来.然后把动态属性绑定

  • 基于PHP的微信公众号的开发流程详解

    微信公众号开发分傻瓜模式和开发者模式两种,前者不要考虑调用某些接口,只要根据后台提示傻瓜式操作即可,适用于非专业开发人员. 开发模式当然就是懂程序开发的人员使用的. 下面简单说一下微信公众号开发的简易流程,新手看看会有帮助,高手请一笑而过. 1.配置服务器: A.首先在本机建立如下结构的文件夹(这里是我自己的习惯,仅供参考) MMPN:总目录mro message public number 微信公众号 backup:备份目录,主要用于备份php文件,每次修改时将原稿备份到里面去. images

  • Android view绘制流程详解

    绘制流程 measure 流程测量出 View 的宽高尺寸. layout 流程确定 View 的位置及最终尺寸. draw 流程将 View 绘制在屏幕上. Measure 测量流程 系统是通过 MeasureSpec 测量 View 的,在了解测量过程之前一定要了解这个 MeasureSpec . MeasureSpec MeasureSpec 是一个 32 位的 int 值打包而来的,打包为 MeasureSpec 主要是为了避免过多的对象内存分配. 为了方便操作,MeasureSpec

  • Android 备忘录的实现流程详解

    目录 一.首先创建保存数据的表 二.主界面 2.1 activity_main.xml 三.:EditActivity.java 3.1 edit_layout.xml 四.对笔记进行增删查改 4.1 note_layout.xml 五.演示效果 5.1 登录界面 5.2笔记界面 5.3 增加记录 5.4删除记录 5.5 查找记录 5.6源码 总结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一.首先创建保存数据的表 Notedatabase,java package co

  • C++ 风靡一时的连连看游戏的实现流程详解

    随着Flash应用的流行,网上出现了多种在线Flash版本"连连看".如"水晶连连看"."果蔬连连看"等,流行的"水晶连连看"以华丽界面吸引了一大批的女性玩家. 2008年,随着社交网络的普及和开放平台的兴起,"连连看"被引入了社交网络."连连看"与个人空间相结合,被快速的传播,成为一款热门的社交游戏,其中以开发者Jonevey在Manyou开放平台上推出的"宠物连连看&quo

  • C++详细实现红黑树流程详解

    目录 红黑树的概念 红黑树的性质 红黑树的定义与树结构 插入 新增结点插入后维护红黑树性质的主逻辑 旋转 验证 红黑树与AVl树的比较 红黑树的应用 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black. 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的 概念总结: 红黑树是二叉搜索树的升级,结点里面存放的成员col标记当前结点的颜色,它的最长路径最多是最短路径的二倍,红黑

  • 微信小程序访问mysql数据库流程详解

    目录 1 开通云上的mysql 2 创建自定义连接器 3 创建云函数 4 安装依赖 5 出参映射 6 在小程序中使用连接器 总结 1 开通云上的mysql 经过询价,我发现阿里云的数据库是比较便宜的,新人购买非常划算.对于爱学习的博主来说,果断购买一个. 按照操作指引购买后,云会帮你创建一系列的环境,在控制台就可以看到属于自己的实例 点击操作列上的管理,就可以创建我们自己的数据库.配置的步骤是先创建数据库的账号 然后创建一个数据库 都设置好之后就可以登录数据库,创建表,加数据了 刚创建好的数据库

  • MyBatis集成Spring流程详解

    目录 一.Mybatis与spring集成 1. 导入pom依赖 2. 编写配置文件 3. 使用注解开发 4. 测试 5. 管理数据源 二.Aop整合pagehelper插件 要解决的问题 一.Mybatis与spring集成 1. 导入pom依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8

随机推荐