Git Merge vs Rebase

核心对比 #

维度MergeRebase
历史记录保留真实分支历史改写成线性历史
提交 ID不变全部改变
合并提交产生 merge commit无额外提交
可视化分支图像树杈一条直线
安全性高(不改写历史)低(改写历史)

工作原理对比 #

操作前Merge 结果Rebase 结果
main: A→B→C
feature: A→D→E
A→B→C→M
└→D→E→┘
A→B→C→D'→E'
两个分支保留分支痕迹看起来从未分支

提交 ID 变化 #

属性原始提交 CRebase 后 C'
提交 IDabc123def456
代码内容你的改动你的改动(相同)
父提交Bmain 最新提交
时间戳10:0015:00(rebase 时间)

使用场景对比 #

场景推荐操作原因
公共分支合并Merge保留协作历史
已推送的分支Merge避免破坏他人工作
本地分支整理Rebase保持历史整洁
更新 feature 分支Rebase避免无意义的合并提交
热修复合并Merge需要追踪修复时间点
实验性功能Rebase整理后再合并

优缺点对比 #

方面MergeRebase
优点• 安全
• 保留完整历史
• 冲突处理简单
• 容易撤销
• 历史整洁
• 便于代码审查
• 利于 bisect 查错
• 无合并提交
缺点• 历史混乱
• 大量合并提交
• 分支图复杂
• 改写历史危险
• 失去时间线
• 冲突需逐个解决
• 协作困难

冲突处理对比 #

维度MergeRebase
冲突次数1 次N 次(每个提交)
解决方式在合并提交中一次解决逐个提交解决
放弃操作git merge --abortgit rebase --abort
继续操作git commitgit rebase --continue

命令对比 #

操作MergeRebase
基础命令git merge featuregit rebase main
拉取更新git pullgit pull --rebase
交互模式git rebase -i
撤销操作git revert -m 1 <commit>git reflog + git reset

风险等级 #

操作风险等级说明
git merge main⭐ 低只是合并,不改历史
git rebase main(本地)⭐⭐ 中改写本地历史
git rebase main(已推送)⭐⭐⭐⭐⭐ 极高破坏团队协作
git push --force⭐⭐⭐⭐⭐ 极高覆盖远程历史

黄金法则 #

规则说明后果
不 rebase 公共分支main、develop 等团队历史混乱
不 rebase 已推送代码已 push 的提交同事无法同步
不在 main 上 rebasegit checkout main && git rebase主分支历史被改写

最佳实践 #

阶段推荐操作命令
本地开发Rebase 保持更新git pull --rebase origin main
推送前整理提交历史git rebase -i HEAD~3
合并功能Merge 到主分支git merge --no-ff feature
热修复Cherry-pick 或 Mergegit cherry-pick <commit>

选择决策树 #

问题是 →否 →
代码已推送?用 Merge继续判断
是公共分支?用 Merge继续判断
需要保留完整历史?用 Merge继续判断
想要整洁历史?用 Rebase用 Merge

总结 #

  • Merge:真实但混乱,适合公共协作
  • Rebase:整洁但危险,适合本地整理

记住:公共用 Merge,本地用 Rebase