git rebase 能做什么

584 阅读2分钟

当远程 master 分支比开发分支 feature 领先

通常情况下,master 分支的合并权限由专门的高一级开发者组长拥有,作为小开发的我们需要提交 merge 合并的申请,大家一起 review 代码后,由组长合并。而 master 分支有可能比我们本地分支超前,其他同事可能解决了一些 bug fix,比我们本地分支超前。如下图:

image.png

如果这个时候我们向 master 分支直接提交 merge 很有可能存在文件冲突的问题,就是自己的分支 feature-ask 和 bug-fix 同时修改了某个文件,直接向 master 提交 merge 相当于让你的组长帮你解决冲突,这显然不合理的。因为代码是你自己写的,逻辑只有提交 merge 的人更清楚。

这个时候就需要使用 rebase 了,rebase 的意思就是 replace base, 将自己分支 feature-ask 的 base 移动到 main 最新的位置。

rebase 有冲突的时候

wecom-temp-4966b26388f020d6c93139f78542e8b5.jpg 如图是 main 分支合并了 bug-fix 分支的代码,这时,远程 main 分支已经比本地的 feature-ask 分支领先了。如果我们直接在 main 分支合并 feature-ask 分支的话会有如下提示:

wecom-temp-dd45462d334e002e614e6da70baaf91c.jpg 意思就是得先解决冲突才能完成合并,这就给组长添麻烦了 😂 。组长也不会给你合并的。

正确的解决方案是:在自己的分支 feature-ask 解决完冲突再提交合并。

  • 在 feature-ask 分支 git pull --rebase origin main,将远程分支 main 的代码更新到 feature-ask 分支上。
  • 解决冲突。
  • git add .
  • git commit -m "rebase and feature-100"
  • git rebase --continue
  • 强制将本地修改推送到远程 feature-ask 分支上: git push -f

然后我们就可以发起合并 master 的合并请求了。

在 feature-ask 分支执行 - git log --graph --pretty=oneline --abbrev-commit 后,可以看到:

wecom-temp-746f2a9269cf609f8cbd9d84e0c7a1d7.jpg 相当于将 feature-ask 的基础调整到 bug101-fix 之后,然后再向 main 分支合并。

image.png

rebase 没有冲突

如果 bug-fix 分支修改的文件正好与我们开发的分支 feature-ask 没有相同的修改文件,那就不会有代码冲突了,这个时候的步骤如下:

  • 在 feature-ask 分支 git pull --rebase origin main,将远程分支 main 的代码更新到 feature-ask 分支上。
  • 强制将本地修改推送到远程 feature-ask 分支上: git push -f

如果已经没有冲突了,为什么还要使用 rebase 呢?因为当远程 master 分支比开发分支 feature-ask 分支领先的时候,我们并不能保证一定没有冲突,不能等出现冲突的时候再去想怎么解决,所以要提前将领先的 master 分支的代码更新到自己的开发分支,然后再去申请合并。