概述
在之前总结分支相关内容时说道,合并两个分支的提交可以使用git merge
,然而除了这种方式之外,还有一种方式就是使用git rebase
,这两种方式的最终结果都相同,但是合并历史却不同;git merge
是将两个分支做一个三方合并(如果不是直接上游分支),这样一来,查看提交历史记录,可能会显得非常凌乱。git rebase
则会将当前分支相对于基低分支的所有提交生成一系列补丁,然后放到基底分支的顶端,从而使得提交记录变称一条直线,非常整洁。
git merge 和 git rebase 区别
假设现在本地仓库中有两个分支:master
分支和branch1
分支,提交历史用图来表示如下:
现在要合并branch1到master分支,如果使用git merge
则执行如下命令:
$ git checkout master
$ git merge branch1
合并后查看提交历史如下:
$ git log --graph --pretty="oneline"
* fe8799e0aec30e388306883960b4cf438d3f1ec4 Merge branch 'branch1'
|\
| * cf31255da6e84acc6f6840e3ceb0fd3129e2d73e UserA commit 3--branch1
| * 5c2d1c938f8e5f98dccaa0a5ab6222bd6b1cd75d UserA commit 2--branch1
* | 284aa3eb6c405411584d682a1387118fe92e4821 Usera commit master
* | 967fca58deb914ad1cda9ff84291fd946045207d Usera commit master
|/
* d989fc50530918b3b7b0ed68b31d6751c2302875 UserA commit 1
使用图来表示,本地仓库提交历史如下:
现在我们使用git rebase
合并原来的master
分支和branch1
分支,假设当前分支为branch1,基地分支为master:
$ git checkout branch1
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: UserA commit 2--branch1
Applying: UserA commit 3--branch1
Applying: Usera commit master
Applying: Usera commit master
合并后查看提交历史如下:
$ git log --graph --pretty="oneline"
* 6cf95c391ba7d43d0f5d95300130a43816af82c8 Usera commit master
* 63def8a8740b9b3c9f6c09ae49ba72faa9446cf6 Usera commit master
* 33049864f83a686bff9b2a2d8626427653a16f22 UserA commit 3--branch1
* 14ac1cac7357ccf35581c89e099793260264d3ea UserA commit 2--branch1
* d989fc50530918b3b7b0ed68b31d6751c2302875 UserA commit 1
使用图来表示,本地仓库提交历史如下:
可以看到,现在branch1
分支上相对于master
分支的提交,提交到了master
分支的顶端,如此一来整个提交记录保持在一条直线上。这就是git rebase
。
rebase原理
git rebase <branch>
的原理是:找到两个分支最近的共同祖先,根据当前分支(上例中branch1
)的提交历史生成一系列补丁文件,然后以基地分支最后一个提交为新的提交起始点,应用之前生成的补丁文件,最后形成一个新的合并提交。从而使得变基分支成为基地分支的直接下游。rebase一般被翻译为变基。
当branch1
分支完成变基后,直接变成了master
分支的下游了,这时切换到mas