Git Rebase 从入门到精通
💡 一句话理解 Rebase
Git Rebase 就是把你的提交”搬家”到另一个分支的最新位置,让提交历史看起来像一条直线。
🤔 Rebase vs Merge:核心区别
Merge 合并
流程说明:
- 从 B 创建 feature 分支
- feature 分支提交 C、D
- main 分支提交 E
- 将 feature 合并到 main,产生合并提交 M
- main 分支继续提交 F
特点:
- ✅ 保留完整的历史记录
- ✅ 能看到分支的合并点
- ❌ 提交历史呈网状结构
- ❌ 有额外的 merge commit
Rebase 变基
流程说明:
- 原本 feature 分支的 C、D 提交
- 被”搬家”到 E 之后,变成 C’、D’
- 形成一条线性的提交历史
特点:
- ✅ 提交历史呈线性结构
- ✅ 没有额外的 merge commit
- ✅ 历史更清晰易读
- ❌ 改变了提交历史(C 和 D 变成了 C’ 和 D’)
- ⚠️ 不适合已推送到公共分支的提交
对比表格
| 特性 | Merge | Rebase |
|---|---|---|
| 历史结构 | 网状(保留分支信息) | 线性(扁平化) |
| 提交历史 | 真实的时间顺序 | 逻辑上的顺序 |
| Merge Commit | 有 | 无 |
| 冲突解决 | 一次性解决所有冲突 | 逐个提交解决冲突 |
| 适用场景 | 公共分支、团队协作 | 个人分支、整理提交 |
| 风险 | 低 | 高(改变历史) |
🎯 Rebase 的使用场景
1️⃣ 保持 Feature 分支最新
场景:你在开发功能分支时,main 分支有了新的提交。
流程说明:
- main 在 B 时创建 feature 分支
- feature 提交了 C、D(你的工作)
- main 提交了 E(别人的工作)
- 在 feature 上执行 rebase main
- 结果:C、D 被重新应用到 E 之后,变成 C’、D’
命令:
1 | # 在 feature 分支上 |
2️⃣ 整理本地提交历史
场景:你有很多零碎的提交,想在推送前整理成几个清晰的提交。
命令:
1 | # 交互式 rebase 最近 5 个提交 |
3️⃣ 修改历史提交信息
场景:发现之前的提交信息写错了。
1 | # 修改最近的提交信息 |
4️⃣ 拆分或合并提交
场景:一个提交做了太多事,想拆成多个;或多个小提交想合并成一个。
1 | # 交互式 rebase |
🔧 Rebase 基础操作
普通 Rebase
基本语法
1 | # 将当前分支 rebase 到目标分支 |
完整流程示例
1 | # 1. 确保 main 是最新的 |
处理 Rebase 冲突
当 rebase 遇到冲突时:
1 | # Git 会暂停并显示冲突文件 |
Rebase 常用选项
1 | # 保留 merge commits |
🎨 交互式 Rebase(Interactive Rebase)
交互式 rebase 是最强大的功能,可以让你完全控制提交历史。
启动交互式 Rebase
1 | # Rebase 最近 N 个提交 |
交互式 Rebase 命令
当执行 git rebase -i 后,会打开编辑器显示:
1 | pick 1a2b3c4 feat: 添加登录功能 |
常用操作示例
1. 合并提交(Squash)
目标:将多个小提交合并成一个
1 | # 修改前 |
保存后,Git 会让你编辑最终的提交信息。
2. 修改提交信息(Reword)
1 | # 修改前 |
保存后,Git 会让你重新编辑提交信息。
3. 删除提交(Drop)
1 | # 修改前 |
4. 编辑提交(Edit)
1 | # 修改后 |
Git 会在该提交处停下来,让你修改:
1 | # 修改文件 |
5. 拆分提交(Split)
1 | # 标记为 edit |
然后:
1 | # Git 停在该提交 |
6. 调整提交顺序
1 | # 修改前 |
⚠️ Rebase 的黄金法则
🚫 永远不要 Rebase 公共分支
黄金法则:不要 rebase 已经推送到公共仓库的提交!
为什么?
问题说明:
- 开发者 A 推送提交 [A → B → C] 到远程
- 开发者 B 拉取了这些提交
- 开发者 A 执行 rebase,改变了历史,变成 [A → B’ → C’]
- 开发者 A 强制推送新的历史
- 开发者 B 尝试推送时,因为 B 和 B’ 是不同的提交(SHA 不同),导致历史冲突
**后果
- 😱 其他人的提交历史会混乱
- 🔥 可能导致代码丢失
- 💥 团队协作困难
✅ 安全的 Rebase 场景
个人开发分支(尚未推送)
1
2
3# ✅ 安全
git checkout feature/my-work
git rebase main已推送但只有你在用的分支
1
2# ✅ 可以,但要用 --force-with-lease
git push origin feature/my-work --force-with-lease本地整理提交后才推送
1
2
3# ✅ 推荐
git rebase -i HEAD~5 # 本地整理
git push origin feature/new # 首次推送
❌ 危险的 Rebase 场景
Main/Master 分支
1
2
3# ❌ 危险!绝对不要这样做
git checkout main
git rebase feature多人协作的分支
1
2
3# ❌ 危险!会影响其他人
git checkout develop
git rebase -i HEAD~10已经被其他分支合并的提交
1
2# ❌ 危险!会导致重复的提交
git rebase main # 如果这个分支已被其他分支引用
🛠️ Rebase 实战技巧
1. 使用 –force-with-lease 而不是 –force
1 | # ❌ 危险:会覆盖远程的任何更改 |
2. 配置默认的 Rebase 行为
1 | # Pull 时自动使用 rebase 而不是 merge |
3. 自动 Stash 在 Rebase 前
1 | # 配置自动 stash |
4. 使用 Rebase 更新 Feature 分支
1 |
|
使用:
1 | chmod +x update-feature.sh |
5. 整理提交历史模板
创建一个交互式 rebase 的别名:
1 | # 添加到 ~/.gitconfig |
使用:
1 | # 整理最近 3 个提交 |
6. 修复错误的 Rebase
如果 rebase 搞砸了,使用 reflog 恢复:
1 | # 1. 查看操作历史 |
7. 批量处理提交
使用 exec 命令在每个提交后执行操作:
1 | git rebase -i HEAD~5 |
在编辑器中:
1 | pick 1a2b3c4 提交 1 |
这会在每个提交后运行测试,确保每个提交都是可工作的。
📊 Rebase vs Merge:选择指南
使用 Merge 的场景
✅ 合并到 main/master 分支
✅ 多人协作的 develop 分支
✅ 需要保留完整的分支历史
✅ 重要的功能发布
✅ 开源项目的 PR 合并
使用 Rebase 的场景
✅ 更新个人 feature 分支
✅ 整理本地提交历史
✅ 保持线性的提交历史
✅ 删除/修改错误的提交
✅ 推送前清理提交
🎯 最佳实践
1. 建立团队规范
1 | # Git Rebase 团队规范 |
2. 提交历史整理 Checklist
推送前检查清单:
- 是否有无意义的提交信息(如 “wip”, “test”)?
- 是否有多个提交做了同样的事情?
- 提交是否符合 Conventional Commits 规范?
- 每个提交是否是独立且完整的?
- 是否需要拆分过大的提交?
- 是否需要调整提交顺序?
3. Rebase 工作流示例
1 | # 完整的 feature 开发流程 |
🐛 常见问题与解决
Q1: Rebase 过程中遇到太多冲突怎么办?
解决方案:
1 | # 方案 1:中止 rebase,使用 merge |
Q2: 如何撤销已经推送的 Rebase?
1 | # 1. 找到 rebase 前的提交 |
Q3: Rebase 后为什么推送失败?
Rebase 改变了提交的 SHA,远程仓库会拒绝:
1 | # ❌ 普通 push 会失败 |
Q4: 如何 Rebase 特定的几个提交?
1 | # 方案 1:使用 cherry-pick |
Q5: 团队成员不小心 rebase 了公共分支怎么办?
1 | # 1. 找到 rebase 前的提交(使用 reflog 或从其他人那里获取) |
📚 延伸阅读
- Git Rebase 官方文档
- Atlassian Git Rebase 教程
- The Git Rebase Introduction I Wish I’d Had
- When to Use Git Reset, Git Revert & Git Checkout
🎓 总结
核心要点
- Rebase 的本质:重新应用提交到新的基础上
- 主要用途:整理提交历史、保持线性历史
- 黄金法则:不要 rebase 公共分支
- 安全推送:使用
--force-with-lease而不是--force - 交互式 Rebase:整理提交的最强工具
快速参考
1 | # 基本 rebase |
何时使用
| 场景 | 使用 Rebase | 使用 Merge |
|---|---|---|
| 更新个人分支 | ✅ | ❌ |
| 整理提交历史 | ✅ | ❌ |
| 合并到 main | ❌ | ✅ |
| 多人协作分支 | ❌ | ✅ |
| 功能发布 | ❌ | ✅ |
记住:Rebase 是一把锋利的刀,用得好能让项目历史清晰优雅,用不好会给团队带来灾难。🔪
Happy Rebasing! 🚀
Git Rebase 从入门到精通




