技术分享04 - Rebase

🌰 一个例子

  • 假设 1-2-3master 分支的状态;

  • 此时从 master 分支中 checkout 了一个 feat 分支出来;

  • master 提交了 4-5feat 分支提交了 6-7

  • 所以现在 master 分支的状态为 1-2-3-4-5feat 分支的状态为 1-2-3-6-7

image-20210831204806627
  • 如果将 feat 分支 rebase 到 master 分支上feat 分支的状态就变成了 1-2-3-4-5-6-7

image-20210901114131396

  • 如果将 feat 分支 merge 到 mastermaster 分支的状态就变成了 1-2-3-4-5-6-7-8
    • 这里的 8 就是“Merge branch ‘feat’ into ‘master’”的 commit 。

image-20210831183024526

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 的基本原则:

  1. 下游分支更新上游分支内容的时候使用 rebase
  2. 上游分支合并下游分支内容的时候使用 merge
  3. 更新当前分支的内容时一定要使用 --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 参数才能提交。

image-20210907143102436