
























2026-04-15 17:49 xiashengwang 阅读(72) 评论() 收藏 举报
git merge 和 git rebase 都是用来整合不同分支的修改,但它们处理提交历史的方式截然不同。理解它们的区别,能帮助你在团队协作中选择合适的策略,避免历史混乱。
| 特性 | git merge |
git rebase |
|---|---|---|
| 原理 | 创建一个新的“合并提交”(merge commit),将两个分支的历史合并在一起。 | 将当前分支的提交 “重新播放” 到目标分支的最新提交之上,改写提交历史。 |
| 历史记录 | 保留真实的历史,包括分支的岔路和合并点。 | 线性化历史,看起来像是在一条直线上顺序开发,分支岔路被抹平。 |
| 安全性 | 安全,不会改写已有提交。 | 有风险,会改写提交的 SHA-1 值。永远不要对已推送到公共仓库的分支执行 rebase。 |
| 适用场景 | 公共分支(如 main、develop)的合并。 |
本地分支的整理,使历史更清晰。 |
假设你有两个分支:main 和 feature,提交历史如下:
A---B---C feature
/
D---E---F---G main
使用 git merge(在 main 上执行 git merge feature)
结果:
A---B---C feature
/ \
D---E---F---G---H main (H 是合并提交)
特点:历史真实反映了分支的存在和合并点 H。如果团队需要追溯“某个功能是什么时候合并的”,merge 更合适。
使用 git rebase(在 feature 上执行 git rebase main)
结果:
A'--B'--C' feature (新提交)
/
D---E---F---G---H main (H 是 main 的最新提交)
过程: Git 会找到 feature 和 main 的共同祖先 E,然后把 feature 上的提交 A、B、C 逐个应用到 main 的最新提交 G 之上,生成新的提交 `A` 、`B`、`C`(SHA-1 值改变)。原来的 A、B、C 会被抛弃(但可通过 reflog 找回)。
特点: 历史变成了一条直线,看起来像是 feature 的修改是在 main 最新代码的基础上顺序完成的,非常干净。
场景:将 feature 分支的修改合并到 main
git checkout main
git merge feature
如果有冲突,解决后执行 git add . → git commit(会自动生成合并提交)。
推送:git push origin main
git checkout feature
git rebase main
# 如果有冲突,解决后执行:
git add .
git rebase --continue
# 重复直到所有提交应用完毕
# 然后将 feature 分支的线性历史合并到 main(此时已经是 fast-forward)
git checkout main
git merge feature # 由于历史线性,会直接移动指针,不产生合并提交
git push origin main
因为 rebase 重写了提交的 SHA-1 值。如果 feature 分支已经推送到远程,并且有其他开发者基于它工作,你执行 rebase 后再强制推送(git push --force),会导致其他人的历史混乱,引发灾难。
安全规则:
✅ 可以在本地未推送的分支上使用 rebase,让历史更清晰。
❌ 永远不要对已经推送到公共仓库的分支执行 rebase(例如 main、develop 或多人协作的 feature 分支)。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。