一次意外的 Git PR 提交混乱与修复记录
23
背景
在为 Casdoor 项目提交 enhance application name validation logic
功能时,我创建了一个新的分支 feat/validate-application-name
并提交了相关代码。但在提交与同步过程中,我不小心将另一个特性(Aliyun Captcha v2 的升级)相关的提交一并推送到了该分支,导致 PR(#3877)中包含了不属于本功能的多余变更。
本篇记录我如何清理提交历史并恢复一个干净的 PR。
问题发现
在 GitHub 上发起 PR 后,注意到:
- PR 包含了 5 个提交,其中只有 1 个是我真正想提交的。
- 多余的提交来源于另一个功能分支
feat/upgrade-aliyun-captcha
。 Files changed
显示有 21 个文件发生变更,远超预期。- 同时还有部分 CI 检查失败,提示合并不稳定。
原因分析
错误的根本原因是:在当前工作分支上进行了其他功能的开发或合并操作,并在未分支隔离的情况下直接推送。
具体表现为:
git pull
或merge
时不小心合入了别的分支;- 或使用了
git commit
提交了不属于当前功能的变更; - PR 基于错误的提交历史构建,导致提交堆叠。
修复思路
为避免关闭 PR 重开,我决定使用 git rebase -i
清理提交历史,保留当前功能相关的提交,删除其余。
操作步骤
- 查看提交历史:
git log --oneline
输出:
a5923d6 Merge branch 'feat/validate-application-name' ...
8cf669a feat: Add field check
12cc0f4 feat: remove support for Non trace verification...
8cc22de feat: upgrade Alibaba cloud captcha provider...
c2ed23b feat: enhance application name validation logic
- 交互式 Rebase:
git rebase -i HEAD~4
将打开如下内容:
pick c2ed23b feat: enhance application name validation logic
pick 8cc22de feat: upgrade Alibaba cloud captcha provider...
pick 12cc0f4 feat: remove support for Non trace verification...
pick 8cf669a feat: Add field check
pick a5923d6 Merge branch...
- 修改为:
pick c2ed23b feat: enhance application name validation logic
pick 8cf669a feat: Add field check
drop 8cc22de feat: upgrade Alibaba cloud captcha provider...
drop 12cc0f4 feat: remove support for Non trace verification...
drop a5923d6 Merge branch...
-
保存退出,等待 Rebase 完成。
-
强制推送:
git push -f origin feat/validate-application-name
效果验证
重新查看 GitHub PR 页面:
- PR 提交数已减少为 1 个;
Files changed
中无冗余文件;- 无其他功能变更混入;
- CI 检查重新运行并通过。
总结与教训
本次经历再次强调了分支隔离与提交管理的重要性:
- 每一个功能、Bug 修复都应使用单独的分支;
- 任何时候避免在功能分支上进行无关修改;
- 推送前使用
git log
、git diff
等命令检查提交范围; - 必要时用
git rebase -i
整理提交历史,保证 PR 的整洁性。
附录:相关命令清单
# 交互式 rebase 最近 N 次提交
git rebase -i HEAD~N
# 删除某些提交(使用 drop)
# 编辑完后强制推送到远程 PR 分支
git push -f origin your-feature-branch
# 检查当前提交历史
git log --oneline
一次意外的 Git PR 提交混乱与修复记录
https://cnqs.moe/archives/yi-ci-yi-wai-de-git-pr-ti-jiao-hun-luan-yu-xiu-fu-ji-lu