

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 AWS CodeCommit 儲存庫中合併提取請求
<a name="how-to-merge-pull-request"></a>

在檢閱過您的程式碼，且已滿足提取請求的所有核准規則 (如果有的話) 之後，您可以使用下列其中一種方式合併提取請求：
+ <a name="is-mergable"></a>您可以在主控台使用其中一個可用的合併策略，將來源分支合併到目的地分支，這也會關閉提取請求。您也可以在主控台解決任何合併衝突。主控台會顯示訊息，指出提取請求是否可合併，或是否必須解決衝突。解決所有衝突後，如果您選擇 **Merge (合併)**，則會使用您選擇的合併策略來執行合併。向前快轉是預設的合併策略，這是 Git 的預設選項。根據來源和目的地分支中程式碼的狀態，該策略可能無法使用，但可能可以使用其他選項，例如 squash 或三向。
+ 您可以使用 AWS 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)
+ [合併提取請求 (AWS CLI)](#how-to-merge-pull-request-cli)

## 合併提取請求 （主控台）
<a name="how-to-merge-pull-request-console"></a>

您可以使用 CodeCommit 主控台來合併 CodeCommit 儲存庫中的提取請求。提取請求的狀態變更為 **Merged (已合併)** 後，該提取請求就不會再出現在開啟的提取請求清單中。已合併的提取請求會歸類為已關閉。它無法變更回 **Open (開啟)**，但使用者仍然可以對變更進行評論並回覆評論。合併或關閉提取請求之後，您無法核准該請求、撤銷其核准，或覆寫已套用至提取請求的核准規則。

1. 在 https：//[https://console.aws.amazon.com/codesuite/codecommit/home](https://console.aws.amazon.com/codesuite/codecommit/home) 開啟 CodeCommit 主控台。

1. 在 **Repositories (儲存庫)** 中，選擇儲存庫的名稱。

1. 在導覽窗格中，選擇 **Pull requests (提取請求)**。

1. 依預設，會顯示所有開啟的提取請求清單。選擇您想要合併的開啟中提取請求。

1. 在提取請求中，選擇 **Approvals (核准)**。檢閱核准者清單，並確認已滿足所有核准規則 (如果有的話) 的條件。如果一或多個核准規則的狀態為 **Rule not satisfied (未滿足規則)**，則您無法合併提取請求。如果沒有人核准提取請求，請考慮是否要合併，或是否要等待核准。
**注意**  
如果已針對提取請求建立核准規則，您可以編輯核准規則，或刪除核准規則以解除封鎖合併。如果核准規則是根據核准規則範本而建立，則您無法編輯或刪除核准規則。您只能選擇覆寫需求。如需詳細資訊，請參閱[覆寫提取請求的核准規則](how-to-override-approval-rules.md)。  
![此提取請求顯示未滿足條件的核准規則，以及空白的核准人清單。](http://docs.aws.amazon.com/zh_tw/codecommit/latest/userguide/images/codecommit-approval-rule-not-met.png)

1. 選擇 **Merge (合併)**。

1. 在提取請求中，選擇可用的合併策略。無法套用的合併策略會呈現灰色。如果沒有可用的合併策略，您可以選擇手動解決 CodeCommit 主控台中的衝突，也可以使用 Git 用戶端在本機解決衝突。如需詳細資訊，請參閱[解決 AWS CodeCommit 儲存庫中提取請求中的衝突](how-to-resolve-conflict-pull-request.md)。  
![顯示 CodeCommit 主控台中可用於合併的合併策略的提取請求。](http://docs.aws.amazon.com/zh_tw/codecommit/latest/userguide/images/codecommit-merge-squash.png)
   + 向前快轉合併會將目的地分支的參考向前移動到來源分支的最新遞交。這是 Git 的預設行為 (如果可能)。不會建立合併遞交，但會保留來自來源分支的所有遞交歷史記錄，就好像發生在目的地分支一樣。在目的地分支歷史記錄的遞交視覺化檢視中，向前快轉合併不會顯示為分支合併，因為沒有建立合併遞交。來源分支的尖端會向前快轉到目的地分支的尖端。
   + Squash 合併會建立一個遞交，其中包含來源分支的變更，並將該單一壓縮的遞交套用至目的地分支。預設情況下，該 squash 遞交的遞交訊息會包含來源分支中變更的所有遞交訊息。不會保留分支變更的個別遞交歷史記錄。這可協助簡化您的儲存庫歷史記錄，同時仍在目的地分支歷史記錄的 Commit visualizer 檢視中保留合併的圖形呈現方式。
   + 三向合併會在目的地分支中建立合併的遞交訊息，同時也會在目的地分支的歷史記錄中保留來源分支中所做的個別遞交。這可協助保持儲存庫變更的完整歷史記錄。

1. 如果您選擇 squash 或三向合併策略，請檢閱自動產生的遞交訊息，如果您要變更資訊請加以修改。為遞交歷史記錄新增您的名稱和電子郵件地址。

1. (選擇性) 清除在合併時刪除來源分支的選項。預設是在合併提取請求時刪除來源分支。

1. 選擇 **Merge pull request (合併提取請求)** 完成合併。

## 合併提取請求 (AWS CLI)
<a name="how-to-merge-pull-request-cli"></a>

若要搭配 CodeCommit 使用 AWS CLI 命令，請安裝 AWS CLI。如需詳細資訊，請參閱[命令列參考](cmd-ref.md)。

**使用 AWS 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. 若要使用 squash 合併策略來合併和關閉提取請求，請執行 **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"
       }
   }
   ```