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

如何将GitHub仓库中squash and merge提交改写为merge commit提交?

重写Git历史:将Squash合并的PR改为Merge Commit

前提说明

重写公共仓库的Git历史会导致协作者本地代码与远程仓库不一致,操作前必须告知所有相关人员,确保他们后续能正确同步代码。

操作步骤

  1. 获取最新仓库代码
    如果本地没有仓库,先克隆:

    git clone <你的GitHub仓库URL>
    

    如果已有本地仓库,先拉取最新远程分支:

    git fetch origin
    git checkout main  # 切换到主分支,比如main或master
    
  2. 定位要修改的Squash提交与原始PR提交

    • 用git log --oneline查看主分支历史,找到被squash合并的单个提交(通常带PR标题),记下它的哈希值,比如abc123。
    • 找到对应PR的原始提交:如果PR分支未删除,直接用分支名;如果分支已删,去GitHub的PR页面找到提交记录(GitHub会保存已删分支的PR提交),复制原始提交哈希,或点击"Restore branch"恢复分支。
  3. 回退到Squash合并前的状态
    找到squash提交的前一个提交哈希(比如def456),执行重置:

    git reset --hard def456
    

    这会把主分支恢复到squash合并之前的状态。

  4. 用Merge Commit方式合并原始PR分支
    切换到原始PR分支(或用提交哈希直接合并):

    # 如果分支存在
    git merge --no-ff <PR分支名>
    # 如果分支已删,用原始提交哈希创建临时分支再合并
    git checkout -b temp-pr-branch <原始PR提交哈希>
    git checkout main
    git merge --no-ff temp-pr-branch
    

    --no-ff参数会强制生成merge commit,即使分支可以快进合并。

  5. 重复处理所有需要修改的Squash提交
    按时间顺序从最早到最新的squash提交,重复步骤2-4,确保每个PR都用merge commit合并。

  6. 强制推送到远程仓库
    所有修改完成后,强制覆盖远程主分支:

    git push origin main --force
    

后续注意事项

  • 协作者需要重新同步本地代码:可以删除本地仓库后重新克隆,或执行git fetch origin后用git reset --hard origin/main重置本地主分支。
  • 如果有CI/CD流水线,可能需要重新触发,因为仓库历史已变更。
  • 后续处理PR时,记得在GitHub上选择"Create a merge commit"选项,避免再用squash合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:55:04