转自:https://blog.csdn.net/liuxiaoheng1992/article/details/79108233

其实这个问题困扰我有一段时间,相信也有人和我一样有这个困扰,网上已有很多这种解释了,但是要么就是无图,要么就是解释的很乱,没太看懂,经过自己对git的使用,加上向同事请教,算是理解了这个问题,所以写下来分享一下,我尽量详细说明

merge与rebase的区别

假设我们有如下图一所示仓库,该仓库有master和develop两个分支,且develop是在(3.added merge.txt file)commit处从master拉出来的分支。


图一

merge

假设现在HEAD在(6.added hello.txt file)处,也就是在master分支最近的一次提交处,此时执行git merge develop, 结果如下图所示。


图二
工作原理就是:git 会自动根据两个分支的共同祖先即 (3.added merge.txt file)这个 commit 和两个分支的最新提交即 (6.added hello.txt file) 和 (5.added test.txt file) 进行一个三方合并,然后将合并中修改的内容生成一个新的 commit,即图二的(7.Merge branch ‘develop’)。
这是merge的效果,简单来说就合并两个分支并生成一个新的提交。

rebase

那rebase是这么工作的呢?
假设初始状态也是图一所显示的。两个分支一个master,一个develop,此时HEAD在(6.added hello.txt file)处,现在执行git rebase develop,结果如下图三所示。


图三
可以看见develop分支分出来分叉不见了,下面来解释一下它的工作原理:
在执行git rebase develop之前,HEAD在(6.added hello.txt file)处,当执行rebase操作时,git 会从两个分支的共同祖先 (3.added merge.txt file)开始提取 当前分支(此时是master分支)上的修改,即 (6.added hello.txt file)这个commit,再将 master 分支指向 目标分支的最新提交(此时是develop分支)即(5.added test.txt file) 处,然后将刚刚提取的修改应用到这个最新提交后面。如果提取的修改有多个,那git将依次应用到最新的提交后面,如下两图所示,图四为初始状态,图五为执行rebase后的状态。

图四

图五
简单来说,git rebase提取操作有点像git cherry-pick一样,执行rebase后依次将当前的提交cherry-pick到目标分支上,然后将在原始分支上的已提取的commit删除。

merge OR rebase

那什么时候用merge,什么时候用rebase呢?
再举个例子:
初始状态如下图六所示:
和之前一样的是,develop分支也是在 (3.added merge.txt file)处从master分支拉取develop分支。不一样的是两个分支各个commit的时间不同,之前develop分支的4和5commit在master分支3之后6之前,现在是develop分支的4提交早于master分支的5提交,develop分支的6提交晚于master的5提交早于master的7提交。


图六
在上图情况下,在master分支的7commit处,执行git merge develop,结果如下图七所示:

图七
执行git rebase develop,结果如下图八所示:

图八
1. 可以看出merge结果能够体现出时间线,但是rebase会打乱时间线。
2. 而rebase看起来简洁,但是merge看起来不太简洁。
3. 最终结果是都把代码合起来了,所以具体怎么使用这两个命令看项目需要。

还有一点说明的是,在项目中经常使用git pull来拉取代码,git pull相当于是git fetch + git merge,如果此时运行git pull -r,也就是git pull –rebase,相当于git fetch + git rebase

最后推荐一些git可视化工具,我用的是gitkraken,这些工具功能基本一样,看个人喜欢好使用

鸣谢:感谢我的同事张帆同学在git方面的指导

git merge 与 git rebase的区别相关推荐

  1. git merge 和 git rebase的区别

    (1)git rebase 让你的提交记录更加清晰可读 git rebase 的使用 rebase 翻译为变基,他的作用和 merge 很相似,用于把一个分支的修改合并到当前分支上. 如下图所示,下图 ...

  2. git merge 和 git rebase详解

    git merge 和 git rebase 都是用来合并两个分支的. git merge b   #把b分支合并到当前分支 git rebase b   #把b分支合并到当前分支 --------- ...

  3. git(8)---git merge 和 git rebase 小结

    git merge 和 git rebase 小结 git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 同样 git rebase b,也是把 b分支合并到当 ...

  4. git merge和git merge --no-ff有什么区别?

    本文翻译自:What is the difference between `git merge` and `git merge --no-ff`? Using gitk log , I could n ...

  5. git merge\git merge --no-commit\git merge --squash区别

    假设现有分支develop.test.需要将test合并到develop分支. 首先git checkout develop. git merge test test分支会合并到develop,会有t ...

  6. git merge squash 和 rebase 区别

    在合并分支的时候,默认是有三种选项的,分别是 普通的 merge squash merge rebase merge 普通 Merge 说到合并分支,可能我们最熟悉的操作是这样的: 先切换到目标分支: ...

  7. [转]git merge 与 git rebase的区别

    git log --graph可以查看分支合并图 1>他们都是用于从一个分支获取并且合并到当前分支 2>一个场景:在feature分支进行新特性的开发,与此同时,master分支也有新的提 ...

  8. 自动化部署之git merge和git rebase的区别

    命令行测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3 ...

  9. git merge 和 git rebase 小结

    Git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 同样 git rebase b,也是把 b分支合并到当前分支 ---------------------- ...

最新文章

  1. 庆祝一下,基于JXTA的P2P文件共享传输文件测试成功。
  2. SqlServer还原数据库时提示:异常终止,不能在此版本的SQL Server中启动,因为它包含分区函数
  3. 12.IDA-虚函数和虚表
  4. linux启动Spark本地模式(Local模式)
  5. 制作mac系统安装U盘
  6. 程序高手和菜鸟的区别是什么?
  7. 网友半夜差点被沐浴露吓死,众人:原来不止我胆小....
  8. 休眠事实:如何“断言” SQL语句计数
  9. FPN论文解读(附网络结构层次代码)
  10. 标准工业关系型数据库和对象关系数据库
  11. python网课推荐-python网课什么平台好
  12. 提取过程_[论文荐读]石榴皮提取物对生猪肉饼品质的影响
  13. C语言课程设计图形库
  14. 无人车之美——论无人车辆系统的软件架构
  15. java 注解field_jackson学习之七:常用Field注解
  16. 37、T5L迪文屏C51开发之绘制2D形状
  17. java实现统计pv和uv_shell统计pv与uv、独立ip的方法
  18. 什么是favicon.ico,以及如何使用它
  19. 智能座舱域控制器功能自动化测试方案
  20. Tomcat8启动不了的问题

热门文章

  1. VS系列编译器内部调用malab(32位/64位)函数指南
  2. MFC工程按USB插口显示所有USB设备及插口(包括安卓)
  3. STM32那点事(5)_ADC(上)
  4. NumPy Matplotlib PIP安装
  5. 图像质量评价指标: PSNR 和 SSIM
  6. 5-13自定义sink到MySQL.
  7. track_info分区表的创建并将ETL的数据加载到Hive表
  8. android h5语音,html5录音支持pc和Android、ios部分浏览器,微信也是支持的,JavaScript getUserMedia...
  9. python3 字符串格式化_Python3-字符串格式化
  10. 论 js中:(class、id)出乎意料的优先级?- 案例篇