概念
我们刚刚学习了merge
的方式进行合并分支,也知道了,使用merge
会有产生一条新的提交记录的弊端,那么,我们现在来学习一下另一种合并分支的方式:rebase
。
第二种合并分支的方法是 git rebase
。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。
图示
我们现在准备了一个虚拟的git仓库,现在想要将bugFix
分支合并到main
分支中,注意,当前分支是打了*
的bugFix
。
这次我们用rebase
试一下
git rebase main
# 这个命令的意思是以main分支作为基础,把当前分支(bugFix分支)合并过去
我们可以看到,不同与merge
命令会产生一条新的提交记录以及分叉,我们使用rebase
合并分支时,会根据我们设置的变基基础main
,让目标分支在这个基础之下继续线性接入,这样,我们的分支看起来,始终都是一个极为有序且不分叉的链表
了,这样看起来,我们的提交记录会不会比使用merge
更加清晰明了呢?
注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 main 分支上的 C3 的副本。
现在唯一的问题就是 main 还没有更新,下面我们来看一下如何让main也更新一下。
# 此时,我们只需要切换到main分支,以bugFix为基再变基一下即可
git checkout main
git rebase bugFix
我们可以看到,由于通过第一次变基(rebase
)之后,bugFix
分支是继承于main
分支的,因此,我们在第二次变基时,只需要将main
分支指针直接指向bugFix
分支所指向的提交记录C3'
即可。
常用命令
# 打开交互式命令,你可以在一个ui编辑器中,如vi编辑器中对提交记录进行一些处理,你可以删除某一条或多条提交记录,可以调整提交记录的顺序、可以修改提交记录的提交信息等等。
git rebase -i
以下是在交互操作中支持的命令
命令 | 缩写 | 含义 |
---|---|---|
pick | p | 保留该commit |
reword | r | 保留该commit,但需要修改该commit的注释 |
edit | e | 保留该commit, 但我要停下来修改该提交(不仅仅修改注释) |
squash | s | 将该commit合并到前一个commit |
fixup | f | 将该commit合并到前一个commit,但不要保留该提交的注释信息 |
exec | x | 执行shell命令 |
drop | d | 丢弃该commit |