git怎么合并分支代码

发布时间 - 2023-01-04 00:00:00    点击率:
git合并分支代码的方法:1、使用“git merge”命令,该命令用来做分支合并,可以将其他分支中的内容合并到当前分支中。2、使用“git rebase”命令,该命令用于改变当前的分支的基点,进而实现分支合并。

本教程操作环境:Windows7系统、Git2.30.0版、Dell G3电脑。

在项目中,我们总会创建很多分支进行不同功能或者需求的开发,等功能完成后再合并回主分支。那么如何才能优雅的合并分支呢?如果此时你提起了兴趣,那么不妨继续读下去了。

建立多人开发场景

1. 创建仓库

// 初始化仓库
git init
// 创建a.txt
touch a.txt
// 创建b.txt
touch b.txt
// 加入暂存区
git add .
// 提交
git  commit -m 'initial'

2. 创建 feature 分支

git checkout -b feature

3. 两个分支同时开发

feature 分支开发下一版本新功能,提交了两次,分别修改 a.txt 文件和 b.txt 文件。

master 分支开发本次版本功能,同样提交了两次,且修改了 a.txt 文件和 b.txt 文件。


当前分支情况如下图,各节点上面的字符是每次 commit 的散列值,当前 master 分支的 header 在 c5 节点上,feature 分支的 header 在 c3 节点上。

这个时候需要将 feature 分支合并回 master 分支,有两种方案:

  • 在 master 分支上直接 merge feature 分支;

  • 是先在 feature 分支上 rebase(变基),然后在 master 分支上 merge feature 分支。

下面分别说明一下这两种方案:

合并命令1:git merge

git merge 用来做分支合并,将其他分支中的内容合并到当前分支中。

git merge 操作比较暴力,也是用的比较多的方式,下面演示的是 feature 分支合并至 master 分支,具体过程如下:

  • 找到 feature 分支和 master 分支的最近共同祖先 commit 节点 c1;

  • 把 feature 分支的最新一次 commit 节点 c3 和 master 分支上的最新一次 commit 节点 c5 合并,此时若有冲突,则一次性解决所有冲突,然后生成一个新的 commit 节点 c6;

  • 同时根据两个分支上的 commit 时间的先后顺序,依次放到 master 分支上,使用git log可以看到时间顺序。

上面流程的结果示意图如下所示:

在项目中的操作命令如下。可以看到执行 git merge feature 命令后,存在冲突,进入 merging 工作区,然后一次性解决所有冲突后,提交一个新的 commit。

执行 gitk 命令行,可以在界面上看到当前分支如下图所示。有一个新的 commit。

合并命令2:git rebase

这个命令从名字上就可以直观看出它的功能:改变当前的分支的基点。对于 feature 分支,它是从 master 分支的 c1 节点创建的分支,所以它的基点就是 c1。如果在 feature 分支上执行 git rebase master ,其过程大致如下:

  • 找到当前 master 分支最新的 commit 节点 c5,将 feature 分支的基点变成 c5 节点。;

  • 若 feature 分支与 master 分支存在冲突,那么将根据 feature 分支的提交时间,依次解决冲突,并修改 feature 分支此次 commit 的散列值。

  • 最终在分支上看,呈现一条直线,但是存在历史commit覆写的问题。

上面过程的结果示意图如下所示,其中 c2’和 c3’表示散列值改变了。

值得注意的是:

  • 执行 rebase 操作的时候,需要保证 master 分支处于最新状态,否则在 merege 合并的时候也可能存在冲突,就失去使用 rebase 的意义。

  • 千万不要对已经推到远程的内容进行rebase,如果有人拉取远程代码后修改并提交,分支会变得极其麻烦。

了解其基本过程后,我们就可以是用 rebase 命令开始进行合并分支的操作:

  • 在项目中执行 git rebase master,如下所示。因为两次提交都存在冲突,故在 rebase 工作区中需要依次解决这些冲突。

在 feature 分支上执行 gitk 命令,可以在界面中看到:

  • feature 分支完成变基之后,切换回 master 分支执行 git merge feature,就可以完成合并操作。

在 master 分支上执行 gitk,其分支结构如下。可以看到分支呈现一条线,看上去非常清爽。

说明:git stash

有时候分支上的代码还没开发完成,需要合并分支,此时只需要:

1、执行 git stash 将工作区内容存储起来,然后选择上述两种合并分支的方式进行分支合并。

2、完成分支合并后,切回开发的分支,执行 git stash pop 将工作区内容弹出就可以继续愉快的写代码了。

总结

git merge 比较粗暴,也是大多数会选择的方式,这种方式可以保证每个 commit 都按照时间顺序排列,但是分支图会非常凌乱,而会引入一次没有意义的 commit。

git rebase 在历史提交记录就是一条线,非常优雅,但存在修改历史commit的风险,并且git log查看日志时commit时间线错乱。同时,谨记已推送至远程的内容就不要再变基,否则分支会变得很乱。

个人倾向于使用 rebase 方法,毕竟 commit 的认知成本摆在那里,而且看着也舒服。不过如果开发人员很多,还是merge吧,毕竟一个个解决冲突会烦死个人,哈哈哈

在项目中,我们总会创建很多分支进行不同功能或者需求的开发,等功能完成后再合并回主分支。那么如何才能优雅的合并分支呢?如果此时你提起了兴趣,那么不妨继续读下去了。


# git  # 所示  # 两次  # 就可以  # 可以看到  # 的是  # 总会  # 区内  # 等功能  # 如下图  # 一条线 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Android使用GridView实现日历的简单功能  七夕网站制作视频,七夕大促活动怎么报名?  BootStrap整体框架之基础布局组件  如何实现建站之星域名转发设置?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel如何使用Livewire构建动态组件?(入门代码)  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何快速搭建FTP站点实现文件共享?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何在企业微信快速生成手机电脑官网?  香港服务器选型指南:免备案配置与高效建站方案解析  如何在IIS中新建站点并配置端口与物理路径?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  iOS验证手机号的正则表达式  如何实现javascript表单验证_正则表达式有哪些实用技巧  QQ浏览器网页版登录入口 个人中心在线进入  bing浏览器学术搜索入口_bing学术文献检索地址  5种Android数据存储方式汇总  如何快速生成专业多端适配建站电话?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何快速搭建高效WAP手机网站吸引移动用户?  WEB开发之注册页面验证码倒计时代码的实现  如何快速生成橙子建站落地页链接?  免费视频制作网站,更新又快又好的免费电影网站?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何快速辨别茅台真假?关键步骤解析  中山网站推广排名,中山信息港登录入口?  如何在VPS电脑上快速搭建网站?  太平洋网站制作公司,网络用语太平洋是什么意思?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel如何处理文件下载请求?(Response示例)  高端云建站费用究竟需要多少预算?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  浅谈Javascript中的Label语句  Laravel DB事务怎么使用_Laravel数据库事务回滚操作