Git Merge vs. Rebase: 核心区别

背景与目标

本文围绕“git merge 和 git rebase有什么区别”展开,整理可直接复用的步骤、原理说明与排查经验。

核心内容

主题 1. git merge 和 git rebase有什么区别

git mergegit rebase 都是用来合并代码(将一个分支的更改整合到另一个分支)的工具,但它们达成目的的方式和产生的历史记录截然不同。

简单来说:Merge 是“保留真实历史”,Rebase 是“整理干净历史”。

1. 核心区别

特性Git Merge (合并)Git Rebase (变基)
原理创建一个新的“合并提交”(Merge Commit),将两个分支的历史连在一起。将你当前分支的修改“搬运”到目标分支的最新位置,重新播放一遍。
历史记录非线性。保留了分支分叉和合并的所有细节,像一张复杂的网。线性。看起来像是在最新的代码基础上按顺序开发的,没有分叉。
提交ID不改变原有提交的 ID。会改变。因为是“重新播放”,生成的提交 ID 全是新的。
冲突处理只需要解决一次冲突。可能需要多次解决冲突(因为它是逐个应用你的每一次提交)。

2. 图解工作流

假设你有 main 分支和 feature 分支,main 分支有了新的提交。

Git Merge

  • 操作: Git 会创建一个新的节点(Merge Commit),这个节点有两个父节点(分别来自 mainfeature)。
  • 视觉效果: 你的提交历史会出现“菱形”或“环状”结构。
  • 心态: “发生过什么就是什么,保留所有分叉的痕迹。”

Git Rebase

  • 操作: Git 会把你 feature 分支上的提交暂时“拿下来”,然后把 feature 分支的基底移动到 main 的最新位置,最后把你刚才拿下来的提交一个接一个地重新应用上去。
  • 视觉效果: 一条直线。看起来就像是你是在 main 更新之后才开始写代码的。
  • 心态: “我要把故事讲得好听一点,假装我的开发过程很顺畅,没有分心。”

3. 什么时候用哪个。(最佳实践)

使用 Merge 的场景:

  • 公共分支/主分支: 当你合并到 mainmaster 时,通常使用 Merge(或 Pull Request 的 Squash Merge)。这样可以清楚地看到“某个功能是在什么时候合并进来的”。
  • 需要保留上下文: 如果你想保留分支的完整历史,知道哪些提交属于同一个功能开发过程。

使用 Rebase 的场景:

  • 本地私有分支: 当你在自己的 feature 分支上开发,想要同步 main 分支的最新代码时。使用 Rebase 可以让你本地的提交记录保持在一两条直线上,避免本地出现无意义的交叉合并记录。
  • 代码整洁强迫症: 想要提交历史看起来像一条直线,方便回溯(Bisect)和阅读。

4. 致命禁忌(Rebase 的黄金法则)

绝对不要在公共/共享分支上使用 Rebase。

如果你的分支已经推送到远程(Remote),并且别人也在这个分支上工作,千万不要 Rebase。 因为 Rebase 会修改历史(改变 Commit ID),这会导致你同事的本地历史和远程历史不一致,造成严重的灾难。

总结

  • 想同步主干代码到自己的分支,且只有你自己在开发。用 Rebase
  • 想把开发好的功能合入主干。用 Merge

实施与验证清单

  1. 执行前先确认环境、版本和依赖与文中前置条件一致。
  2. 涉及系统级变更时,先备份关键配置或创建快照。
  3. 完成操作后按验证步骤确认结果,再执行清理或覆盖动作。