GitHub PR 显示无关提交与未修改文件,求长期解决方案
问题核心原因
你们团队采用 squash merge 方式合并PR到master,这个操作会把原feature分支的所有提交压缩成一个全新的提交写入master,不会保留原feature分支的提交哈希和提交链关联关系,这是导致你遇到问题的根本原因。
为什么git pull无效、rebase有效
执行git pull origin master时,默认会执行**合并(merge)**操作:Git会把master上的新提交和你的feature分支做三方合并,但因为你之前在feature分支的开发提交并没有真实存在于master的提交链上,Git无法识别这些变更已经被压缩合入master,就会把已经合入的旧变更也识别为你当前分支的独有变更,所以PR的Files Changed会显示大量无关文件。哪怕你重复执行pull提示Already up to date,也只是说明你本地分支已经包含了master的最新提交,不会解决提交链关联异常导致的变更识别错误。
而执行git rebase master时,相当于把你当前feature分支的所有提交,全部挪动到最新的master提交之上,Git会逐个比对提交的变更内容,自动跳过已经被squash到master里的重复变更,最后剩下的就只有你真正在当前feature分支上做的修改,PR的变更展示自然就恢复正常。
长期feature分支的最优同步方案
如果你们团队固定使用squash merge合入master,长期维护的feature分支推荐统一用rebase同步master代码,你之前使用的操作流程是完全正确的:
# 更新本地master到最新版本 git checkout master git pull # 切回feature分支执行rebase git checkout feature1 git rebase master # 解决完冲突后安全强制推送 git push --force-with-lease
如果不想每次切到本地master更新,也可以直接执行以下命令简化操作:
git fetch origin master git rebase origin/master git push --force-with-lease
注意事项
- 如果是多人协作的公共feature分支,rebase前要和其他开发同步操作时间,避免你强制推送后覆盖其他人刚提交的代码
- rebase操作只针对还在开发中、未合入master的feature分支执行,不要对已经合入的分支做rebase
- 如果你实在不习惯用rebase,也可以在提PR前基于最新master新开分支,把原feature分支的变更cherry-pick到新分支提交PR,也能避免无关变更问题,只是效率低于rebase
内容的提问来源于stack exchange,提问作者Sharad

