技术分享04 - Rebase
🌰 一个例子
-
假设
1-2-3
是master
分支的状态; -
此时从
master
分支中 checkout 了一个feat
分支出来; -
master
提交了4-5
,feat
分支提交了6-7
; -
所以现在
master
分支的状态为1-2-3-4-5
,feat
分支的状态为1-2-3-6-7
。
- 如果将
feat
分支 rebase 到master
分支上,feat
分支的状态就变成了1-2-3-4-5-6-7
;
- 如果将
feat
分支 merge 到master
上,master
分支的状态就变成了1-2-3-4-5-6-7-8
;- 这里的
8
就是“Merge branch ‘feat’ into ‘master’”的 commit 。
- 这里的
rebase & merge
**rebase **会把你当前分支(上例中的 master)的 commit 放到目标分支(上例中的 feat)的最后面,所以叫变基。
Rebase 和 Merge 实际上只是应用场景不同:
例如现有上游分支 master,基于 master 分支拉出来一个开发分支 feat,在 feat 上开发了一段时间后要把 master 分支提交的新内容更新到 feat 分支,此时切换到 feat 分支,使用 git rebase master
等 feat 分支开发完成后,要合并到上游分支 master 上的时候,切换到 master 分支,使用 git merge feat
使用 rebase 和 merge 的基本原则:
- 下游分支更新上游分支内容的时候使用
rebase
- 上游分支合并下游分支内容的时候使用
merge
- 更新当前分支的内容时一定要使用
--rebase
参数
rebase 命令
更新代码应使用 git pull origin feat --rebase
而不是 git pull origin feat
,因为 git pull
这条命令默认使用了 --merge
的方式更新代码。
⚠️ 但是在我们 rebase 后,直接使用 git push origin feat
会出现报错,我猜测原因是:使用 rebase 之后,feat 分支上有了 master 上所有的提交,也就是 master 分支的修改在 feat 分支上重演了一遍,相对远程 feat 分支而言,本地仓库的 feat 分支的“基底”已经变化了,直接 push
是不行的,所以确保没有问题的情况下必须使用 --force
参数才能提交。