为何已在master上的提交会被推送到feature分支的PR中?
为什么Rebase后推送PR会出现大量重复提交?
核心原因
Git中rebase和merge的本质差异直接导致了这个问题:
- Merge:会生成一个新的合并提交,保留特性分支和master分支的原始提交历史,PR只会展示特性分支上新增的、master没有的提交。
- Rebase:会把特性分支的所有提交重新基于master的最新提交“重演”一遍,生成全新的提交对象(哪怕内容完全一致,Git哈希值也会改变)。如果此时用
git push --force(或--force-with-lease)强制推送,远程分支的旧提交会被覆盖,PR会把这些“重生的旧提交”判定为特性分支的新增内容,从而出现大量master已有的历史提交。
常见操作诱因
- 本地对特性分支执行
git rebase master后,未意识到远程特性分支还保留着旧的提交记录,直接强制推送。 - 多人协作同一特性分支时,他人已推送基于旧master的提交,你本地rebase后强制推送覆盖远程历史,导致PR混入rebase重演的所有master提交。
- 误将master分支rebase到特性分支,再推送到PR对应的远程分支(这类失误虽少见,但新手容易踩坑)。
修复方案
- 未强制推送时:立刻放弃rebase,改用
git merge origin/master同步上游代码,这样PR不会出现重复提交。 - 已强制推送导致PR混乱时:
- 拉取远程分支最新状态:
git fetch origin - 通过
git reflog找到推送rebase前的本地分支提交哈希,执行重置:git reset --hard <旧提交哈希> - 用merge方式同步master:
git merge origin/master - 正常推送(无需强制):
git push origin <你的特性分支名> - 若想保留干净的线性历史,可新开一个基于最新master的分支,用
git cherry-pick把特性分支的有效提交移过去,再推送新分支创建PR。
- 拉取远程分支最新状态:
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

