git merge 和 git rebase 都是用于合并某分支到当前分支的命令。


下面会基于一个示例介绍具体的区别。


第一天,master分支上已经有了两个提交,分别为c1、c2,这时我们新建了一个分支dev,如下图所示:

image.png

第二天,master分支上有了三次提交,dev分支上有了两次提交,如下图所示:

image.png

如果使用merge来合并修改,合并的命令为:

git checkout master
git pull
git checkout dev
git merge master

合并后的分支历史图如下:

image.png

为了让分支历史图更好看一些,你可以使用git rebase,命令如下:

git checkout dev
git rebase master

以上命令会把你的dev分支里的每个提交取消掉,并且把它们临时保存为补丁(patch),这些补丁放在.git/rebase目录里,然后把dev分支更新为最新的master分支内容,最后把这些保存的补丁应用到dev分支中。

此时分支历史图如下:

image.png

在rebase的过程中,也许会出现冲突(conflict),这时git会停止rebase并让你解决冲突,在解决完冲突后,可以使用git add命令去更新这些内容的索引,然后使用git rebase --continue继续应用(apply)余下的补丁。

在任何时候,你可以使用git rebase --abort命令来终止rebase的行动,使dev分支回到rebase开始前的状态。