Skip to content
大纲

rebase 和 merge 的区别

在 Git 中,merge(合并)和 rebase(变基)都是用于整合不同分支的修改,但它们的实现方式和最终效果有显著区别。以下是两者的核心差异及适用场景:


1. 核心区别

特性git mergegit rebase
历史记录保留分支的原始提交历史,生成合并提交将提交历史“线性化”,不生成合并提交
提交树结构保留分支分叉,形成树状结构将提交移动到目标分支,形成直线结构
冲突处理在合并提交时一次性解决冲突在逐个提交应用时逐步解决冲突
适用场景公共分支(如 main)的合并本地私有分支的整理
风险安全,不修改历史记录可能破坏协作分支的历史记录

2. 图示对比

(1) 初始分支状态

A---B---C  feature
         /
D---E---F  main

(2) 使用 git merge

A---B---C  feature
         /         \
D---E---F-----------G  main(生成合并提交 G)

(3) 使用 git rebase

D---E---F---A'---B'---C'  main(feature 分支提交被“重放”到 main)

3. 使用场景建议

适合 git merge 的情况

  • 合并公共分支(如多人协作的 maindevelop 分支)。
  • 需要保留分支的完整历史(如特性开发的里程碑节点)。

适合 git rebase 的情况

  • 整理本地分支:将本地分支的提交“整理”到目标分支的最新状态。
  • 简化历史记录:避免过多的合并提交,使历史更清晰(如开源项目提交 PR 前)。
  • 交互式修改提交git rebase -i):合并、拆分或修改提交信息。

4. 命令示例

(1) git merge

bash
git checkout main
git merge feature  # 将 feature 分支合并到 main

(2) git rebase

bash
git checkout feature
git rebase main    # 将 feature 分支的提交“变基”到 main 的最新提交
git checkout main
git merge feature  # 此时合并是快进(fast-forward)

5. 注意事项

  • 不要对已推送的提交进行变基
    如果分支已推送到远程仓库,变基会重写历史,导致其他人同步时冲突。
  • 优先用 merge 处理公共分支
    公共分支的历史记录应保持稳定,避免强制推送(git push --force)。
  • 交互式变基(rebase -i
    可合并提交、修改提交信息或删除无用提交(适合本地分支整理)。

总结

操作优点缺点
merge安全,保留历史历史记录可能复杂
rebase历史线性清晰,适合本地整理可能破坏协作分支的历史一致性

根据团队协作规范选择合适的策略:私有分支用 rebase,公共分支用 merge