Gitlab多开发者协作时feature分支提production合并请求混入冗余master提交怎么办
核心问题原因
- 分支提交线分叉无同步规则:master(对接staging环境)和production分支是两套独立的提交线,没有固定的同步机制,长期运行后两个分支的提交历史差异会越来越大。
- 合并路径违反上游规则:所有feature分支的上游基准是production,但遇到推送master冲突时,执行了
git pull origin master类的合并操作,直接将master的差异提交合并进了feature分支,相当于用master的提交污染了基于production创建的feature分支。 - 测试流程设计不合理:直接将feature分支合并/推送到master做测试,进一步拉大master和production的提交差异,所有需要进staging测试的feature都会面临同样的提交污染问题。
解决方案
即时修复:清理当前被污染的NewFeature1分支
执行以下操作即可清除feature分支中混入的master提交,仅保留功能相关提交:
- 切换到NewFeature1分支并做本地备份,防止操作失误丢失代码:
git checkout NewFeature1 && git branch NewFeature1_bak - 基于最新的远程production分支做交互式变基,筛选保留自己的功能提交:
git fetch origin && git rebase -i origin/production - 在弹出的变基编辑界面中,仅保留你自己的功能提交前的
pick标记,其余所有来自master的提交前的标记改为drop,保存退出后根据提示解决可能出现的冲突。 - 验证变基后的代码和你最终要上线的功能代码完全一致后,强制推送更新远程的NewFeature1分支:
git push -f origin NewFeature1
操作完成后再向production发起合并请求,就只会展示你自己的功能提交。
长期工作流优化
从流程和操作层面彻底规避同类问题:
- 明确分支合并限制:所有feature分支仅允许从production拉取基准代码,永远不允许直接把master分支的代码合并进feature分支。
- 调整staging测试规则:不再直接接受feature分支推送/合并到master,改为先将feature分支变基到最新的master后再推送测试;测试通过的代码必须先合并到production分支,再定期将production分支全量同步到master,保证master和production的提交线完全一致,不会出现分叉。
- 配置分支权限管控:给master分支设置合并限制,仅允许从production分支同步代码,不允许直接合入任何feature分支的提交,从操作层面避免流程违规。
- 统一冲突处理规范:往master推送代码遇到冲突时,不要在feature分支合并master代码,而是执行
git fetch origin && git rebase origin/master将自己的功能提交变基到最新的master上,变基操作只会移动你自己的提交,不会把master的历史提交混入feature分支。
内容的提问来源于stack exchange,提问作者EvanMcFly
相关产品推荐
相关产品推荐

