背景
在 GitLab 上发起 feature → uat
的合并请求时,遇到冲突;你选择在 GitLab 网页端 Resolve conflicts ,结果解决冲突时,GitLab 把 uat 分支的代码合并进了 feature 分支,导致 feature 分支被污染。
现象
feature/my-feature 分支也有 uat 的代码,不符合预期

原因
- 在线 Resolve 的逻辑 :
- GitLab 并不是「只处理 MR 的合并结果」,而是直接在 源分支(feature) 上生成一个「冲突解决 commit」。
- 换句话说,你在线解决冲突时,GitLab 会修改 feature 分支,而不是只在 MR 合并时处理。
- 结果 :
- feature 分支上会多出一个 commit,里面包含了 uat 分支的冲突解决内容。
- 于是,feature 分支就「看起来像是被合并过 uat」,从而造成污染。
解决方案
本地手动操作:
bash
# 1. 切换到feature分支
git checkout feature/my-feature
# 2. 手动合并uat的最新代码(模拟GitLab的自动操作)
git merge origin/uat
# 3. 本地解决冲突
# 4. 提交并推送feature/my-feature
git push origin feature/my-feature
# 5. 此时MR可直接合并(无需线上resolve)
如果已经污染了 feature 分支怎么办?
如果你不想 feature 带上 uat
的代码,有两种修复方式:
方案 A:回滚 feature 的污染 commit
perl
git checkout feature/my-feature
git log # 找到污染的 merge/resolve commit
git revert <commit-id>
git push origin feature/my-feature
方案 B:强制 reset 到污染前的版本
(如果团队允许,且 feature 上没重要改动)
perl
git checkout feature/my-feature
git reset --hard <正确的commit-id>
git push origin feature/my-feature -f
建议
- 不要用 GitLab 在线冲突解决,除非是临时性的 hotfix。
- 团队流程最好规定:冲突必须在本地解决。
- 如果必须线上解决,可以新建临时分支(resolve 分支),解决冲突后再合并,避免污染 feature。