当前位置: 首页 > news >正文

git --- git rebase -i 重新编写提交历史

git --- git rebase -i 重新编写提交历史

  • 场景 A:合并多个零散提交 (Squash/Fixup)
  • 场景 B:修改历史提交信息 (Reword)
  • 场景 C:修改提交或拆分提交 (Edit)
  • 场景 D:合并提交并丢弃信息 (fixup)
  • 场景 E:删除提交(drop)
  • 注意事项

git rebase -i(Interactive Rebase)是 Git 的“时光机”和“手术刀”。它允许你重新编写提交历史,让 Commit Log 变得整洁、专业。

核心指令:编辑器里的“手术刀”

  • 执行命令的通用格式为:git rebase -i HEAD~n或者git rebase -i <commit id>~n(n 代表你想要往回修改的提交数量)
  • 如果想对某一区间的commit进行操作:git rebase -i 12345~n
  • 当你输入命令后,Git 会打开一个文本编辑器(通常是 Vim 或 Nano),你会看到类似下面的列表:
pick 1a2b3c4 fix bu pick 5e6f7g8 update readme pick 9h0i1j2 add logic

你只需要将开头的 pick 改为以下关键词:

  • pick (p ):保留,不做改动。
  • reword (r ):只改 Commit Message,不改代码。
  • edit (e):停下来,让你修改代码、拆分提交。
  • squash (s):合并到前一个提交,并保留两个提交的信息。
  • fixup (f):合并到前一个提交,但丢弃当前的提交信息(最常用)。
  • drop (d):彻底删掉这个提交。

Git 变基的底层执行流程
当你保存 rebase -i 的指令单并退出时,Git 实际上在后台做了以下工作:

  • 分离头指针 (Detach HEAD):Git 将 HEAD 指针回退到你指定的范围起点之前的那个提交(即 HEAD~4 的父提交)。
  • 创建临时区域:Git 准备按照你的清单,从上到下重新“录制”每一个提交。
  • 逐行执行指令:
  • 如果是 pick,它就像 cherry-pick 一样把那个提交复制过来。
  • 如果是 reword/edit,它会停下来等你操作,产生一个新的 Commit ID。
  • 如果是 squash/fixup,它会把改动堆叠在当前的临时提交上,不产生新节点。
  • 更新分支指向:当所有指令执行完毕,Git 会将你的分支名(如 main)从旧的终点指向这个新产生的一串提交。

场景 A:合并多个零散提交 (Squash/Fixup)

squash (s)- 合并提交并保留信息
作用:将当前提交合并到前一个提交,同时保留两个提交的信息。
使用场景:想保留所有提交的详细信息。
操作流程:

# 1 执行变基gitrebase -i HEAD~3# 2 将后两个提交改为 spick a1b2c3d feat: 新增用户功能 s d4e5f6g fix: 修复登录bug s g7h8i9j docs: 更新文档# 3 保存退出后,Git 打开编辑器让你编辑合并后的提交信息# 会显示所有被合并提交的原始信息,你可以编辑整理# 4 保存退出,三个提交合并为一个

场景 B:修改历史提交信息 (Reword)

reword (r )- 修改提交信息
作用:只修改提交的备注信息,不改变代码内容。
使用场景:纠正写错的提交信息(如拼写错误、表述不清)。
操作流程:

#1执行变基 git rebase-i HEAD~3#2将需要修改信息的提交改为 r pick a1b2c3d feat:新增用户功能 r d4e5f6g fix:修复登录bu # 改为 r pick g7h8i9j docs:更新文档 #3保存退出后,Git 会再次打开编辑器让你修改提交信息 # 原信息:fix:修复登录bu # 修改为:fix:修复登录bug #4保存退出,提交信息被修改

场景 C:修改提交或拆分提交 (Edit)

edit (e)- 编辑提交内容
作用:暂停变基过程,让你修改该提交的代码内容或拆分提交。
使用场景:

  • 历史提交中的代码
  • 拆分一个大提交为多个小提交

操作流程(修改代码):

# 1 执行变基gitrebase -i HEAD~3# 2 将需要修改的提交改为 epick a1b2c3d feat: 新增用户功能 e d4e5f6g fix: 修复登录bug# 改为 epick g7h8i9j docs: 更新文档# 3 保存退出后,Git 提示暂停变基# Stopped at d4e5f6g... fix: 修复登录bug# You can amend the commit now, with:# git commit --amend# 4 修改代码文件vimlogin.js# 修改代码# 5 添加修改并覆盖提交gitaddlogin.jsgitcommit --amend# 可修改提交信息或保持不变# 6 继续变基gitrebase --continue# 7 变基完成

操作流程(拆分提交):

# 1 执行变基gitrebase -i HEAD~3# 2 将需要拆分的提交改为 ee a1b2c3d feat: 新增用户功能和订单功能# 改为 e# 3 保存退出后,Git 暂停变基# 4 撤销提交但保留工作区修改gitreset HEAD^# 5 分批提交gitadduser.jsgitcommit -m"feat: 新增用户功能"gitaddorder.jsgitcommit -m"feat: 新增订单功能"# 6 继续变基gitrebase --continue

场景 D:合并提交并丢弃信息 (fixup)

fixup (f) - 合并提交并丢弃信息(最常用)
作用:将当前提交合并到前一个提交,但丢弃当前提交的信息。
使用场景:清理小的修复提交,只保留主要提交信息。
操作流程:

# 1 执行变基gitrebase -i HEAD~3# 2 将后两个提交改为 fpick a1b2c3d feat: 新增用户功能 f d4e5f6g fix: 修复样式问题 f g7h8i9j fix: 调整间距# 3 保存退出,Git 自动合并,只保留第一个提交的信息# 三个提交合并为一个,提交信息为 "feat: 新增用户功能"

场景 E:删除提交(drop)

作用:彻底删除该提交。
使用场景:移除无用的调试、测试或错误提交。
操作流程:

# 1 执行变基gitrebase -i HEAD~3# 2 将需要删除的提交改为 dpick a1b2c3d feat: 新增用户功能 d d4e5f6g test: 临时调试代码# 改为 dpick g7h8i9j fix: 修复登录bug# 3 保存退出,该提交被彻底删除

注意事项

  1. 冲突处理:如果变基过程中出现冲突,解决冲突后执行:
gitadd.gitrebase --continue# 或放弃变基:git rebase --abort
  1. 仅限本地:不要修改已经推送到远程的提交,否则会导致团队协作问题
  • 如果个人开发或和团队其他成员确认后,可推送至远端
  • 当你使用 git rebase -i 修改了本地提交历史后,本地的提交历史和远程仓库的提交历史已经不一致了。这时候直接 git push 会失败,因为 Git 不允许你覆盖远程的提交历史, 但是可以使用下面的命令:
  • git push --force origin <branch-name>(不推荐)
  • 你自己的独立分支(没有其他人在使用)
  • 实验性分支
  • 确定不会影响团队其他成员的情况
  • git push --force-with-lease origin <branch-name>
  • 会检查远程分支是否有你不知道的新提交
  • 如果有其他人在你变基后推了新提交,Git 会拒绝推送,避免覆盖他人的工作
  1. 备份:重要操作前建议创建备份分支:
gitbranch backup-before-rebase
  1. 强制推送的风险
  • 覆盖他人提交:可能会丢失其他团队成员的工作
  • 破坏 CI/CD:可能导致构建历史混乱
  • 其他开发者困惑:团队成员的本地分支会与远程不一致
  1. 强制推送的安全使用原则
  • 只在自己的分支上使用:确保没有其他人在使用该分支
  • 提前沟通:如果必须在共享分支上变基,先通知团队成员
  • 使用 --force-with-lease:比 -f 更安全
  • 做好备份:变基前创建备份分支
http://www.jsqmd.com/news/151980/

相关文章:

  • ROFL-Player深度体验:解锁英雄联盟回放文件的隐藏宝藏
  • 2025年口碑好的复合麦片生产线实力厂家TOP推荐榜 - 行业平台推荐
  • ESP-Drone开源飞控:从零打造智能无人机的终极教程
  • 我是如何在3天内从编译小白到精通Compiler Explorer的实战经验
  • 从B站m4s缓存到通用MP4:技术转型的完美实现
  • 和风天气Home Assistant插件:让你的智能家居拥有天气感知能力
  • 进口清关提速:关税分类AI辅助决策
  • MHY_Scanner:简单高效的代码漏洞扫描工具入门指南
  • 虚幻引擎资源探索利器:开启游戏开发新视界
  • GitHub Markdown CSS终极指南:快速实现专业文档排版
  • 远程医疗问诊:症状描述AI初步判断
  • DaVinci Developer与MATLAB联合仿真的项目应用
  • 解锁B站缓存宝藏:m4s转MP4的完美解决方案
  • layerdivider图像分层工具完全指南:从技术原理到实战应用
  • 基于深度学习的图像安全与隐私保护研究方向调研(中)
  • 语音合成革命:多语言混合技术终极解决方案
  • MHY_Scanner全攻略:告别手机扫码,5秒完成米哈游游戏登录
  • 怎样高效备份微博内容:3步完成数字记忆永久保存
  • Video2X终极指南:如何快速实现视频无损放大
  • Happy Island Designer 终极岛屿规划指南:从基础到精通的完整教程
  • 物业管理升级:报修识别+自动派单AI
  • B站缓存视频转换完全指南:m4s转MP4一键搞定
  • 基于深度学习的图像安全与隐私保护研究方向调研(下)
  • GitHub Markdown CSS终极样式库:三步打造专业技术文档
  • 如何在5分钟内完成PVE-VDIClient虚拟桌面客户端的完整部署
  • 智能家居天气集成终极指南:5步搞定Home Assistant天气插件配置
  • 视频下载工具完整教程:3分钟学会保存任何网页视频
  • 74HC14施密特触发器系统学习:集成六路单元的应用技巧
  • B站m4s视频转换终极指南:轻松解锁缓存视频永久播放权
  • 电子病历分析:疾病风险AI预测模型