如何清理Git master分支历史,仅保留合并提交删除多余本地提交
前置提醒:重写公共分支(如master)的历史属于高风险操作,操作前务必完整备份当前仓库的所有提交。如果master为多人协作分支,重写完成后必须通知所有协作者执行强制拉取操作更新本地master分支,避免后续合入产生大量冲突。
方法1:修复最新的1~2笔不符合规范的合并提交
如果不符合要求的合并提交是当前master的最新提交,且之后没有其他新的合入,用软重置方案最简单:
- 确认当前分支为master,且工作区、暂存区无未提交的变更
- 执行软重置回到合并前的master节点:
git reset --soft HEAD^
该操作会把合并带进来的所有代码变更全部保留到暂存区,同时删除对应的合并提交以及功能分支的所有本地提交 - 重新生成合并提交,可以直接沿用原来的合并提交信息:
git commit -m "你的合并提交信息" - 推送到远端需要执行强制推送:
git push -f origin master
方法2:批量修复历史多笔不符合规范的合并提交
你之前使用rebase -i -p操作失败,是因为-p/--preserve-merges参数已经被Git官方标记为废弃,和交互式变基的squash操作兼容性很差,推荐用-r/--rebase-merges参数替代,操作步骤:
- 确定需要重写的历史范围,比如你要修改最近的3笔合并对应的提交记录,范围可以稍微选大一点避免遗漏:
git rebase -i -r HEAD~10 - 在弹出的交互式编辑界面中,保留所有合并提交行开头的
pick状态,将所有属于功能分支的本地提交行开头的pick修改为squash(如果不需要保留这些提交的信息可以改成fixup),注意要将待压缩的提交放到对应的合并提交行之后 - 保存退出编辑器后Git会自动执行历史重写,遇到冲突时解决冲突后执行
git rebase --continue继续操作即可,操作出错可以执行git rebase --abort回退到操作前的状态 - 重写完成后确认历史符合预期,执行强制推送更新远端分支:
git push -f origin master
内容的提问来源于stack exchange,提问作者Developer006
相关产品推荐
相关产品推荐

