位置:首页 > 工具类 > git

git合并分支命令git rebase和git merge

dearweb 发布:2022-05-26 08:39:48阅读:

目前开发者大概率都会使用到git来管理自己的代码,在使用过程中一定会涉及到分支合并,据我了解到,大部分开发者使用的是git merge这个命令,对于git rebase可能很多开发者没有真正了解过,本文来给大家介绍一下二者的差别。

merge和rebase的区别

1.git rebase和merge区别:merge命令不会保留merge的分支。merge时并没有产生一个commit。rebase需要基于一个分支来设置你当前的分支的基线。git merge将两个分支,合并提交为一个新提交,并且新提交有2个parent。git rebase会取消分支中的每个提交,并把他们临时存放,然后把当前分支更新到最新的origin分支,最后再把所有提交应用到分支上。

image.png

marge 特点:自动创建一个新的commit,如果合并的时候遇到冲突,仅需要修改后重新;

优点:记录了真实的commit情况,包括每个分支的详情;

commit缺点:因为每次merge会自动产生一个merge commit,所以在使用一些git 的GUI tools,特别是commit比较频繁时,看到分支很杂乱。


rebase注意事项:rebase过程中也会出现冲突,解决冲突后,使用git add添加,然后执行git rebase --continue,接下来git会继续应用余下的补丁。任何时候都可以通过如下命令终止rebase,分支会恢复到rebase开始前的状态 git rebase --abort;rebase最佳实践:不要对master分支执行rebase,否则会引起很多问题。一般来说,执行rebase的分支都是自己的本地分支,没有推送到远程版本库。

image.png


git rebase 的使用

rebase 翻译为变基,他的作用和 merge 很相似,用于把一个分支的修改合并到当前分支上。

如下图所示,下图介绍了经过 rebase 前后提交历史的变化情况。

image.png

现在我们来用一个例子来解释一下上面的过程。


假设我们现在有2条分支,一个为 master ,一个为 feature/1,他们都基于初始的一个提交add readme进行检出分支,之后,master分支增加了3.js,和4.js的文件,分别进行了2次提交,feature/1也增加了1.js和2.js的文件,分别对应以下2条提交记录。


master 分支如下图:

image.png


feature/1分支如下图

image.png

综合看一下

image.png


此时,切换到 feature/1 分支下,执行 git rebase master ,成功之后,通过 log 查看记录。

如下图所示:可以看到先是逐个应用了 mater 分支的更改,然后以 master 分支最后的提交作为基点,再逐个应用 feature/1的每个更改。

image.png


所以,我们的提交记录就会非常清晰,没有分叉,上面演示的是比较顺利的情况,但是大部分情况下,rebase 的过程中会产生冲突的,此时,就需要手动解决冲突,然后使用git add 、git rebase --continue的方式来处理冲突,完成 rebase,如果不想要某次 rebase 的结果,那么需要使用 git rebase --skip来跳过这次 rebase。


git merge 和 git rebase 的区别视图一览

不同于 git rebase的是,git merge 在不是 fast-forward(快速合并)的情况下,会产生一条额外的合并记录,类似Merge branch 'xxx' into 'xxx'的一条提交信息。

image.png

另外,在解决冲突的时候,用 merge 只需要解决一次冲突即可,简单粗暴,而用 rebase 的时候 ,需要一次又一次的解决冲突


git rebase 交互模式

在开发中,常会遇到在一个分支上产生了很多的无效的提交,这种情况下使用 rebase 的交互式模式可以把已经发生的多次提交压缩成一次提交,得到了一个干净的提交历史,例如某个分支的提交历史情况如下:

image.png

进入交互式模式的方式是执行:

git rebase -i <base-commit>

参数base-commit就是指明操作的基点提交对象,基于这个基点进行 rebase 的操作,对于上述提交历史的例子,我们要把最后的一个提交对象(ac18084)之前的提交压缩成一次提交,我们需要执行的命令格式是:

git rebase -i ac18084

此时会进入一个 vim 的交互式页面,编辑器列出的信息像下列这样。

image.png


想要合并这一堆更改,我们要使用 squash 策略进行合并,即把当前的 commit 和它的上一个 commit 内容进行合并, 大概可以表示为下面这样。

pick  ... ...
s     ... ...
s     ... ...
s     ... ...


修改文件后 按下:然后wq保存退出,此时又会弹出一个编辑页面,这个页面是用来编辑提交的信息,修改为feat: 更正,最后保存一下,接着使用git branch查看提交的 commit 信息,rebase 后的提交记录如下图所示,是不是清爽了很多?rebase 操作可以让我们的提交历史变得更加清晰。


image.png

特别注意,只能在自己使用的 feature 分支上进行 rebase 操作,不允许在集成分支上进行 rebase,因为这种操作会修改集成分支的历史记录。

24人点赞 返回栏目 提问 分享一波

小礼物走一波,支持作者

还没有人赞赏,支持一波吧

留言(问题紧急可添加微信 xxl18963067593) 评论仅代表网友个人 留言列表

暂无留言,快来抢沙发吧!

本刊热文
网友在读
手机扫码查看 手机扫码查看