【GIT】rebase -- 与merge的区别,合并多次commit

前情提要:在公司,有某个长时间存在于功能分支的未合到主分支的代码,某日需要合代码。mentor说让我先rebase一下,之前很少用到,于是乎谷歌一顿操作,并实操多次,产出以下结论~~

什么是rebase?与merge的区别?

直接使用merge

在将功能分支合到主分支的场景时,如果直接使用merge,则会找到功能分支的最新提交和主分支的最新提交的共同祖先,如同C2

将功能分支的最新提交和主分支的最新提交进行合并,生成一个新的commit,此时可能需要解决冲突。之后两个分支上所有的commit会按照时间顺序排列到主分支的共同祖先之后。

可以看到在直接merge的情况下,会生成一个新的commit,且所有提交按照时间顺序排列。

先rebase,再merge

在merge之前,拉取主分支的最新代码,先在功能分支上使用rebase,如 git rebase master。则功能分支上的所有未合并commit,会基于主分支上的最新commit,形成各自的patch,此时功能分支上的所有未合并commit都会形成新的hash值。

可以看到,先rebase会让所有分支呈直线排列,且并不按照时间顺序,并不会形成一个新的分支。

合并多次commit

很多时候,在开发一个功能时,经常会有多次提交,为了让一些没有太大改动的提交,看起来更简洁,可以通过git rebase -i合并多次commit。后面需要带上,想要合并的commit之前的一个commit的hash值。运行此命令后,会进入交互状态,可以修改commit的状态和提交信息。从想要合并的commit的第二个commit开始,将状态改为squash,表示合并分支,rebase过程中可能会产生冲突。rebase结束后,将多个commit信息更改成整个功能的提交信息,成功后就成功将需要合并的commit合并成一个了,且提交信息为更改后的信息。
查看提交记录,第三个为想要合并的commit之前的一个commit。

git rebase -i [hash],进入交互模式,此处我的vscode编辑器插件自动打开了界面,从想要合并的commit的第二个commit开始,将状态改为squash。rebase后,(此处可能需要解决冲突)进入提交信息编辑页,未注释的两行即合并的两个提交的提交信息,手动修改提交信息,关闭编辑页,即rebase成功。


再次查看提交记录,可以看到两个commit合并成了一个

原文地址:https://www.cnblogs.com/ashen1999/p/14830442.html