Git中的merge和rebase
说明 Git 中 merge 和 rebase 的区别、各自适用场景,以及它们对历史结构的影响。
#type / concept
#status / growing
#tech / ops
#resource / git
[!info] related notes
- 所属 MOC: Git MOC
- 相关概念: Git 中的 fast-forward merge
- 相关 howto: 用 Rebase 把功能分支线性合并回 main
- 相关流程: Git 协作流程
merge and rebase
git merge vs git rebase
| 特性 | git merge | git rebase |
|---|---|---|
| 提交历史 | 保留分支历史,产生合并提交 | 线性历史,重写提交历史 |
| 冲突处理 | 一次性解决所有冲突 | 逐个提交解决冲突 |
| 使用场景 | 功能分支合并到主分支 | 整理提交历史,同步主分支 |
| 协作影响 | 对已推送的提交安全 | 不要对已推送的提交使用 |
Merge 示例
git checkout main
git merge feature/login
# 产生一个合并提交
Rebase 示例
git checkout feature/login
git rebase main
# 将 feature/login 的提交重新应用到 main 之上
什么时候优先用 merge
- 多人共享同一个功能分支
- 需要明确保留分支合并点
- 团队约定禁止改写已经推送的分支历史
什么时候优先用 rebase
- 你在单人维护功能分支
- 只是想把当前分支同步到最新
main - 希望最终进入
main的历史尽量线性
这里常见的目标是:先把功能分支 rebase 到最新 main,再让 main 以 fast-forward 方式接住这条分支。fast-forward 本身的定义和判断条件见 Git 中的 fast-forward merge。
如果你要执行“先 rebase,再 fast-forward 合并回 main”的具体步骤,直接看 用 Rebase 把功能分支线性合并回 main。