git merge 和 git rebase 的区别

您所在的位置:网站首页 rebase和merge的区别 git merge 和 git rebase 的区别

git merge 和 git rebase 的区别

2023-08-25 13:54| 来源: 网络整理| 查看: 265

git merge vs. git rebase

本人原来一直都是个人单机使用git,使用的操作基本只限于git add和git commit,对git的其他操作都是一知半解。直到现在进入公司接触团队开发,需要了解必要的分支相关的知识,其中最让我费解的就是git merge和git rebase了,于是花了半天时间好好了解了一下相关知识,写下本文记录一下。

首先,本文不考虑发生冲突的情况,只是描述了两种操作的原理以及区别。

git merge操作

git merge的操作分为以下两种情况:

fast-forward模式

假设你现在的分支情况如图所示:

在这里插入图片描述

如今你已经完成了基于master分支的问题分支hotfix,此时你需要将hotfix分支进行合并,操作如下:

$ git checkout master $ git merge hotfix Updating f42c576..3a0874c Fast-forward index.html | 2 ++ 1 file changed, 2 insertions(+)

git merge操作首先会找到两个分支的公共分支C2,判断公共分支C2到两分支的路线是否有分叉(即两分支的提交历史是否是线性的),如果没有分叉,则默认使用fast-forward模式,git合并两者时只会简单的将master指针从C2移动到hotfix指针相同的位置C4。

在这里插入图片描述

三方合并

当然,在正常生产环境中出现公共分支有分叉的情况往往更容易见到。接着上文的情形,合并并删除hotfix分支后,你回到iss53的工作中完成了后续工作。

在这里插入图片描述

此时你需要将iss53合并到master分支,这里同样通过git merge进行合并操作:

$ git checkout master Switched to branch 'master' $ git merge iss53 Merge made by the 'recursive' strategy. index.html | 1 + 1 file changed, 1 insertion(+)

此时两个分支的公共分支C2到两分支的路线有分叉,所以git会使用两分支所指快照C4和C5以及两分支的公共祖先C2做一个简单的三方合并。

在这里插入图片描述

它将创建一个提交记录,其父提交记录有两个,此时的提交记录已经变成拓扑结构了。此时可以删除iss53分支,拓扑结构仍旧保留。

(注:对于前面的fast-forward的情况,如果要在此情况下执行三方合并,需要输入git merge --no-ff指令)

git rebase操作

理解rebase的字面意思对于了解该指令操作起到很好的作用。rebase的意思是“变基”,理解为“基底的改变”,琢磨这个单次的含义,继续下面的情形。

在这里插入图片描述

假设此时有两个分支,我们想将master分支合并到experiment(不要搞反对象,更改的分支为experiment),此时我们进行git rebase操作:

$ git checkout experiment $ git rebase master First, rewinding head to replay your work on top of it... Applying: added staged command

首先给出git rebase的结果

在这里插入图片描述

下面来说原理,总结为:

找两分支的公共祖先C2,为当前基底当前分支C4对于公共祖先C2的修改保存Actions(C2


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3