
# 使用合并请求预合并
#### 合并请求预合并概述
合并请求预合并指的是在Repo生成一个临时合并节点，合并请求创建后且代码还没有合入，用户可通过自定义Webhook、流水线等下载插件的脚本，下载Repo预合并后的代码用于代码构建等操作。
合并请求预合并具备如下优势：
- 当一个合并请求需要拉起几十或上百台服务器的构建，本地客户端做预合并可能会与服务端产生的结果不一致，导致构建代码获取不够准确、构建结果不准确等问题。
- 通过开启"合并请求预合并"，可以解决该实时性问题，并且构建脚本命令相比本地预合并脚本更简单，开发人员更容易上手。
 
#### 约束限制
- 需要开启"合并请求预合并"。
- 用户需要有"设置"权限，可参考[配置项目级的Repo权限](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0087.html)。
 
 #### 使用示例
下述示例展示了"开启"和"未开启"的脚本，可见"开启"的脚本更简洁、高效。
- **开启合并请求预合并**，当合并请求创建后，则服务端会帮助用户生成一个临时合并节点，进而用户可以直接下载已临时合并的代码。具体操作步骤如下：
1. 初始化本地代码仓，其中${repo_url}为合并请求仓库地址。 
   ```
   git init  
   git remote add origin ${repo_url}
   ```
   
   
2. 拉取服务端临时合并节点到本地分支。 
   ```
   git fetch origin +refs/merge-requests/${repo_MR_iid}/merge:refs/remotes/origin/${repo_MR_iid}/merge
   ```
   - 如下图所示，合并请求标题下的"10"即为"repo_MR_iid"。
     图1合并请求IID   
     ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002415793009.png) 
   
   - merge-requests/${repo_MR_iid}/merge表示临时合并节点。
   
   
   
   
3. 检出分支，即可获得预合并后代码。 
   ```
   git checkout ${repo_MR_iid}/merge
   ```
   
   
- **未开启合并请求预合并**，用户需要在客户端分别下载合并请求源分支、合并请求目标分支的代码，并在构建执行机自行完成合并动作。具体操作步骤如下：
1. 初始化本地代码仓，其中repo_url为合并请求仓库地址。 
   ```
   git init  
   git remote add origin ${repo_url}
   ```
   
   
2. 拉取并检出合并请求目标分支，其中，"repoTargetBranch"为合并请求目标分支。 
   ```
   git fetch origin +refs/heads/${repoTargetBranch}:refs/remotes/origin/${repoTargetBranch}
   git checkout ${repoTargetBranch}
   ```
   
   
3. 拉取合并请求源分支到本地分支。 
   ```
   git fetch origin +refs/merge-requests/${repo_MR_iid}/head:refs/remotes/origin/${repo_MR_iid}/head
   ```
   - 如下图所示，合并请求标题下的"10"即为"repo_MR_iid"。
   
   
   图2合并请求IID   
   ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275461.png)
   - "merge-requests/${repo_MR_iid}/head"表示合并请求源分支。
   
   
   
   
4. 本地执行合并的命令，即可获得预合并后代码。 
   ```
   git merge refs/remotes/origin/${repo_MR_iid}/head --no-edit
   ```
   
   
 
