git merge 与 git rebase的区别
前言
其实这个问题困扰我有一段时间,相信也有人和我一样有这个困扰,网上已有很多这种解释了,但是要么就是无图,要么就是解释的很乱,没太看懂,经过自己对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,这些工具功能基本一样,看个人喜欢好使用
---------------------
作者:Michaelliu_dev
来源:CSDN
原文:https://blog.csdn.net/liuxiaoheng1992/article/details/79108233
版权声明:本文为博主原创文章,转载请附上博文链接!
相关文章
- 区别 git clone 与 git pull
- Git的下载方法+版本控制器以及SVN与GIT的区别
- Git基本概念和下载安装
- Git入门学习到进阶3
- git 仅还原某个文件到历史版本
- Week29-脚手架发布模式git自动化流程开发
- Git下载与安装
- git拉取代码如何解决冲突_Git工具-git pull拉取代码时冲突的解决办法[通俗易懂]
- day10 | Git的正确使用姿势与最佳实践 | 第三届字节跳动青训营笔记
- 使用Git下载指定版本或指定commit
- 工作中常用的几个git命令
- git使用笔记
- 【Git】Git 分支管理 ( 创建并切换分支 | 查看分支 git branch | 合并分支 git merge dev | 删除分支 git branch -d dev )
- 【Git】Git 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )
- 【Git】Git 分支管理 ( 删除远程分支 | 查看远程分支 git branch -a | 删除远程分支 git push origin --delete feature1 )
- git之解决每次拉取、提交代码时都需要输入用户名和密码详解程序员
- Linux下一步步安装Git(linuxgit安装)
- 下使用git在Linux下使用Git:简单易学.(如何在linux)
- 使用Linux管理Git版本控制(linuxgit)
- Linux系统中利用Git快速配置步骤(linuxgit配置)
- Git 2.26 发布:传输协议 V2 成默认协议
- Linux内核管理:Git的力量(linux内核git)
- 极速学习:Linux下使用Git的基础知识(linux如何使用git)
- Linux下Git安装指南(linux下git安装)
- Git 中上下文切换的 4 种方式
- 教程:如何在 Linux 上卸载 Git?(linux卸载git)
- 轻松玩转Git:Linux环境下的版本管理(linux下使用git)
- 深入浅出:Linux下Git使用指南(linux下git使用)
- 让Oracle支持Git(oracle中的git)