git rebase 和 git merge 一样都是用于从一个分支获取并且合并到当前分支,但是他们采取不同的工作方式,以下面的一个工作场景说明其区别。
场景:
如图所示:你在一个feature分支进行新特性的开发,与此同时,master 分支的也有新的提交。
首先master上有三个原始文件:
然后git checkout -b feature,在feature上进行新特性的开发如下:3feature.text和4feature.text
然后有回到master上新增加了两个文件,3master.text和4master.text
结构如下所示:
为了将master 上新的提交合并到你的feature分支上,你有两种选择:merging
or rebasing
merge
执行以下命令:
git checkout feature
git merge master
那么此时在feature上git 自动会产生一个新的commit(merge commit)
如图所示:
结构就像这样子:
marge 特点:自动创建一个新的commit
如果合并的时候遇到冲突,仅需要修改后重新commit
优点:记录了真实的commit情况,包括每个分支的详情
缺点:因为每次merge会自动产生一个merge commit,所以在使用一些git 的GUI tools,特别是commit比较频繁时,看到分支很杂乱。
rebase
本质是找公共祖先
首先还是和上面一样,不同是我们这次采用rebase的命令
git checkout feature
git rebase master
会合并之前的commit历史:
如下图所示:
结构图如下:
rebase 特点:会合并之前的commit历史
优点:得到更简洁的项目历史,去掉了merge commit
缺点:如果合并出现代码问题不容易定位,因为re-write了history
综上所述:
- 可以看出merge结果能够体现出时间线,但是rebase会打乱时间线。
- 而rebase看起来简洁,但是merge看起来不太简洁。
在项目中经常使用git pull来拉取代码,git pull相当于是git fetch + git merge,
如果此时运行git pull -r,也就是git pull --rebase,相当于git fetch + git rebase