背景与目标
本文围绕“git merge 和 git rebase有什么区别”展开,整理可直接复用的步骤、原理说明与排查经验。
核心内容
主题 1. git merge 和 git rebase有什么区别
git merge 和 git rebase 都是用来合并代码(将一个分支的更改整合到另一个分支)的工具,但它们达成目的的方式和产生的历史记录截然不同。
简单来说:Merge 是“保留真实历史”,Rebase 是“整理干净历史”。
1. 核心区别
| 特性 | Git Merge (合并) | Git Rebase (变基) |
|---|---|---|
| 原理 | 创建一个新的“合并提交”(Merge Commit),将两个分支的历史连在一起。 | 将你当前分支的修改“搬运”到目标分支的最新位置,重新播放一遍。 |
| 历史记录 | 非线性。保留了分支分叉和合并的所有细节,像一张复杂的网。 | 线性。看起来像是在最新的代码基础上按顺序开发的,没有分叉。 |
| 提交ID | 不改变原有提交的 ID。 | 会改变。因为是“重新播放”,生成的提交 ID 全是新的。 |
| 冲突处理 | 只需要解决一次冲突。 | 可能需要多次解决冲突(因为它是逐个应用你的每一次提交)。 |
2. 图解工作流
假设你有 main 分支和 feature 分支,main 分支有了新的提交。
Git Merge
- 操作: Git 会创建一个新的节点(Merge Commit),这个节点有两个父节点(分别来自
main和feature)。 - 视觉效果: 你的提交历史会出现“菱形”或“环状”结构。
- 心态: “发生过什么就是什么,保留所有分叉的痕迹。”
Git Rebase
- 操作: Git 会把你
feature分支上的提交暂时“拿下来”,然后把feature分支的基底移动到main的最新位置,最后把你刚才拿下来的提交一个接一个地重新应用上去。 - 视觉效果: 一条直线。看起来就像是你是在
main更新之后才开始写代码的。 - 心态: “我要把故事讲得好听一点,假装我的开发过程很顺畅,没有分心。”
3. 什么时候用哪个。(最佳实践)
使用 Merge 的场景:
- 公共分支/主分支: 当你合并到
main或master时,通常使用 Merge(或 Pull Request 的 Squash Merge)。这样可以清楚地看到“某个功能是在什么时候合并进来的”。 - 需要保留上下文: 如果你想保留分支的完整历史,知道哪些提交属于同一个功能开发过程。
使用 Rebase 的场景:
- 本地私有分支: 当你在自己的
feature分支上开发,想要同步main分支的最新代码时。使用 Rebase 可以让你本地的提交记录保持在一两条直线上,避免本地出现无意义的交叉合并记录。 - 代码整洁强迫症: 想要提交历史看起来像一条直线,方便回溯(Bisect)和阅读。
4. 致命禁忌(Rebase 的黄金法则)
绝对不要在公共/共享分支上使用 Rebase。
如果你的分支已经推送到远程(Remote),并且别人也在这个分支上工作,千万不要 Rebase。 因为 Rebase 会修改历史(改变 Commit ID),这会导致你同事的本地历史和远程历史不一致,造成严重的灾难。
总结
- 想同步主干代码到自己的分支,且只有你自己在开发。用 Rebase。
- 想把开发好的功能合入主干。用 Merge。
实施与验证清单
- 执行前先确认环境、版本和依赖与文中前置条件一致。
- 涉及系统级变更时,先备份关键配置或创建快照。
- 完成操作后按验证步骤确认结果,再执行清理或覆盖动作。