1. 基本概念
git merge
- 作用:将两个分支的内容合并到一起,通常是把某个分支(如 feature 分支)合并到主分支(如 master)。
- 历史记录:保留所有分支的提交历史,并生成一个新的合并提交(merge commit)。
- 命令示例:
git checkout master git merge feature
git rebase
- 作用:将一个分支的所有提交“移动”到另一个分支的最新提交之后。
- 历史记录:会重写提交历史,使分支看起来像是从目标分支直接分叉出来的,没有合并提交。
- 命令示例:
git checkout feature git rebase master
2. 工作原理
Merge 原理
- 会产生一个新的合并节点(commit),把两个分支的变化都包含进去。
- 分支历史是分叉的,合并后会有一个“汇合点”。
示意图:
A---B---C (master) \ D---E (feature)合并后:
A---B---C---F (master) \ / D---E (feature)F 是 merge commit。
Rebase 原理
- 会将 feature 分支上的提交(D、E)“摘下来”,然后放到 master 的最新提交(C)之后,提交哈希会变化。
- 历史变得线性,没有合并节点。
示意图:
A---B---C (master) \ D---E (feature)rebase 后:
A---B---C---D'---E' (feature)D’、E’ 是新的提交(哈希变化)。
3. 优缺点对比
| merge | rebase | |
|---|---|---|
| 历史 | 保留分支历史,产生合并节点 | 线性历史,无合并节点 |
| 冲突处理 | 一次性解决所有冲突 | 每个 commit 逐一解决冲突 |
| 协作 | 更安全,适合多人协作 | 适合个人开发,慎对公共分支使用 |
| 可读性 | 复杂,分叉明显 | 清晰,线性 |
| 提交哈希 | 不变 | 变更(新哈希) |
4. 使用场景建议
- merge:适合多人协作,不会重写历史,安全可靠,适合合并公共分支(如 master)。
- rebase:适合个人开发或整理提交历史,让提交更清晰。不要在公共分支上 rebase(可能导致他人提交丢失)。
5. 总结
- merge:保留分支历史,产生合并提交,分叉明显。
- rebase:重写历史,线性提交,无合并节点。
- 选择建议:本地开发可以用 rebase 整理历史,最终合并到主分支建议用 merge。
6. 实际开发场景举例
场景一:多人协作开发(推荐 merge)
假设你和同事都在feature分支上开发,期间主分支(master)有新的提交。如果你用rebase,会改变feature分支的提交哈希,导致同事的本地分支和你的分支产生冲突,后续推送/拉取会很麻烦。所以多人协作时,推荐用merge。
场景二:个人开发整理提交(推荐 rebase)
如果你在feature分支上开发,期间master有更新,你想让自己的提交历史更清晰,可以用rebase。这样你的提交在master最新提交之后,看起来像是“直接”基于最新代码开发的。
7. 命令演示和常见问题
合并分支(merge)
# 切到主分支 git checkout master # 合并 feature 分支 git merge feature- 若有冲突,Git 会提示你解决冲突,解决后继续:
git add . git commit
变基分支(rebase)
# 切到 feature 分支 git checkout feature # 变基到 master git rebase master- 若有冲突,Git 会暂停 rebase,提示你解决冲突。解决后继续:
git add . git rebase --continue - 如果想放弃 rebase:
git rebase --abort
rebase 后推送注意事项
如果你已经把feature分支推送到远程,且 rebase 后哈希变了,推送时要用--force或--force-with-lease,否则会被拒绝:
git push origin feature --force注意:强推会覆盖远程分支,慎用!
8. 交互式 rebase(整理提交历史)
git rebase -i可以在本地整理自己的提交历史,比如合并、修改、删除提交:
git checkout feature git rebase -i master会弹出编辑界面,可以对提交做各种操作。
9. 什么时候不能用 rebase?
- 公共分支禁止 rebase:如果分支已经推送到远程,且多人在用,rebase 会导致别人本地分支和远程分支不一致,容易引发混乱。
- 已合并到主分支的分支不建议再 rebase。
10. 总结口诀
- 多人协作用 merge,个人整理用 rebase。
- 公共分支慎用 rebase,本地分支大胆用。
- rebase 会改变历史,merge 保留历史。