如何将GitHub仓库中squash and merge提交改写为merge commit提交?
重写Git历史:将Squash合并的PR改为Merge Commit
前提说明
重写公共仓库的Git历史会导致协作者本地代码与远程仓库不一致,操作前必须告知所有相关人员,确保他们后续能正确同步代码。
操作步骤
获取最新仓库代码
如果本地没有仓库,先克隆:git clone <你的GitHub仓库URL>如果已有本地仓库,先拉取最新远程分支:
git fetch origin git checkout main # 切换到主分支,比如main或master定位要修改的Squash提交与原始PR提交
- 用
git log --oneline查看主分支历史,找到被squash合并的单个提交(通常带PR标题),记下它的哈希值,比如abc123。 - 找到对应PR的原始提交:如果PR分支未删除,直接用分支名;如果分支已删,去GitHub的PR页面找到提交记录(GitHub会保存已删分支的PR提交),复制原始提交哈希,或点击"Restore branch"恢复分支。
- 用
回退到Squash合并前的状态
找到squash提交的前一个提交哈希(比如def456),执行重置:git reset --hard def456这会把主分支恢复到squash合并之前的状态。
用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,即使分支可以快进合并。重复处理所有需要修改的Squash提交
按时间顺序从最早到最新的squash提交,重复步骤2-4,确保每个PR都用merge commit合并。强制推送到远程仓库
所有修改完成后,强制覆盖远程主分支: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
相关产品推荐
相关产品推荐

