Skip to content

合并分支时怎么选:merge 还是 rebase

很多人把这个问题理解成“哪个命令更高级”,其实重点不在这里。真正该问的是:

  • 我现在是在同步分支,还是在合并分支
  • 这条分支是不是只有我一个人在用
  • 我是想保留真实分叉关系,还是想把历史整理得更线性

如果这几个问题没想清楚,命令背再熟也容易用拧。

先说结论

  • 想保留真实合并关系,用 merge
  • 想让历史更线性、先整理自己分支上的提交,用 rebase
  • 公共分支尽量少 rebase
  • 本地个人分支,在合并前用 rebase 整理历史,通常问题不大

我怎么理解这两个动作

merge

merge 更像是把两条已经分开的线重新接回来,并明确保留“它们曾经分叉过”这件事。

text
A---B---C main
     \
      D---E feature
           \
            M

rebase

rebase 不是把两条线硬接起来,而是把 feature 自己的提交重新搬到新的基点后面。

text
A---B---C main
     \
      D---E feature

A---B---C main
         \
          D'---E' feature

所以 rebase 的核心副作用就是:它会改写提交历史。

场景 1:主干更新了,我只是想让自己的功能分支跟上

这个场景我通常会优先用 rebase

shell
git fetch origin
git switch feature/login-form
git rebase origin/main

原因很简单:这时我并不是要“正式合并”分支,我只是想让自己的开发基线更新到最新主干,同时不额外制造 merge commit。

场景 2:一个分支已经多人协作,不想改历史

这个时候更稳的选择通常是 merge

shell
git switch feature/team-task
git merge origin/main

因为一旦公共分支 rebase,别人本地基于旧历史继续开发的那部分提交,就会开始和你新的历史打架。

场景 3:准备提 PR 之前,想把自己一堆零碎提交整理干净

这时 rebase -i 很合适。

shell
git rebase -i HEAD~4

这个动作更像“整理房间”,不是“和别人合流”。它适合在分支还比较私有的时候做。

场景 4:我希望以后回看历史时,能明确看出一次真实的合并行为

这种场景更适合 merge

例如:

  • 一次大型功能分支正式合并回主干
  • 一个发布分支合并回维护分支
  • 团队明确希望保留分支汇合关系

这时候 merge 保留下来的那条历史关系,本身就是信息,不是噪音。

我自己的选择习惯

  • 日常同步主干:优先 rebase
  • 整理个人分支提交:优先 rebase -i
  • 公共分支协作:优先 merge
  • 平台发起 PR 后的最终合并方式:跟团队规范走,不自己发明流程

快速判断

  • 这条分支只有我自己在用吗:是,rebase 空间更大
  • 已经有人基于这条分支继续开发了吗:是,优先 merge
  • 我现在是“想同步基线”还是“想完成合流”:同步基线更偏 rebase,正式合流更偏 merge
  • 我是不是很在意历史是否线性:在意,就考虑 rebase

常见坑

  • rebase 当成“更高级的 merge”,这是很多事故的起点
  • 公共分支反复 rebase,最后整个团队都在解历史冲突
  • 只是为了让图看起来更直,就去改已经公开的历史,收益通常不值这个风险

TIP

如果你其实是在问“我现在该不该整理自己的提交历史”,答案通常是先看 rebase。如果你是在问“这条线能不能安全地改历史”,先想想有没有别人也在用它。