【Git】一文详解Git Rebase和Merge区别 看完必会
Git Rebase和Merge区别
1️⃣ 原始分支历史
A---B---C main\D---E feature
main
分支有提交 A → B → Cfeature
分支从 B 分叉,提交 D → E
2️⃣ Merge 后的历史
执行:
git checkout main
git merge feature
A---B---C--------F main\ /D--------E feature
- F 是 merge commit
- 历史有分叉,能看到原始开发轨迹
3️⃣ Rebase 后的历史
执行:
git checkout feature
git rebase main
A---B---C main\D'---E' feature
- D 和 E 被“搬到” C 之后
- 历史线性化,看起来像 feature 从最新 main 开始开发
- 没有 merge commit
✅ 总结:
- Merge:保留分叉历史,适合公共分支,冲突少
- Rebase:线性化历史,适合本地整理分支,便于阅读和维护
代码示例
写一个 完整的本地 rebase
示例,从创建分支到整理提交,步骤清晰易懂。
1️⃣ 初始化仓库
mkdir git-rebase-demo
cd git-rebase-demo
git init
创建一个文件并提交几个初始版本:
echo "Version 1" > file.txt
git add file.txt
git commit -m "Add version 1"echo "Version 2" >> file.txt
git commit -am "Update to version 2"echo "Version 3" >> file.txt
git commit -am "Update to version 3"
此时 main
分支历史:
A---B---C main
2️⃣ 创建一个功能分支
git checkout -b feature
echo "Feature 1" >> file.txt
git commit -am "Add feature 1"echo "Feature 2" >> file.txt
git commit -am "Add feature 2"
分支历史:
A---B---C main\D---E feature
3️⃣ main 分支新增提交
切回 main 并更新:
git checkout main
echo "Version 4" >> file.txt
git commit -am "Update to version 4"
现在历史:
A---B---C---F main\D---E feature
4️⃣ 本地 Rebase 功能分支到 main
切回 feature:
git checkout feature
git rebase main
执行后:
A---B---C---F main\D'---E' feature
- D’ 和 E’ 是重新应用在 F 之后的新提交
- 历史线性化,没有 merge commit
5️⃣ 处理冲突(如果有)
如果 rebase 过程中有冲突:
# 编辑冲突文件解决
git add file.txt
git rebase --continue
- 如果放弃 rebase:
git rebase --abort
6️⃣ 整理提交(交互式 rebase)
比如把 feature 的两个提交合并成一个:
git rebase -i HEAD~2
编辑:
pick <hash> Add feature 1
squash <hash> Add feature 2
结果:
A---B---C---F main\G feature (feature 1+2 合并)
这样就完成了 本地 feature 分支的 rebase 和整理提交历史。