当前位置: 首页 > news >正文

git merge和git rebase区别

相同点:

前端项目合并代码的时候,有2种方式,git rebase和git merge,即它们都可以合并代码。

准备工作:

  • github上新建一个项目:

  • 项目clone到本地

clone完成以后进入该项目文件夹下,准备工作完毕。

实战案例分析

同学A:

  • 执行git log

可以看出此时该项目仅有一次提交记录

  • 执行新增文件a.txt,并本地提交一次后再次执行git log

这个时候打开github,刷新该项目的commit记录

发现远程仓库还是只有一次提交记录的,说明A同学还没有将自己最新的修改push到远程仓库,其他同学这个时候是看不到A的最新提交的

  • A同学将自己的最新提交Push到远程仓库

  • 再次刷新github 提交记录,发现已经多了一个A同学提交的最新记录了

切分支开发

  • 基于已有两次提交记录的本地master分支检出一个新分支dev,并将该分支推到远程仓库
  • 查看远程仓库,多了一个dev分支

  • 此时本地的git分支图类似如下

  • A同学开发功能

    假设A同学基于dev分支开发功能,在本地新做了三次代码提交,git log
    如下

那么此时的git分支图如下

  • 重点

如果此时在A同学准备进行第四次本地提交之前,另一个同学B向远程仓库推送了一个master分支的提交,即此时master实际的提交已经向前走了

我们这个时候在github上操作一次commit,模拟另一个同学此时push了master分支

 

  • A同学本地更新一下master分支

 发现master分支已经向前走了一次提交,此时的分支图如下

此时我们知道A同学开发的dev分支是基于C2提交点切出来的,而这个时候master分支已经被更新了

如果A同学开发完毕,需要将其所作的功能合并到master分支 ,他可以有两种选择:

 

直接git merge

如果A同学选择用git merge的方式进行合并dev到master分支,那么git会这么做

  1. 找出dev分支和master分支的最近共同祖先commit点,即C2

  2. 将dev最新一次commit(C5)和master最新一次commit(C6)合并后生成一个新的commit(C7),有冲突的话需要解决冲突

  3. 将以上两个分支dev和master上的所有提交点(从C2以后的)按照提交时间的先后顺序进行依次放到master分支上

git rebase 后再git merge

  1. rebase之前需要经master分支拉到最新

  2. 切换分支到需要rebase的分支,这里是dev分支

  3. 执行git rebase master,有冲突就解决冲突,解决后直接git add . 再git rebase --continue即可

此时的git log如下

发现采用rebase的方式进行分支合并,整个master分支并没有多出一个新的commit,原来dev分支上的那几次(C3,C4,C5)commit在rebase之后其hash值发生了变化,不在是当初在dev分支上提交的时候的hash值了,但是提交的内容被全部复制保留了,并且整个master分支的commit记录呈线性记录

其分支图最终如下

 

 

 

总结

  • git merge 操作合并分支会让两个分支的每一次提交都按照提交时间(并不是push时间)排序,并且会将两个分支的最新一次commit点进行合并成一个新的commit,最终的分支树呈现非整条线性直线的形式

  • git rebase操作实际上是将当前执行rebase分支的所有基于原分支提交点之后的commit打散成一个一个的patch,并重新生成一个新的commit hash值,再次基于原分支目前最新的commit点上进行提交,并不根据两个分支上实际的每次提交的时间点排序,rebase完成后,切到基分支进行合并另一个分支时也不会生成一个新的commit点,可以保持整个分支树的完美线性

另外值得一提的是,当我们开发一个功能时,可能会在本地有无数次commit,而你实际上在你的master分支上只想显示每一个功能测试完成后的一次完整提交记录就好了,其他的提交记录并不想将来全部保留在你的master分支上,那么rebase将会是一个好的选择,他可以在rebase时将本地多次的commit合并成一个commit,还可以修改commit的描述等

最后

如果你想要你的分支树呈现简洁,不罗嗦,线性的commit记录,那就采用rebase

否则,就用merge吧
 

 

相关文章:

  • git rebase实战操作
  • mac系统如何更改用户名及头像
  • internal/modules/cjs/loader.js:883 throw err;
  • Node: 001全局对象和模块化-如何给node传递参数?
  • Node: mysql学习笔记001
  • Node: MySQL学习笔记002
  • yarn错误The engine “node“ is incompatible with this module
  • Node: 001全局对象和模块化-常见的全局对象
  • node:快速启动一个列表服务器
  • vscode左下角git分支不见了(已解决)
  • 调用百度地图
  • mac电脑如何下载git
  • vscode中setting.json配置
  • css画一个卡通动画
  • 在 vue 中使用 vue-typed-js 实现打字机效果
  • Android Studio:GIT提交项目到远程仓库
  • Android 控件背景颜色处理
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • crontab执行失败的多种原因
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • HashMap ConcurrentHashMap
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java 网络编程(2):UDP 的使用
  • k个最大的数及变种小结
  • Python实现BT种子转化为磁力链接【实战】
  • Solarized Scheme
  • Vue全家桶实现一个Web App
  • webgl (原生)基础入门指南【一】
  • XForms - 更强大的Form
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 如何胜任知名企业的商业数据分析师?
  • 思维导图—你不知道的JavaScript中卷
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 译自由幺半群
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 自动记录MySQL慢查询快照脚本
  • UI设计初学者应该如何入门?
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 通过调用文摘列表API获取文摘
  • 整理一些计算机基础知识!
  • # centos7下FFmpeg环境部署记录
  • #Linux(权限管理)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (1)SpringCloud 整合Python
  • (4)logging(日志模块)
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (六)软件测试分工