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,这些工具功能基本一样,看个人喜欢好使用

鸣谢:感谢我的同事张帆同学在git方面的指导
---------------------
作者:Michaelliu_dev
来源:CSDN
原文:https://blog.csdn.net/liuxiaoheng1992/article/details/79108233
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/zjm-1/p/10139860.html

时间: 2024-10-07 11:30:34

git merge 与 git rebase的区别的相关文章

闲谈 git merge 与 git rebase 的区别

前言 相信大部分使用 Git 的朋友都会遇见相同的疑问,并且也从网上搜索了不少资料.那么,为什么我还要写这篇文章呢?因为我想尝试从自己的角度解释这个问题,如果能给到大家灵光一闪的感悟,便善莫大焉啦.估计点进来的朋友也对 merge 和 rebase 有了一定了解,所以我也就不浪费篇幅再去详细介绍 merge 和 rebase,让我们直入主题吧. merge 与 rebase 的区别 merge 现在假设我们有一个主分支 master 及一个开发分支 deve,仓库历史就像这样:现在如果在 mas

git merge 及 git rebase的区别

Git上合并代码有git merge 及 git rebase 两种方式. 前置知识点 Master分支:首先,代码库应该有一个.且仅有一个主分支.所有提供给用户使用的正式版本,都在这个主分支上发布.这个分支被称为Master分支: Develop分支:主分支只用来分布重大版本,日常开发应该在另一条分支上完成.我们把开发用的分支,叫做Develop分支.这个分支可以用来生成代码的最新隔夜版本(nightly).如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"

git merge vs git rebase

背景 开发过程,可能遇到这种情况 git merge效果 git checkout feature git merge master git rebase效果 git checkout feature git rebase master 参考 https://www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview 版权声明:本文为博主原创文章,未经博主允许不得转载.

git第七节---git merge和git rebase

# git merge和git rebase 都可以进行分支合并 #git merge 合并后保留记录两个分支的记录 #git rebase合并后会展示成一个分支的记录,另一个分支的提交实际生成了一个副本 冲突解决 git merge在解决冲突后需要手动通过git add ,git commit 再生成一次提交 git rebase 在解决冲突后会自动生成一次提交 git merge 一次性会解决之前提交记录中的所有冲突 git rebase 一次只会解决一次提交上的冲突,如果多次提交都有冲突,

【译文】Git merge 和 Git rebase比较

[译文]Git merge 和 Git rebase比较 原创: 胡江华 胡同学和朋友们的成长日记 2017-03-22 git rebase 这个命令经常被人认为是一种Git巫术,初学者应该避而远之.但如果使用得当的话,它能给你的团队开发省去太多烦恼.在这篇文章中,我们会比较git rebase和类似的git merge命令,找到Git工作流中rebase的所有用法. 概述 你要知道的第一件事是,git rebase 和git merge 做的事其实是一样的.它们都被设计来将一个分支的更改并入

[git] git merge 和 git merge --no-ff

git merge 和 git merge --no-ff 根据这张图片可以看出 git merge –no-ff 可以保存你之前的分支历史.能够更好的查看 merge历史,以及branch 状态. git merge 则不会显示 feature,只保留单条分支记录 一时间没看明白: git merge效果: git merge –no-ff效果 附录: https://segmentfault.com/q/1010000002477106 sourcetree使用教程: http://blog

git各种命令 & git merge和git rebase的区别

git merge 和 rebase的区别: http://blog.csdn.net/jollyjumper/article/details/24743751 对于两个分支而言,rebase和merge没有区别,但是rebase更干净,因为log hisitory是线性的,但commit不一定按日期先后排,而是local commit总在后面,merge之后history变得比较复杂,但是commit按日期排序,stackoverflow上有个图示很好: http://stackoverflo

git merge和git rebase的区别(转)

Description git rebase 和 git merge 一样都是用于从一个分支获取并且合并到当前分支,但是他们采取不同的工作方式,以下面的一个工作场景说明其区别 场景:  如图所示:你在一个feature分支进行新特性的开发,与此同时,master 分支的也有新的提交. 为了将master 上新的提交合并到你的feature分支上,你有两种选择:merging or rebasing merge 执行以下命令: git checkout feature git merge mast

git merge 和 git rebase 小结(转)

git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 同样 git rebase b,也是把 b分支合并到当前分支 ----------------------------------- 他们的 原理 如下: 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 假设远程分支"origin"已经有了2个提交,如图 现在我们