

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 合并 Amazon CodeCommit 存储库中的拉取请求
<a name="how-to-merge-pull-request"></a>

审核完代码并满足拉取请求的所有审批规则（如果有）后，您可以通过以下几种方式之一合并拉取请求：
+ <a name="is-mergable"></a>您可以在控制台中，使用可用的合并策略之一，将源分支合并到目标分支中，这也会关闭拉取请求。您也可以在控制台中解决合并冲突。控制台将显示一条消息，指示拉取请求是否可合并，或者是否必须解决冲突。当所有冲突都得以解决并选择 **Merge (合并)** 后，将使用您所选合并策略执行合并。快进是默认的合并策略，这是 Git 的默认选项。根据源和目标分支中的代码的状态，可能无法使用该策略，但可以使用其他选项，例如压缩或三向。
+ 在 Amazon CLI 中，您可以使用快进、压缩或三向合并策略合并和关闭拉取请求。
+ <a name="why-git-merge"></a>在本地计算机上，可以使用 **git merge** 命令将源分支合并到目标分支中，然后将合并的代码推送到目标分支。这种方法有缺点，你应该仔细考虑。无论对拉取请求的审批规则要求是否得以满足，它都会合并拉取请求，从而绕过这些控件。如果使用快进合并策略合并拉取请求，则合并和推送目标分支也会自动关闭拉取请求。这种方法的一个优点是，**git merge** 命令允许您选择 CodeCommit 控制台中不可用的合并选项或策略。有关 **git merge** 和合并选项的更多信息，请参阅 [git-merge](https://git-scm.com/docs/git-merge) 或 Git 文档。

如果拉取请求的源分支或目标分支已删除，CodeCommit 将自动关闭拉取请求。

**Topics**
+ [合并拉取请求（控制台）](#how-to-merge-pull-request-console)
+ [合并拉取请求 (Amazon CLI)](#how-to-merge-pull-request-cli)

## 合并拉取请求（控制台）
<a name="how-to-merge-pull-request-console"></a>

您可以使用 CodeCommit 控制台合并 CodeCommit 存储库中的拉取请求。在拉取请求的状态变为 **Merged (已合并)** 后，它不再显示在处于打开状态的拉取请求列表中。合并的拉取请求划分为 closed (已关闭)。无法将其改回到 **Open (打开)**，但用户仍然可以对更改发表评论和回复评论。合并或关闭拉取请求后，您无法对其进行审批、撤销其审批，或覆盖应用于拉取请求的审批规则。

1. 打开 CodeCommit 控制台：[https://console.aws.amazon.com/codesuite/codecommit/home](https://console.amazonaws.cn/codesuite/codecommit/home)。

1. 在**存储库**中，选择存储库的名称。

1. 在导航窗格中，选择**拉取请求**。

1. 默认情况下，会显示所有处于打开状态的拉取请求的列表。选择要合并的打开拉取请求。

1. 在拉取请求中，选择 **Approvals (审批)**。查看审批人列表，并验证所有审批规则（如果有）都已满足其条件。如果一个或多个审批规则的状态为 **Rule not satisfied (不满足规则)**，则无法合并拉取请求。如果没有人审批拉取请求，请考虑是否要合并该请求，或者是否要等待审批。
**注意**  
如果为拉取请求创建了审批规则，您可以对其进行编辑或删除以取消阻止合并。如果审批规则是使用审批规则模板创建的，则无法编辑或删除该规则。您只能选择覆盖要求。有关更多信息，请参阅 [覆盖拉取请求的审批规则](how-to-override-approval-rules.md)。  
![\[审批规则的条件尚未满足且审批人列表为空的拉取请求。\]](http://docs.amazonaws.cn/codecommit/latest/userguide/images/codecommit-approval-rule-not-met.png)

1. 选择**合并**。

1. 在拉取请求中，在可用的合并策略之间进行选择。无法应用的合并策略将灰显。如果没有可用的合并策略，您可以选择在 CodeCommit 控制台中手动解决冲突，也可以使用 Git 客户端在本地解决冲突。有关更多信息，请参阅 [解决 Amazon CodeCommit 存储库中的拉取请求中的冲突](how-to-resolve-conflict-pull-request.md)。  
![\[在 CodeCommit 控制台中显示合并的可用合并策略的拉取请求。\]](http://docs.amazonaws.cn/codecommit/latest/userguide/images/codecommit-merge-squash.png)
   + 快进合并会将目标分支引用向前移动到源分支的最新提交。如果可能，这是 Git 的默认行为。不会创建合并提交，但会保留源分支中的所有提交历史记录，就好像它是在目标分支中执行的一样。快进合并在目标分支历史记录的提交可视化视图中不会显示为分支合并，因为没有创建合并提交。源分支提示会快进到目标分支提示。
   + 压缩合并会创建一个包含源分支更改的提交，并将该单个压缩提交应用于目标分支。默认情况下，该压缩提交的提交消息包含源分支中的更改的所有提交消息。不会保留分支更改的各个提交历史记录。这可能有助于简化存储库历史记录，同时仍在目标分支历史记录的提交可视化工具视图中保留合并的图形表示形式。
   + 三向合并会为目标分支中的合并创建合并提交，但还会保留在源分支中执行的各个提交，以作为目标分支历史记录的一部分。这有助于保留存储库更改的完整历史记录。

1. 如果选择压缩或三向合并策略，请查看自动生成的提交消息，并在要更改该信息时对其进行修改。为提交历史记录添加您的姓名和电子邮件地址。

1. （可选）清除在合并期间删除源分支的选项。默认情况下，在合并拉取请求时会删除源分支。

1. 选择 **Merge pull request (合并拉取请求)** 以完成合并。

## 合并拉取请求 (Amazon CLI)
<a name="how-to-merge-pull-request-cli"></a>

要使用 Amazon CLI 命令操作 CodeCommit，请安装 Amazon CLI。有关更多信息，请参阅 [命令行参考](cmd-ref.md)。

**使用 Amazon CLI 合并 CodeCommit 存储库中的拉取请求**

1. <a name="evaluate-pull-request-approval-rules"></a>要评估拉取请求是否已满足其所有审批规则并准备好合并，请运行 **evaluate-pull-request-approval-rules** 命令，并指定：
   + 拉取请求的 ID（使用 **--pull-request-id** 选项）。
   + 拉取请求的修订 ID（使用 **--revision-id option)**）。您可以使用 **[get-pull-request](how-to-view-pull-request.md#get-pull-request)** 命令获取拉取请求的当前修订 ID。

   例如，要对 ID 为 *27* 且修订 ID 为 *9f29d167EXAMPLE* 的拉取请求评估审批规则的状态，请运行以下命令：

   ```
   aws codecommit evaluate-pull-request-approval-rules --pull-request-id 27 --revision-id 9f29d167EXAMPLE
   ```

   如果成功，该命令产生类似以下内容的输出：

   ```
   {
       "evaluation": {
           "approved": false,
           "approvalRulesNotSatisfied": [
               "Require two approved approvers"
           ],
           "overridden": false,
           "approvalRulesSatisfied": []
       }
   }
   ```
**注意**  
此输出指示拉取请求不可合并，因为未满足审批规则的要求。要合并此拉取请求，您可以让审核人审批该请求，以满足规则的条件。根据您的权限和规则的创建方式，您也可以编辑、覆盖或删除规则。有关更多信息，请参阅[审核拉取请求](how-to-review-pull-request.md)、[覆盖拉取请求的审批规则](how-to-override-approval-rules.md)和[编辑或删除拉取请求的审批规则](how-to-edit-delete-pull-request-approval-rule.md)。

1. 要使用快进合并策略合并和关闭拉取请求，请运行 **merge-pull-request-by-fast-forward** 命令并指定：
   + 拉取请求的 ID（使用 **--pull-request-id** 选项）。
   + 源分支提示的完整提交 ID（使用 **--source-commit-id** 选项）。
   + 存储库的名称（使用 **--repository-name** 选项）。

    例如，要在名为 *MyDemoRepo* 的存储库中合并并关闭 ID 为 *47* 并且源提交 ID 为 *99132ab0EXAMPLE* 的拉取请求，请运行以下命令：

   ```
   aws codecommit merge-pull-request-by-fast-forward --pull-request-id 47 --source-commit-id 99132ab0EXAMPLE --repository-name MyDemoRepo
   ```

   如果成功，该命令产生类似以下内容的输出：

   ```
   {
       "pullRequest": {
           "approvalRules": [
               {
                   "approvalRuleContent": "{\"Version\": \"2018-11-08\",\"Statements\": [{\"Type\": \"Approvers\",\"NumberOfApprovalsNeeded\": 1,\"ApprovalPoolMembers\": [\"arn:aws:sts::123456789012:assumed-role/CodeCommitReview/*\"]}]}",
                   "approvalRuleId": "dd8b17fe-EXAMPLE",
                   "approvalRuleName": "I want one approver for this pull request",
                   "creationDate": 1571356106.936,
                   "lastModifiedDate": 571356106.936,
                   "lastModifiedUser": "arn:aws:iam::123456789012:user/Mary_Major",
                   "ruleContentSha256": "4711b576EXAMPLE"
               }
           ],
           "authorArn": "arn:aws:iam::123456789012:user/Li_Juan",
           "clientRequestToken": "",
           "creationDate": 1508530823.142,
           "description": "Review the latest changes and updates to the global variables",
           "lastActivityDate": 1508887223.155,
           "pullRequestId": "47",
           "pullRequestStatus": "CLOSED",
           "pullRequestTargets": [
               {
                   "destinationCommit": "9f31c968EXAMPLE",
                   "destinationReference": "refs/heads/main",
                   "mergeMetadata": {
                       "isMerged": true,
                       "mergedBy": "arn:aws:iam::123456789012:user/Mary_Major"
                   },
                   "repositoryName": "MyDemoRepo",
                   "sourceCommit": "99132ab0EXAMPLE",
                   "sourceReference": "refs/heads/variables-branch"
               }
           ],
           "title": "Consolidation of global variables"
       }
   }
   ```

1. 要使用压缩合并策略合并和关闭拉取请求，请运行 **merge-pull-request-by-squash** 命令并指定：
   + 拉取请求的 ID（使用 **--pull-request-id** 选项）。
   + 源分支提示的完整提交 ID（使用 **--source-commit-id** 选项）。
   + 存储库的名称（使用 **--repository-name** 选项）。
   + 要使用的冲突详细信息级别（使用 **--conflict-detail-level** 选项）。如果未指定，则使用默认值 **`FILE_LEVEL`**。
   + 要使用的冲突解决策略（使用 **--conflict-resolution-strategy** 选项）。如果未指定，它默认为 `NONE`，并且必须手动解决冲突。
   + 要包括的提交消息（使用 **--commit-message** 选项）。
   + 要用于提交的姓名（使用 **--author-name** 选项）。
   + 要用于提交的电子邮件地址（使用 **--email** 选项）。
   + 是否保留任何空文件夹（使用 **--keep-empty-folders** 选项）。

   以下示例展示了在名为 *MyDemoRepo* 的存储库中合并并关闭 ID 为 *47* 并且源提交 ID 为 *99132ab0EXAMPLE* 的拉取请求。它使用 `LINE_LEVEL` 冲突详细信息和 `ACCEPT_SOURCE` 冲突解决策略：

   ```
   aws codecommit merge-pull-request-by-squash --pull-request-id 47 --source-commit-id 99132ab0EXAMPLE --repository-name MyDemoRepo --conflict-detail-level LINE_LEVEL --conflict-resolution-strategy ACCEPT_SOURCE --author-name "Jorge Souza" --email "jorge_souza@example.com" --commit-message "Merging pull request 47 by squash and accepting source in merge conflicts"
   ```

   如果成功，该命令生成与快进合并相同类型的输出，类似于以下内容：

   ```
   {
       "pullRequest": {
           "approvalRules": [
               {
                   "approvalRuleContent": "{\"Version\": \"2018-11-08\",\"DestinationReferences\": [\"refs/heads/main\"],\"Statements\": [{\"Type\": \"Approvers\",\"NumberOfApprovalsNeeded\": 2,\"ApprovalPoolMembers\": [\"arn:aws:sts::123456789012:assumed-role/CodeCommitReview/*\"]}]}",
                   "approvalRuleId": "dd8b17fe-EXAMPLE",
                   "approvalRuleName": "2-approver-rule-for-main",
                   "creationDate": 1571356106.936,
                   "lastModifiedDate": 571356106.936,
                   "lastModifiedUser": "arn:aws:iam::123456789012:user/Mary_Major",
                   "originApprovalRuleTemplate": {
                       "approvalRuleTemplateId": "dd8b17fe-EXAMPLE",
                       "approvalRuleTemplateName": "2-approver-rule-for-main"
                   },
                   "ruleContentSha256": "4711b576EXAMPLE"
               }
           ],
           "authorArn": "arn:aws:iam::123456789012:user/Li_Juan",
           "clientRequestToken": "",
           "creationDate": 1508530823.142,
           "description": "Review the latest changes and updates to the global variables",
           "lastActivityDate": 1508887223.155,
           "pullRequestId": "47",
           "pullRequestStatus": "CLOSED",
           "pullRequestTargets": [
               {
                   "destinationCommit": "9f31c968EXAMPLE",
                   "destinationReference": "refs/heads/main",
                   "mergeMetadata": {
                       "isMerged": true,
                       "mergedBy": "arn:aws:iam::123456789012:user/Mary_Major"
                   },
                   "repositoryName": "MyDemoRepo",
                   "sourceCommit": "99132ab0EXAMPLE",
                   "sourceReference": "refs/heads/variables-branch"
               }
           ],
           "title": "Consolidation of global variables"
       }
   }
   ```

1. 要使用三向合并策略合并和关闭拉取请求，请运行 **merge-pull-request-by-three-way** 命令并指定：
   + 拉取请求的 ID（使用 **--pull-request-id** 选项）。
   + 源分支提示的完整提交 ID（使用 **--source-commit-id** 选项）。
   + 存储库的名称（使用 **--repository-name** 选项）。
   + 要使用的冲突详细信息级别（使用 **--conflict-detail-level** 选项）。如果未指定，则使用默认值 **`FILE_LEVEL`**。
   + 要使用的冲突解决策略（使用 **--conflict-resolution-strategy** 选项）。如果未指定，它默认为 `NONE`，并且必须手动解决冲突。
   + 要包括的提交消息（使用 **--commit-message** 选项）。
   + 要用于提交的姓名（使用 **--author-name** 选项）。
   + 要用于提交的电子邮件地址（使用 **--email** 选项）。
   + 是否保留任何空文件夹（使用 **--keep-empty-folders** 选项）。

   以下示例展示了在名为 *MyDemoRepo* 的存储库中合并并关闭 ID 为 *47* 并且源提交 ID 为 *99132ab0EXAMPLE* 的拉取请求。它使用冲突详细信息和冲突解决策略的默认选项：

   ```
   aws codecommit merge-pull-request-by-three-way --pull-request-id 47 --source-commit-id 99132ab0EXAMPLE --repository-name MyDemoRepo --author-name "Maria Garcia" --email "maria_garcia@example.com" --commit-message "Merging pull request 47 by three-way with default options"
   ```

   如果成功，该命令生成与快进合并相同类型的输出，类似于以下内容：

   ```
   {
       "pullRequest": {
           "approvalRules": [
               {
                   "approvalRuleContent": "{\"Version\": \"2018-11-08\",\"DestinationReferences\": [\"refs/heads/main\"],\"Statements\": [{\"Type\": \"Approvers\",\"NumberOfApprovalsNeeded\": 2,\"ApprovalPoolMembers\": [\"arn:aws:sts::123456789012:assumed-role/CodeCommitReview/*\"]}]}",
                   "approvalRuleId": "dd8b17fe-EXAMPLE",
                   "approvalRuleName": "2-approver-rule-for-main",
                   "creationDate": 1571356106.936,
                   "lastModifiedDate": 571356106.936,
                   "lastModifiedUser": "arn:aws:iam::123456789012:user/Mary_Major",
                   "originApprovalRuleTemplate": {
                       "approvalRuleTemplateId": "dd8b17fe-EXAMPLE",
                       "approvalRuleTemplateName": "2-approver-rule-for-main"
                   },
                   "ruleContentSha256": "4711b576EXAMPLE"
               }
           ],
           "authorArn": "arn:aws:iam::123456789012:user/Li_Juan",
           "clientRequestToken": "",
           "creationDate": 1508530823.142,
           "description": "Review the latest changes and updates to the global variables",
           "lastActivityDate": 1508887223.155,
           "pullRequestId": "47",
           "pullRequestStatus": "CLOSED",
           "pullRequestTargets": [
               {
                   "destinationCommit": "9f31c968EXAMPLE",
                   "destinationReference": "refs/heads/main",
                   "mergeMetadata": {
                       "isMerged": true,
                       "mergedBy": "arn:aws:iam::123456789012:user/Mary_Major"
                   },
                   "repositoryName": "MyDemoRepo",
                   "sourceCommit": "99132ab0EXAMPLE",
                   "sourceReference": "refs/heads/variables-branch"
               }
           ],
           "title": "Consolidation of global variables"
       }
   }
   ```