Git 变基(Rebase)教程

Git变基(Rebase)操作

掌握重写提交历史、整理提交记录和创建清晰项目历史的强大工具

开始学习

什么是Git变基(Rebase)?

变基操作示意图

main
feature

执行 git rebase main

main
feature

变基的定义

变基(Rebase)是将一系列提交移动到新的基础提交上的过程。它通过重新应用提交来重写项目历史。

  • 改变提交的基础点
  • 创建更线性的项目历史
  • 消除不必要的合并提交
  • 整理和清理提交历史

变基的工作原理

变基过程包含两个主要步骤:

  1. 找到当前分支和目标分支的公共祖先
  2. 将当前分支的提交逐个应用到目标分支的最新提交上

结果是当前分支的所有提交都基于目标分支的最新状态。

变基的主要用途

  • 保持历史线性:避免不必要的合并提交
  • 整理提交记录:合并、编辑或重新排序提交
  • 解决冲突:在功能分支上解决与主分支的冲突
  • 更新功能分支:将功能分支更新到主分支的最新状态
  • 清理历史:移除无用的提交或修复提交信息

重要警告: 永远不要对已经推送到公共仓库的提交使用变基。变基会重写提交历史,这会给其他协作者带来严重问题。

变基命令大全

基本变基
git rebase <base-branch>

将当前分支变基到目标分支

交互式变基
git rebase -i <commit>

交互式地选择如何处理每个提交

继续变基
git rebase --continue

解决冲突后继续变基过程

跳过提交
git rebase --skip

跳过当前有问题的提交

中止变基
git rebase --abort

完全中止变基过程

变基特定范围
git rebase --onto <newbase> <oldbase>

将提交从一个基础变基到另一个基础

基本变基示例

# 切换到功能分支
git checkout feature-branch

# 将功能分支变基到主分支
git rebase main

# 如果有冲突,解决冲突后继续
git add .
git rebase --continue

# 或者中止变基
git rebase --abort

高级变基选项

  • git rebase --autostash

    自动储藏和恢复未提交的更改

  • git rebase --committer-date-is-author-date

    保持原始作者日期

  • git rebase --no-ff

    即使可以快进也创建新的提交

  • git rebase --root

    变基所有提交(从第一个提交开始)

  • git rebase --keep-empty

    保留空的提交

最佳实践: 在执行变基前,确保你的工作目录是干净的。如果有未提交的更改,使用git stash先储藏它们,或使用git rebase --autostash自动处理。

变基工作流程

1. 准备变基

确保工作目录干净

2. 执行变基

git rebase <target-branch>

3. 解决冲突

处理任何合并冲突

4. 完成变基

git rebase --continue

详细变基流程

# 场景:将功能分支变基到主分支的最新状态

# 1. 更新主分支
git checkout main
git pull origin main

# 2. 切换到功能分支
git checkout feature-branch

# 3. 执行变基
git rebase main

# 4. 如果出现冲突:
# - 编辑冲突文件
# - 标记冲突已解决
git add conflicted-file.txt

# 5. 继续变基
git rebase --continue

# 6. 重复步骤4-5直到所有冲突解决

# 7. 推送到远程仓库(需要强制推送)
git push origin feature-branch --force-with-lease

变基冲突解决

变基过程中可能遇到的冲突类型:

# 冲突示例
<<<<<<< HEAD
这是主分支的内容
=======
这是功能分支的内容
>>>>>>> feature-branch: Commit message
解决步骤:
  1. Git会暂停变基并显示冲突文件
  2. 手动编辑文件解决冲突
  3. 使用git add标记冲突已解决
  4. 使用git rebase --continue继续
  5. 重复直到所有冲突解决

提示: 使用git status查看哪些文件有冲突,使用git rebase --abort可以完全取消变基操作。

交互式变基

交互式变基简介

交互式变基允许你编辑、重新排序、合并或删除提交。这是整理提交历史的强大工具。

# 启动交互式变基
git rebase -i HEAD~3

# 或者变基到特定提交
git rebase -i <commit-hash>
交互式变基操作:
  • pick:使用提交(默认)
  • reword:使用提交但编辑提交信息
  • edit:使用提交但暂停以修改提交
  • squash:将提交合并到前一个提交
  • fixup:类似squash但丢弃提交信息
  • drop:删除提交

交互式变基示例

编辑最近3个提交:

# 启动交互式变基编辑器
git rebase -i HEAD~3

# 编辑器会显示类似内容:
pick a1b2c3d 第一个提交
pick e4f5g6h 第二个提交
pick i7j8k9l 第三个提交

# 修改为:
reword a1b2c3d 更好的提交信息
squash e4f5g6h 第二个提交
pick i7j8k9l 第三个提交

技巧: 使用git log --oneline查看提交历史,确定要变基的提交范围。交互式变基是整理本地分支历史的理想工具。

常见交互式变基场景

合并多个提交

将多个小提交合并为一个有意义的提交。

pick 1234567 功能A第一部分
squash 2345678 功能A第二部分
squash 3456789 功能A第三部分
重新排序提交

改变提交的顺序以创建更合理的逻辑流。

pick 3456789 先完成这个功能
pick 1234567 然后完成那个功能
编辑提交信息

修复拼写错误或改进提交描述。

reword 1234567 修复拼写错误
pick 2345678 其他提交
拆分提交

将一个大的提交拆分为多个小提交。

edit 1234567 大功能提交
# 然后使用 git reset HEAD~ 和 git add -p

交互式变基最佳实践

  • 仅在本地分支使用:不要对已共享的分支使用交互式变基
  • 小批量操作:一次处理少量提交(5-10个)
  • 测试变基结果:变基后运行测试确保功能正常
  • 备份重要分支:变基前创建分支备份
  • 清晰提交信息:使用有意义的提交信息

警告: 交互式变基会重写提交历史。确保只在本地分支上使用,并且不要对已经推送到远程仓库的提交使用交互式变基。

恢复变基: 如果变基出错,可以使用git reflog找到之前的提交,然后使用git reset --hard恢复。

变基 vs 合并

变基的优势

  • 更清晰的历史:线性、易于理解的提交历史
  • 无合并提交:消除不必要的合并提交噪音
  • 更好的二分查找:线性历史使git bisect更有效
  • 更小的存储:通常产生更小的仓库大小
  • 冲突解决:在功能分支上解决冲突,保持主分支干净

合并的优势

  • 安全性:不重写历史,更安全
  • 简单性:操作更简单,冲突更少
  • 保留上下文:保留分支结构和合并上下文
  • 团队友好:适合团队协作,不会破坏他人工作
  • 审计追踪:清晰的合并记录显示功能何时集成

历史对比

合并历史
变基历史
方面 变基 合并
历史记录 线性、整洁 保留分支结构
安全性 较低(重写历史) 较高(不改变历史)
冲突解决 在功能分支解决 在合并时解决
适用场景 个人分支、本地整理 团队协作、公共分支
学习曲线 较陡峭 较平缓

何时使用变基

  • 整理本地功能分支的历史
  • 在合并到主分支前更新功能分支
  • 清理提交历史(合并、重写消息等)
  • 个人项目或本地开发
  • 尚未共享的分支

何时使用合并

  • 团队协作项目
  • 已推送到远程仓库的分支
  • 需要保留分支上下文的情况
  • 公共分支(如main、develop)
  • 需要清晰审计追踪的情况

黄金法则: 永远不要对已经推送到公共仓库的提交使用变基。只对你本地仓库中尚未共享的提交使用变基。

现代工作流建议: 在个人功能分支上使用变基来保持历史整洁,然后使用合并请求(Pull Request)将功能分支合并到主分支。这样既保持了主分支历史的清晰,又确保了团队协作的安全性。