Files
2026-06-11 03:33:14 +08:00

3.0 KiB
Raw Permalink Blame History

合并策略详解

Merge vs Rebase

特性 Merge Rebase
历史记录 保留完整历史,创建合并提交 线性历史,不创建合并提交
适用场景 公共分支、需要保留历史 私有分支、保持历史清晰
冲突处理 一次性处理所有冲突 逐个提交处理冲突
推荐用法 合并到主分支 同步上游代码

使用建议

功能分支同步 develop使用 rebase

git checkout feature/user-management
git rebase develop

功能分支合并到 develop使用 merge --no-ff

git checkout develop
git merge --no-ff feature/user-management

develop 合并到 master使用 merge --no-ff

git checkout master
git merge --no-ff develop

禁止在公共分支上 rebase

# ❌ 危险操作
git checkout develop
git rebase feature/xxx  # 会改写公共历史

Fast-Forward vs No-Fast-Forward

Fast-Forward 合并(不创建合并提交)

git merge feature/xxx
# A---B---C  (master)
#          \
#           D---E  (feature)
# 结果: A---B---C---D---E  (master)

No-Fast-Forward 合并(创建合并提交)

git merge --no-ff feature/xxx
# A---B---C---------M  (master)
#          \       /
#           D---E    (feature)

项目约定:合并功能分支时使用 --no-ff,保留分支历史信息。

Squash 合并

将多个提交压缩成一个:

git checkout develop
git merge --squash feature/user-management
git commit -m "feat(user): 添加用户管理功能"

适用场景

  • 功能分支有太多琐碎提交
  • 想要保持主分支历史清晰
  • 不需要保留开发过程中的细节

Squash vs Merge --no-ff

策略 优点 缺点 适用场景
merge --no-ff 保留完整历史和开发过程 历史可能比较复杂 功能分支、重要功能
squash 历史清晰,一个提交一个功能 丢失开发过程信息 小功能、实验性功能
rebase 线性历史,易于理解 改写历史,可能引起问题 个人分支、同步上游

Rebase 高级用法

交互式 Rebase

# 编辑最近5个提交
git rebase -i HEAD~5

在编辑器中可以使用以下命令:

  • pick - 保留该提交
  • reword - 修改提交消息
  • edit - 修改提交内容
  • squash - 合并到前一个提交
  • drop - 删除该提交

Rebase 时解决冲突

git rebase develop
# 出现冲突后,编辑文件解决冲突
git add <file>
git rebase --continue
# 如果想放弃 rebase
git rebase --abort