git merge 与 rebase

git中做跨分支的功能合并时常用到两个命令:mergerebase

merge

将A分支的修改合并到B分支;

  1. 基于A分支最新Commit与B分支最新Commi生成新Commit,head移动到新的commit
  2. 从两个分支的最近公共节点开始到新生成的Commit之间进行diff,如果有冲突,则手动解决随着最新commit提交
  3. merge后,A分支的commit和B分支的commit的hash不变
  4. merge后,如果用git log命令查看,两个分支的commit会以各自提交的时间顺序排序

rebase

改变A分支的基线到B分支的head位置,从而合入B分支的最新修改:

  1. 找到A分支与B分支的最近公共节点
  2. 将A分支的提交与B支公共节点后的所有提价逐个比较,直到移动到B的head
  3. 如果比较过程中遇到冲突,需要手动解决
  4. 基线修改后,A分支所有的Commit的Hash会变化
  5. rebase后,如果用git log命令查看,A分支的提交会接在B分支之后,不保证时间上的排序

举例

基于mater开了一个login分支并在上面进行登录功能开发。其他开发者更新了master的内容后,需要将master的内容合并入我的login分支
在这里插入图片描述
如上图,需要将master的E、F 合并入login。

如果使用merge,则会在login生成M节点,并将head执行M,M有两个parent分别是F和D
在这里插入图片描述

如果使用rebase,则从B开始,将C和D应用(逐个比较)到master的最后
在这里插入图片描述
注意,移动后的C、D与原来的C、D的hash不同,C的parent从B变为F。


最后


当需要进行跨分支功能合并时,推荐首先rebase。merge不行改变原来所有commit的parent关系,所以只好生成一个额外节点用来更新head的位置,这样会形成一个环形的提交记录。而rebase做了变基,所以可以保持直线的提交记录,这样的提交记录更容易维护。

发布了116 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/vitaviva/article/details/104759657