git 如何解决分支合并冲突(VS code可视化解决+gitLab网页解决)

发布于:2025-06-02 ⋅ 阅读:(28) ⋅ 点赞:(0)

1、定义:两个分支修改了同一文件的同一行代码,无法自动决定如何合并代码,需要人工干预的情况。(假设A提交了文件a,此时B在未拉取代码的情况下,直接提交是会报错的,此时需要拉取之后再提交才会成功)

2、原始冲突解决演示:

背景:假设现在有主分支:develop,开发分支A,开发分支B,二者都是基于develop分支创建的,此时A 先向develop分支合并了一个文件index.js。然后B紧接着向develop分支上合并了自己修改的index.js文件,以为A和B都在index.js中写了不同的代码,此时git不知道保留哪段代码。此时就会报代码冲突。怎么解决呢?这里介绍的是在gitLab网页上做合并分支操作的情况。

首先如果出现代码冲突时,gitLab会给出提示提醒你合并冲突了,此时针对的代码冲突可以在gitLab上点击在线解决, 

如果不想在线解决冲突,也可在VS code中解决。首先使用git remote update -p  # 获取所有远程最新数据,并清理过时的远程分支 。其次git checkout 自己的开发分支名   # 切换到你的分支(假设当前不在你的分支)。然后git merge 主分支名   # 将远程 develop 分支合并到你的分支。此时在左侧的源代码管理中会列举冲突的文件(右侧会提示感叹号),点击进去会显示具体的冲突代码,此时可以依据自己的需求解决冲突之后,然后重新提交推送合并即可。

3、上面说到的原始合并冲突会有个情况,即开发分支B收到了develop的污染。下面说下进阶版。

背景:假设现在有主分支 :develop,开发分支A,开发分支B,初版发布分支1.1.0,更新版发布分支1.1.1,本次发布分支1.1.2。此时A与B分支都是基于1.1.0分支创建的,develop是调试用的分支。发布时会将各自的开发分支合并至发布分支上,但此时有个复杂情况就是分支A是第二次迭代的时候合并至1.1.1上了,此时分支B是第三次迭代的开发分支,是需要合并到1.1.2上的,此时有人就会问了,为什么B分支不在1.1.1的基础上创建呢?因为第二次迭代与第三次迭代是同步开发的。此时我再想通过merge develop到B分支上时就会出现污染。因为develop分支上可能存在某些代码是本次发布不需要发布出去的代码。此时,比如有个需求,需要在开发分支B上修改1.1.1分支上的某个文件index.js,此时应该怎么做呢?

解决方案:使用 gitcheckout+临时分支(推荐)

第一步:在本地模拟合并冲突

# 1. 确保当前在B分支且工作区干净
git checkout B
git status  # 确认没有未提交的修改

# 2. 基于当前B创建临时分支(用于安全测试合并)
git checkout -b 临时分支名称

# 3. 尝试将 develop 合并到临时分支(触发冲突):(这里也可以merge1.1.1分支,只是develop是调试分支,所有的开发分支都需要合并至develop分支验证通过才会合并至1.1.2上),这里解决的是B分支与develop分支合并冲突。

git merge develop
#这里会报冲突,但不会影响原B分支

第二步:在 VSCode 中查看冲突

VSCode 会自动检测冲突:
1.打开 源代码管理面板(左侧导航栏的 Git 图标)。
2.冲突文件会显示为 红色感叹号 !,文件名旁标注 CONELICT 。
3.点击冲突文件,会看到冲突标记(<<<<<<<、==----=、>>>>>>>)。

手动查看冲突文件:git status

第三步:清理临时分支(不保存合并结果),此时B分支完全未被修改,且你已知道冲突文件。

git checkout B #切换回原分支

git branch -D 临时分支名 #强制删除临时分支

第四步:此时可将刚刚在临时分支上解决好的冲突代码复制一份替换至B分支上,此时就可以精确的解决index.js文件的代码冲突,而不会造成污染。此时再次提交推送合并即可。


网站公告

今日签到

点亮在社区的每一天
去签到