🧩 一、核心区别:操作对象不同
操作 | 直译含义 | dev 的基点变化 | commit 历史是否重写 | 是否产生 merge commit |
---|---|---|---|---|
git rebase dev onto test |
"把 dev 移动到 test 上" | ✅ 会改变(dev 的提交会重新基于 test) | ✅ 会重写(新 commit ID) | ❌ 不产生(线性历史) |
git merge test into dev |
"把 test 合并进 dev" | ❌ 不变(dev 保持原来的基点) | ❌ 不重写 | ✅ 会产生一个 merge commit |
🧭 二、过程可视化理解
假设当前分支结构如下:
scss
A---B---C (test)
\
D---E (dev)
✅ 执行 git rebase dev onto test
后:
dev 的提交 D、E 会 复制一份并重新接到 test 的 C 后面:
css
A---B---C---D'---E' (dev)
📌 效果:
- 看起来像 dev 是直接从 test 派生的;
- 历史是干净、线性的;
- 但 D/E 的 commit hash 都变了(因为 rebase 本质是"复制+删除原提交")。
✅ 执行 git merge test into dev
后:
dev 会把 test 的提交合并进来,并生成一个合并提交:
scss
A---B---C (test)
\
D---E---M (dev)
📌 效果:
- dev 得到了 test 的所有改动;
- 历史保留了两个分支的分叉;
- 生成一个新的
merge commit M
; - 所有原 commit hash 保持不变。
⚖️ 三、使用场景对比
场景 | 推荐操作 | 原因 |
---|---|---|
你在自己的分支上开发,还没推到远程,只想同步 test 最新改动 | ✅ rebase dev onto test |
保持线性历史,方便 review |
dev 已经是共享分支,有多人在上面工作 | ✅ merge test into dev |
避免改写公共历史,安全 |
准备发 PR(希望提交历史干净) | ✅ rebase |
去掉不必要的 merge commit |
要完整保留开发过程、分支结构 | ✅ merge |
历史清晰,易于追踪分支来源 |
💡 四、总结一句话
- rebase:像是"重新整理笔记",让历史更整齐。
- merge:像是"把两本书合成一本",保留所有分叉记录。