当 GitLab 提示 无法自动合并(Merge conflict) 时,其实可以简单理解为:

  • 落后于 main 分支 2 个提交 → 别人已经往 main 提交了 2 次代码,你的分支还没有这些内容。
  • 超前于 main 分支 4 个提交 → 你的分支有 4 次自己的提交,main 还没有。

如下图理解:

main:
A --- B --- C --- D

feature:
A --- B --- E --- F --- G --- H

其中:

  • C、D 是 main 新增的 2 个提交(你落后 2 个)
  • E、F、G、H 是你的 4 个提交(你超前 4 个)

Git 无法判断某些文件到底保留谁的修改,所以需要你手工处理。


方法一(推荐):本地解决冲突后再推送

第一步:切换到你的开发分支

例如:

git checkout feature

查看当前分支:

git branch

* 的就是当前分支。


第二步:拉取最新代码

git fetch origin

此命令只下载代码,不会修改你的代码。


第三步:把 main 合并到当前分支

git merge origin/main

或者:

git merge main

如果没有冲突:


Merge made by the 'ort' strategy.

直接跳到第六步。


第四步:解决冲突

如果出现:

CONFLICT (content): Merge conflict in xxx.py
Automatic merge failed

说明有文件冲突。

打开冲突文件:

<<<<<<< HEAD
这是你分支的代码
=======
这是main分支的代码
>>>>>>> origin/main

例如:

<<<<<<< HEAD
name = "张三"
=======
name = "李四"
>>>>>>> origin/main

你需要改成最终想保留的内容:

name = "张三"

或者:

name = "李四"

或者:

name = "张三"
name2 = "李四"

然后删除:

<<<<<<<
=======
>>>>>>>

这些标记。


第五步:告诉 Git 冲突已解决

解决完所有冲突文件后:

git add .

提交合并结果:

git commit

会自动生成类似:

Merge branch 'main' into feature

保存退出即可。


第六步:推送到 GitLab

git push origin feature

第七步:重新创建 Merge Request

返回 GitLab:

Merge Requests

页面刷新后通常会变成:

✓ No conflicts

然后点击:

Merge

即可。


方法二:使用 Rebase(很多公司推荐)

如果团队要求提交记录保持整洁,可以:

git checkout feature

git fetch origin

git rebase origin/main

发生冲突时:

git status

查看冲突文件。

修改文件后:

git add .
git rebase --continue

重复直到完成。

然后:

git push --force-with-lease

最后再去 GitLab 合并。


如何判断该用 merge 还是 rebase?

如果你不确定:

git merge origin/main

这是最简单、安全的方法。

只有团队明确要求:

请 rebase 后再提交

才使用 rebase。


GitLab 网页上的 "Resolve conflicts" 能用吗?

可以,但只适用于:

  • 冲突文件少
  • 修改内容简单

复杂项目不推荐。

最好在本地:

git merge origin/main

解决后再 push。


一个完整示例

假设:

main
feature-login

GitLab 显示:

2 commits behind
4 commits ahead
Cannot merge automatically

执行:

git checkout feature-login

git fetch origin

git merge origin/main

解决冲突:

git add .

git commit

git push origin feature-login

回到 GitLab:

Merge Request
↓
Merge

即可完成合并。

如果你把 GitLab 上显示的完整提示(包括 "2 commits behind, 4 commits ahead" 那一页截图或文字)发给我,我可以按照你的实际分支名称(例如 mainmasterdevrelease)一步一步告诉你应该执行哪些命令。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐