
# 解决合并请求的代码冲突
#### 约束限制
可解决合并请求的文件冲突数量不得超过50个，且单文件冲突内容的大小不得超过200KB。
#### 判断合并请求冲突的方法
在多人团队使用代码托管服务时，可能出现两个人同时修改一个文件的情况，这时在推送（push）代码到代码托管仓库时就会出现代码提交冲突并推送失败，如下图就是因为本地仓库与远程仓库文件修改的冲突所产生的推送失败。
![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275713.png "点击放大")
判断代码冲突的方法：
- 当返回提示的内容包含信息：推送失败和另一个仓库成员的信息，即表示产生提交冲突。
- Git在文件合并时，对于同一个文件不同位置的修改内容会自动合并，当不同用户在同一个文件同一个位置被同时修改时（本地仓与远程仓的当前版本有差异），便会产生冲突。
- 在分支合并时，也可能产生冲突，如下图是本地分支branch1向master分支合并时产生了冲突（修改file01文件产生的冲突）。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002382801724.png "点击放大")
  
 #### 解决代码提交冲突的操作步骤
当代码提交冲突产生时，用户可以将远程代码仓库拉取（pull）到本地仓库的工作区，这时Git会将可以合并的修改内容进行合并，并将不能合并的文件内容进行提示，开发者只需要对提示的冲突内容进行修改即可再次推送到远程仓库（add → commit → push），便可解决完冲突。
如下图所示，在做拉取（pull）操作时，Git提示用户，一个文件合并时产生了冲突。
![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216156060.png "点击放大")
在修改冲突文件时应该考虑清楚，必要时要与冲突方联系协商解决，避免覆盖他人代码。
![](https://support.huaweicloud.com/usermanual-codeartsrepo/public_sys-resources/note_3.0-zh-cn.png)
git pull可以理解为git fetch和git merge的操作，其详细说明如下：
```
git fetch origin master #从远程主机的master分支拉取最新内容  
git merge FETCH_HEAD    #将拉取下来的最新内容合并到当前所在的分支中
```
在merge的时候，会将有冲突不能合并的内容做出提示。
 #### 示例：冲突的产生与解决
![](https://support.huaweicloud.com/usermanual-codeartsrepo/public_sys-resources/note_3.0-zh-cn.png)
本示例使用txt文本方式进行演示，在实际开发中，不同的文本编辑器或者编程工具的Git插件对冲突的展示会略有不同。
下面模拟一个情景来帮助理解冲突的产生和解决的过程，情景如下。
某公司的一个项目使用代码托管服务和Git工具来管理，这个项目有一个功能（假设此功能涉及的修改文件是file01）由开发者1号（以下用01_dev表示）和开发者2号（以下用02_dev表示）共同开发，项目上线前一周，大家都在修改代码，产生了如下情况。
1. file01存储在远程仓库，此时文件内容如下。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275717.png)
   
2. 01_dev在本地仓库修改了文件file01的第二行等内容，并已经成功推送到了远程仓库，此时01_dev的本地仓库和远程仓库的文件内容如下。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216156080.png)
   
3. 此时02_dev也在本地仓库修改了文件file01的第二行等内容，在推送远程仓库时Git提示file01文件上产生了冲突，02_dev的本地仓库文件内容如下，此时与远程仓库的冲突很明显。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216315844.png)
   
4. 02_dev将远程仓库的代码拉取到本地，发现文件第二行开始的冲突并马上联系01_dev进行[冲突的解决]。
5. 打开冲突的文件（如下图所示），发现都对第2行进行了修改，也都在最后一行添加了内容，Git将第二行开始的内容识别为冲突。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195845.png)
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/public_sys-resources/note_3.0-zh-cn.png)
   Git可以把两个人的修改同时显示出来，并用"======="分隔。
   - "\<\<\<\<\<\<\<HEAD" 与 "=======" 中间的是冲突位置中对应的本地仓库的修改。
   
   - "=======" 与 "\>\>\>\>\>\>\>" 中间的是冲突位置中对应的远程仓库的修改（也就是刚拉取下来的内容）。
   
   - "\>\>\>\>\>\>\>" 后面是本次的提交ID。
   
   - "\<\<\<\<\<\<\<HEAD"、"======="、"\>\>\>\>\>\>\>"、提交ID并非实际编写的代码，解决冲突时注意删除。
     
6. 两人商量的解决方案是保留两个人的修改内容，由02_dev负责修改，修改后02_dev的本地仓库文件内容如下图，同时保留了两个人的修改和新增内容。 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216315888.png)
   
7. 这样02_dev就可以重新推送（add → commit → push）本次合并后的更新到远程仓库，推送成功后，远程仓库文件内容如下。此时冲突解决 ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195825.png)
   
 
#### 如何避免冲突的产生
代码提交、合并冲突经常发生，但只要在代码开发前，做好仓库预处理工作，就能有效地避免冲突的产生。
在[示例：冲突的产生与解决]中，开发者02（02_dev）成功的解决了提交远程仓库时遇到的冲突问题，此时他的本地仓库与远程仓库的最新版本内容是一样的，但是开发者01（01_dev）本地仓库和远程仓库仍然是有版本差异的，此时如果直接推送本地仓库（push），仍然会产生冲突，那么如何避免呢？
**方式一（推荐新手使用）：**
如果开发者本地的仓库不常更新使用，在做本地修改时，可以重新clone一份远程仓库的内容到本地，修改后再次提交，这样直接解决了版本差异问题，但缺点是如果仓库较大、更新记录较多，clone过程将耗费一定的时间。
**方式二：**
如果开发者每天都要对本地仓库进行修改，则建议在本地新建一条开发分支进行代码修改，在要提交远程仓库时，切换到master分支并将远程仓库的最新master分支内容拉取到本地，在本地进行分支合并，对产生的冲突进行修复，成功将内容合并到master分支后，再提交到远程仓库。
#### 在代码托管服务的控制台上解决分支合并冲突
代码托管服务支持分支管理，在进行分支合并时，可能会产生冲突，本案例将复现产生冲突的分支合并请求，并解决合并请求冲突。
1. 新建一个仓库名为Demo_Test。
2. 基于master分支，新建一个名为"FileTest"的文件，内容如下图所示。 
   图1在master分支新建"FileTest"文件   
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002476990854.png "点击放大")
   
   
   
3. 基于"master"分支新建分支"branch_test"。此时"master"分支、"branch_test"分支中的内容是一致的，下面在两个分支间制造差异。
4. 在"master"分支中，将"FileTest"的内容修改为如下图所示，将提交信息填写为"Update FileTest in master"。
5. 切换到"branch_test"分支，修改"FileTest"内容如下图所示。将提交信息填写为"Update FileTest in branch_test"。此时"master"分支与"branch_test"分支的内容已产生差异，即代码冲突。 
   图2在"branch_test"分支修改FileTest
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002477173880.png "点击放大")
   
   
6. 切换到"branch_test"分支，单击右上角"新建合并请求"，新建一个合并请求，把"branch_test"分支合入"master"分支。 
   此时将自动跳转到新建的"合并请求详情"页面，如下图所示，代码托管提示用户**"代码合并冲突未解决"**，并建议用户"在线解决冲突"或"本地解决冲突"。
   图3新建合并请求   
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195801.png "点击放大")
   
   
7. 下面根据提示，解决冲突：
   
   - **在线解决冲突（** 推荐在代码量较小或涉及冲突的代码量较小的情况下使用）
     1. 单击"在线解决冲突"，跳转到页面解决代码冲突，如下图所示。用户可以单击"应用源分支"或"应用目标分支"解决合并冲突。如果选择"应用源分支"，将会把"branch_test"分支的内容应用到"master"分支；如果选择"应用目标分支"，将会把"master"分支的内容应用到"branch_test"分支。 
        
        
        
     
     2. 如果当前的冲突内容较多，用户可单击![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195821.png)，进入下图所示的页面，在线编辑并解决冲突。其中，"\<\<\<\<" 、"\>\>\>\>"、"===="所在行是冲突展现与分隔符，在修改代码解决冲突时，需要将其删除。
        图4在线手动解决冲突内容页面   
        ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216156012.png "点击放大") 
      
   
   - **本地解决冲突** （推荐在大型项目中使用）
     单击提示内容"本地解决冲突"，即弹出指导内容如下图所示，按照步骤操作即可解决冲突。
     ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216156072.png "点击放大")
     
   
   
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/public_sys-resources/note_3.0-zh-cn.png)
   代码托管服务会根据用户的分支名自动生成适合用户的Git命令，用户只需要复制并在本地仓库执行即可。
   
   
8. 使用[下面根据提示，解决冲突：]的两种方法之一，即可解决代码冲突，单击"合入"执行分支合并的操作，系统会提示用户合并成功，并且源分支"branch_test"与目标分支"master"的内容无差异。
![](https://support.huaweicloud.com/usermanual-codeartsrepo/public_sys-resources/caution_3.0-zh-cn.png)
- 如果用户的仓库是"所有访客只读"，当用户新建或者修改合并请求"标题"时，且标题内容包含违规词汇，新建或者修改合并请求标题将失败，并在右上角报错提示"合并请求标题存在违反法律法规的内容，请修改后重新提交。"
- 如果用户的仓库是"所有访客只读"，当用户的"描述"包含违规词汇或者图片，会审核不通过，在合并请求标题右侧将显示**标题或描述内容审核不通过，请及时修改，否则合并请求仅项目内成员可见。**并且此合并请求将不对其他成员展示，修改并合规后，将正常展示此合并请求信息。
 
