文章目录
- [一、什么是 Rebase](#一、什么是 Rebase)
- [二、Rebase 与 Merge 的区别](#二、Rebase 与 Merge 的区别)
- 三、基本用法
-
- [1. 基础变基](#1. 基础变基)
- [2. 继续变基(解决冲突后)](#2. 继续变基(解决冲突后))
- [3. 变基到特定提交](#3. 变基到特定提交)
- [四、交互式 Rebase](#四、交互式 Rebase)
-
- [1. 基本语法](#1. 基本语法)
- [2. 可用的命令](#2. 可用的命令)
- 五、常用场景
- 六、注意事项和风险
- 七、最佳实践
-
- [1. 工作流建议](#1. 工作流建议)
- [2. 命令别名设置](#2. 命令别名设置)
- [3. 冲突解决策略](#3. 冲突解决策略)
- [4. 恢复误操作](#4. 恢复误操作)
- [5. 团队协作规范示例](#5. 团队协作规范示例)
- 总结
一、什么是 Rebase
Rebase(变基) 是 Git 中用于重新应用提交到另一个基点的命令。它会将当前分支的提交"移动"到目标分支的最新提交之后,从而创造一条线性的提交历史。
核心概念
- 重写历史:Rebase 会创建新的提交(SHA 值会改变)
- 线性历史:使提交历史更加整洁、线性
- 操作基点:改变当前分支的起始点
二、Rebase 与 Merge 的区别
Merge(合并)
A---B---C feature
/ \
D---E---F---G---H main
- 创建新的合并提交
- 保留分支结构
- 历史更完整但更复杂
Rebase(变基)
A'--B'--C' feature
/
D---E---F---G main
- 重新应用提交
- 创建线性历史
- 原始提交被"重写"
三、基本用法
1. 基础变基
bash
# 将当前分支变基到 main 分支
git checkout feature
git rebase main
# 或单条命令
git rebase main feature
2. 继续变基(解决冲突后)
bash
# 解决冲突后
git add <file>
git rebase --continue
# 跳过当前提交(有冲突但不想要此提交)
git rebase --skip
# 中止变基操作
git rebase --abort
3. 变基到特定提交
bash
# 变基到特定提交
git rebase <commit-hash>
# 相对引用
git rebase HEAD~3 # 变基到当前分支的前3个提交
四、交互式 Rebase
交互式 Rebase 允许我们编辑、重排、合并或删除提交。
1. 基本语法
bash
git rebase -i <base-commit>
# 或
git rebase -i HEAD~n # 最近n个提交
2. 可用的命令
pick, p: 使用提交
reword, r: 使用提交但编辑提交信息
edit, e: 使用提交但暂停修改
squash, s: 将提交合并到前一个提交
fixup, f: 类似squash但丢弃提交信息
drop, d: 删除提交
示例
bash
# 编辑最近3个提交
git rebase -i HEAD~3
# 打开的编辑器中将显示:
pick a1b2c3d 提交1
reword e4f5g6h 提交2
squash i7j8k9l 提交3
# 保存后会:
# 1. 保留提交1
# 2. 修改提交2的信息
# 3. 将提交3合并到提交2
五、常用场景
场景1:同步主分支更新
bash
# 开发功能时保持与主分支同步
git checkout feature
git fetch origin
git rebase origin/main
场景2:整理本地提交
bash
# 合并多个小提交为一个有意义的提交
git rebase -i HEAD~5
# 将多个pick改为squash或fixup
场景3:修改提交历史
bash
# 修改过去的提交信息
git rebase -i HEAD~3
# 将需要修改的提交前的pick改为reword
场景4:分割提交
bash
git rebase -i HEAD~3
# 将需要分割的提交前的pick改为edit
# Git会暂停在该提交
git reset HEAD~
git add -p # 交互式添加部分更改
git commit -m "第一部分"
git commit -m "第二部分"
git rebase --continue
六、注意事项和风险
重要警告
-
不要对公共分支变基
bash# 永远不要这样做! git rebase main feature # 如果feature已推送到远程 -
变基会重写历史
- 提交的 SHA 值会改变
- 其他基于旧提交的工作会受影响
- 需要强制推送(
git push --force-with-lease)
具体风险
-
协作问题
- 如果分支已被其他人使用,变基会导致混乱
- 需要团队成员都理解并同意使用 rebase
-
丢失上下文
- 合并提交提供的上下文信息会丢失
- 调试时难以理解功能是如何集成的
-
冲突处理复杂
- 可能需要多次解决相同冲突
- 比 merge 的冲突解决更复杂
安全使用原则
bash
# 1. 只对本地、未推送的提交使用 rebase
# 2. 使用更安全的强制推送
git push --force-with-lease # 比 --force 更安全
# 3. 建立团队规范
# 4. 重要分支备份
git branch backup-branch <commit-hash>
七、最佳实践
1. 工作流建议
个人分支:频繁使用 rebase 保持整洁
功能分支:团队内部可协商使用
主分支/发布分支:只使用 merge,不使用 rebase
2. 命令别名设置
bash
# 添加到 ~/.gitconfig
[alias]
ri = rebase -i
rc = rebase --continue
ra = rebase --abort
rs = rebase --skip
pf = push --force-with-lease
3. 冲突解决策略
bash
# 配置 mergetool
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd "code --wait $MERGED"
# 使用 rerere 记住冲突解决方案
git config --global rerere.enabled true
4. 恢复误操作
bash
# 查看 reflog 找到变基前的状态
git reflog
# 恢复到变基前的状态
git reset --hard HEAD@{n}
5. 团队协作规范示例
markdown
## 团队 Git 工作流规范
### 使用 Rebase 的场景:
1. 个人功能分支整理提交
2. 合并主分支更新到功能分支
3. 发布前整理提交历史
### 禁止使用 Rebase 的场景:
1. 已推送到共享仓库的分支
2. 主分支(main/master)
3. 发布分支
### 推送规则:
- 个人分支:允许 force-with-lease
- 共享功能分支:需团队同意
- 主分支:禁止强制推送
总结
Rebase 是一个强大的工具,但需要谨慎使用:
适合使用 Rebase:
- 整理本地提交历史
- 保持功能分支与主分支同步
- 创建清晰的 PR/MR 提交历史
避免使用 Rebase:
- 已共享的分支
- 不确定是否有其他人使用的分支
- 重要的历史记录需要保留时
记住黄金法则: 只对我们自己的、未共享的本地分支使用 rebase。当有疑问时,使用 merge 更安全。
通过合理使用 rebase,我们可以创建更清晰、更易读的提交历史,但同时要保持对团队协作影响的敏感性。