git merge VS git rebase

1.git merge

如下图,图片中每一个节点都代表着一个commit,他们从下往上看,直到最新。图片最左边代表着,B分支A分支拉出来的一个时间节点,在commit C提交后拉出的B分支
在这里插入图片描述
当我们处于A分支时,执行git merge B分支会发生什么事情呢?可以看到图片中间,相当于将commit Xcommit Y两次提交,作为了新的commit Z提交到了A分支上。

上图中这个新的commit Z提交节点,也被称为合并提交点

这就代表着B分支代码的提交已经合并到了A分支上,简单明了

如果后面A分支要是还有提交,那就如上面图片右边展示的那样,最新的提交在最上方。

下面来看一个具体的例子:

初始化项目:
在这里插入图片描述
新建并且切换到b分支,并且在b分支提交两次记录:
在这里插入图片描述
切换到a分支,并且在a分支再提交两次记录:
在这里插入图片描述
打印当前a分支的版本记录:
在这里插入图片描述
切换到b分支,打印版本记录:
在这里插入图片描述
再切换到a分支,合并b分支代码:
在这里插入图片描述
如上图,b-333b-444的提交的hash值没有发生改变。并且有一条新的记录提交到了a分支

2.git rebase

rebase的使用方式与merge,类似它就相当于插队:

git checkout feature
git rebase main

merge不同的是,rebase并不会保留原有的提交,而是会创建当前分支比目标分支更新的所有提交的副本,在上述例子中(将feature变基到main)就是2'4'(两个分支的22',44'虽然提交的代码一样,但提交的时间信息,提交的hash值都是不同的。),然后将2'4'按次序插入目标分支末尾
在这里插入图片描述
这样就完成了一个rebase的过程(注意,这条分支是feature分支而不是main分支,原先的提交2提交4已经被抛弃了),feature分支实际的样子是:
在这里插入图片描述
你可以理解为,把feature分支rebase(变基)到main分支的意思是:让你现在的feature分支基于最新的main分支重新开发(创建副本并且移动到末尾)

下面来看一个具体的例子:

初始化项目:
在这里插入图片描述

新建并且切换到b分支,并且在b分支提交一次记录:
在这里插入图片描述
切换到a分支,并且在a分支再提交一次记录:
在这里插入图片描述
切换到b分支,并且在b分支再提交一次记录:
在这里插入图片描述
切换到a分支,并且在a分支再提交一次记录:
在这里插入图片描述
切换到b分支:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们发现变基后的b分支b:222b:444提交的hash值发生了变化。

切换到a分支:
在这里插入图片描述

3.git rebase的注意点

rebase 有一个非常大的坑,那就是它会改变提交历史。

想象一下你和你同事都在开发 main 分支,然后在你开发的时候,你的同事突然把 main 变基了,假设你们之前是这样的:
在这里插入图片描述

结果现在变成了这样子:
在这里插入图片描述
原来的提交5直接消失了,你的分支已经跟 main 分支匹配不上了,那现在你还能正常把你的分支合入到 main 分支中吗?显然不可以。

所以,main 分支是万万不能使用 rebase 的!!!

在你打算 rebase 的时候,一定要想想是否还有别人也在开发这个分支。

4.总结

git mergegit rebase
特点合并分支将展示完整的commit历史记录会丢失commit节点源信息,合并日志是单线性的
缺点分支多了,日志会比较繁琐无法溯源
使用场景如果我们是多人协同开发同个分支,建议使用merge如果是私有分支,使用rebase即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值