0008-Git不完全操作指南之本地操作4——rebase

20 阅读2分钟

概念

我们刚刚学习了merge的方式进行合并分支,也知道了,使用merge会有产生一条新的提交记录的弊端,那么,我们现在来学习一下另一种合并分支的方式:rebase

第二种合并分支的方法是 git rebase。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。

图示

我们现在准备了一个虚拟的git仓库,现在想要将bugFix分支合并到main分支中,注意,当前分支是打了*bugFix

rebase1

这次我们用rebase试一下

git rebase main
# 这个命令的意思是以main分支作为基础,把当前分支(bugFix分支)合并过去

rebase2

我们可以看到,不同与merge命令会产生一条新的提交记录以及分叉,我们使用rebase合并分支时,会根据我们设置的变基基础main,让目标分支在这个基础之下继续线性接入,这样,我们的分支看起来,始终都是一个极为有序且不分叉的链表了,这样看起来,我们的提交记录会不会比使用merge更加清晰明了呢?

注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 main 分支上的 C3 的副本。

现在唯一的问题就是 main 还没有更新,下面我们来看一下如何让main也更新一下。

# 此时,我们只需要切换到main分支,以bugFix为基再变基一下即可
git checkout main
git rebase bugFix

checkout

rebase

我们可以看到,由于通过第一次变基(rebase)之后,bugFix分支是继承于main分支的,因此,我们在第二次变基时,只需要将main分支指针直接指向bugFix分支所指向的提交记录C3'即可。

常用命令

# 打开交互式命令,你可以在一个ui编辑器中,如vi编辑器中对提交记录进行一些处理,你可以删除某一条或多条提交记录,可以调整提交记录的顺序、可以修改提交记录的提交信息等等。
git rebase -i

以下是在交互操作中支持的命令

命令缩写含义
pickp保留该commit
rewordr保留该commit,但需要修改该commit的注释
edite保留该commit, 但我要停下来修改该提交(不仅仅修改注释)
squashs将该commit合并到前一个commit
fixupf将该commit合并到前一个commit,但不要保留该提交的注释信息
execx执行shell命令
dropd丢弃该commit