在基于 Git 的开发过程中,我们很容易遇到合并代码的情况,例如我们从 master 分支拉取了一个 feature 分支,当我们开发到一段时间之后,可能需要将 master 的代码合并到我们当前的 feature 分支之中。
这时,我们有两个选择,一个是使用git merge
命令,一个是使用git rebase
命令,这两个命令都是用来合并代码的,但却有一些差异。在本文中,我们主要讲述git rebase
命令的使用方法,也会简单介绍这两个命令的差异。
如上图所示,我们从 master 分支拉取了一个名为 feature 的分支,并且在拉取新分支之后,有过三次提交记录;同时,master 分支在我们拉取 feature 分支之后,也有过两次提交记录。现在我们已经构造了背景,接下来我们合并代码。
首次,我们使用merge
命令,其命令形式一般为git merge --no-ff master
,即表示将 master 的代码合并到 feature 分支,其中--no-ff
参数是为了保留 master 分支的提交记录。如上图所示,在使用merge
命令进行代码合并之后,Git 会自动创建一个新的 commit 用来表示当前的合并操作,此 commit 记录了 master 代码合并到 feature 分支时产生的所有改动。
接下来,我们使用rebase
命令,其命令一般形式为git rebase feature
,即表示在 master 分支上执行rebase
命令,将 feature 分支的代码合并到 master 分支。如上图所示,在使用rebase
命令之后,Git 会合并两个分支的 commit 记录,其规则为「在基准分支上合并目标分支的代码,会将目标分支的提交记录全部前置到基准分支的最新提交记录之前」,就如上面这样,我们在 master 分支上使用了rebase
命令之后,Git 将 feature 分支上面的所有 commit 记录都前置到了 master 分支的最新 commit 记录之前。
在这里,需要注意的是:rebase
是以 commit 为维度的,按 commit 提交的顺序依次进行合并操作;如果在合并的过程中,某个 commit 遇到了冲突,则需要我们先解决该冲突,然后才能继续进行合并操作。特别地,在我们解决冲突之后,需要使用git add + 冲突文件
命令将当前冲突标记为已解决,然后使用git rebase --continue
命令继续合并操作。
通过上面的描述,我们能发现merge
和rebase
有一个很明显的差异,那就是当遇到冲突的时候,使用merge
命令,我们只需要解决一次冲突即可;使用rebase
命令,我们则需要依次解决每一个冲突。
对于 Git 的rebase
命令,其除了能进行代码合并之外,还有一个常用的功能,那就是将多个 commit 合并为一个,仍然以上面的 feature 分支为例,我们将其从 master 分支拉取之后,进行了三次提交,现在我们将这三个提交结论合并为一个,其命令一般形式为:
git rebase -i HEAD~N
其中,N
为我们需要合并的 commit 记录的数量,因为示例中是三次提交记录,所以在此场景下,将N
替换为3
即可。
在执行完上面的命令之后,我们会进入vi
或者vim
文件编辑器:
如上图所示,pick
标识了我们的三次提交记录,按i
建进入编辑模式,保留第一个pick
,然后将后面两个pick
修改为s
或者f
,然后键入:wq
保留修改。最后,为了将变更同步到远程分支,我们需要使用git push -f
命令,其中参数-f
表示强制提交。