squash合并分支后再次同步仍显示旧提交差异该如何解决
问题根因
squash merge的机制是将源分支的多个提交压缩为1个全新的提交写入目标分支,不会在两个分支之间建立合并提交的父节点关联。PR1完成后main分支仅保留A、B、C压缩后的新提交,develop分支上的A、B、C原始提交仍然独立存在,Git无法识别这部分提交已经被合并到main,因此第二次合并时会重复识别这部分提交的差异。
可选解决方案
方案1:修改develop分支(一劳永逸,后续跨分支合并不会再出现该问题)
适合接受修改develop历史、需要长期维护两个分支同步的场景:
- 拉取本地最新代码
git checkout main git pull origin main git checkout develop git pull origin develop - 执行交互式重基,剔除已经合并过的旧提交
在弹出的编辑界面中,找到提交A、B、C对应的三行,将行首的git rebase -i mainpick修改为drop,保存并退出编辑器。 - 验证重基结果:执行
git log确认develop分支仅剩PR2合入的b-new相关提交,执行git diff main确认只有b-new对应的改动差异。 - 强制推送修改后的
develop分支:git push -f origin develop - 重新发起PR3,此时PR只会展示
b-new对应的新差异,正常走审批合并即可。
方案2:不修改现有develop分支(仅解决本次PR3问题,保留所有历史提交)
适合不想改动develop原有提交记录的场景:
- 拉取本地最新的
main和develop代码git checkout main git pull origin main git checkout develop git pull origin develop - 基于
main创建临时分支用于发起PR3:git checkout -b temp-for-pr3 main - 执行合并操作标记旧提交已合并:
git merge develop -s ours --no-commit - 手动应用
b-new对应的改动:可以直接从develop分支拷贝改动后的文件,或者执行git cherry-pick <PR2对应的合入提交ID>引入新改动。 - 提交改动:
git commit -m "合入develop分支最新改动(包含b-new功能)" - 推送临时分支:
git push origin temp-for-pr3 - 用该临时分支发起向
main的PR替换原有PR3,此时PR只会展示b-new的改动差异,走审批合并即可,合并完成后可删除临时分支,不影响现有develop分支的提交记录。
内容的提问来源于stack exchange,提问作者WenliL
相关产品推荐
相关产品推荐

