Git如何在同一分支中压缩指定范围的连续提交?
指定区间提交Squash操作步骤
注意:本次操作会改写分支提交历史,操作前请确认BranchA没有其他协作者未同步的本地提交,避免强推后影响其他人的开发流程。
- 第一步:切换到目标分支并同步最新状态
执行以下命令保证本地分支和远程分支代码完全一致:git checkout BranchA git pull origin BranchA - 第二步:启动交互式变基,定位到待修改区间的前置提交
我们要保留不动的最旧提交是commit1,因此把commit1的哈希作为交互式rebase的起点,执行命令:git rebase -i <commit1的完整哈希值> - 第三步:在交互编辑页标记需要压缩的提交
命令执行后会弹出编辑窗口,按提交时间从早到晚列出commit1之后的所有提交(也就是commit2、commit3、commit4、commit5),每行开头默认标记为pick:- 保留commit2行开头的
pick标记 - 将commit3、commit4行开头的
pick改为s(是squash的缩写,代表将当前提交合并到上一个相邻提交) - 保留commit5行开头的
pick标记不做修改
修改后的内容参考如下:
确认修改后保存退出编辑器。pick 7f3d2a1 commit2的提交信息 s 9c0b4e6 commit3的提交信息 s 2a8f1d9 commit4的提交信息 pick d4e7g03 commit5的提交信息 - 保留commit2行开头的
- 第四步:编辑压缩后的新提交信息
上一步保存后会自动弹出新的编辑窗口,展示被压缩的3个提交的原有提交信息,删除冗余内容,填写你需要的commitSQUASH对应的提交说明,保存退出后变基会自动执行完成,此时本地分支的提交顺序已经变为commit1 → commitSQUASH → commit5。如果变基过程中出现代码冲突,先手动解决冲突文件,执行
git add <解决完的冲突文件路径>标记冲突已解决,再执行git rebase --continue即可推进流程;如果要放弃本次变基回到操作前状态,执行git rebase --abort即可。 - 第五步:将改写后的提交历史推送到远程
因为变基改写了原有提交链,普通推送会被远程拒绝,需要执行带保护的强推命令:
该参数比裸git push origin BranchA --force-with-lease--force更安全,会在检测到远程存在你本地未同步的新提交时自动终止推送,避免误覆盖其他协作者提交的代码。
内容的提问来源于stack exchange,提问作者inttyl
相关产品推荐
相关产品推荐

