You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改数月前合并PR的Git历史:从普通合并转为squash合并

解决方案:清理包含大二进制文件的Git历史

方案一:将原PR的多提交合并为单个提交(模拟squash合并效果)

这个方法能把cm1、cm2、cm3、cm4压缩成一个提交,彻底移除cm1中的二进制文件,同时保留后续master提交的完整性:

  1. 定位关键提交哈希

    • 找到那个普通合并提交的哈希(记为<merge_hash>,即把开发分支合并到master的那个提交)
    • 找到合并发生前,master分支的最后一个正常提交哈希(记为<master_pre_merge>)
  2. 创建临时分支并合并变更

    # 基于合并前的master创建临时分支
    git checkout -b fix-history <master_pre_merge>
    # 将开发分支最终提交cm4的所有变更 squash 到临时分支
    git merge --squash <cm4_hash>
    # 提交合并后的变更,用原PR的描述作为提交信息
    git commit -m "原PR的标题与描述内容"
    
  3. 迁移后续master提交到新分支

    # 切回master分支
    git checkout master
    # 将merge_hash之后的所有master提交,重新迁移到fix-history分支上
    git rebase --onto fix-history <merge_hash>
    
  4. 验证与推送

    • 用git log --oneline检查提交历史,确认原PR的提交已被压缩为单个,且cm1的记录消失
    • 用git ls-tree -r HEAD --name-only确认二进制文件已不在当前历史中
    • 强制推送更新远程master(必须提前告知所有团队成员,此操作会覆盖远程历史):
      git push origin master --force
      

方案二:直接清理历史中的二进制文件(更简单)

如果不需要保留原PR的单个提交语义,只想彻底移除所有历史中的目标二进制文件,可以用更可靠的git filter-repo替代git filter-branch:

  1. 安装git filter-repo(多数包管理器可直接安装,比如brew install git-filter-repo或apt install git-filter-repo)
  2. 执行清理命令:
    git filter-repo --path make/* --invert-paths
    
  3. 验证后强制推送到远程:
    git push origin master --force
    

重要注意事项

  • 所有团队成员必须删除本地master分支并重新克隆仓库,或者将本地master分支重置到新的远程版本:git fetch origin && git reset --hard origin/master
  • 任何基于旧master分支创建的特性分支,都需要重新rebase到新的master上
  • 操作前务必备份原仓库,避免数据丢失

内容的提问来源于stack exchange,提问作者Nebula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:57:57