

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

# 解決 AWS CodeCommit 儲存庫中提取請求中的衝突
<a name="how-to-resolve-conflict-pull-request"></a>

如果您的提取請求有衝突且無法合併，您可以使用多種方式來嘗試解決衝突：
+ 在您的本機電腦，可以使用 **git diff** 命令來尋找兩個分支之間的衝突並進行變更來解決衝突。您也可以使用不同的工具或其他軟體，協助您尋找和解決差異。解決這些問題後，您可以推送來源分支包含已解決衝突的變更，以更新提取請求。如需 **git diff** 和 **git difftool** 的詳細資訊，請參閱 Git 文件。
+ 在主控台，您可以選擇 **Resolve conflicts (解決衝突)**。這會開啟純文字編輯器，以類似 **git diff** 命令的方式來顯示衝突。您可以手動檢閱每個檔案中的衝突、進行變更，然後以您的變更來更新提取請求。
+ 在 中 AWS CLI，您可以使用 AWS CLI 取得合併衝突的相關資訊，並建立未參考的合併遞交來測試合併。

**Topics**
+ [解決提取請求中的衝突 （主控台）](#how-to-resolve-conflict-pull-request-console)
+ [解決提取請求中的衝突 (AWS CLI)](#how-to-resolve-conflict-pull-request-cli)

## 解決提取請求中的衝突 （主控台）
<a name="how-to-resolve-conflict-pull-request-console"></a>

您可以使用 CodeCommit 主控台來解決 CodeCommit 儲存庫中提取請求中的衝突。

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

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

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

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

1. 在提取請求中，選擇 **Resolve conflicts (解決衝突)**。提取請求中有必須解決然後才能合併的衝突時，才會顯示此選項。  
![提取請求，顯示其中有必須解決的衝突，否則不能合併。](http://docs.aws.amazon.com/zh_tw/codecommit/latest/userguide/images/codecommit-pull-request-resolve-conflicts.png)

1. 會開啟衝突解決視窗，列出有必須解決之衝突的每個檔案。選擇清單中的每個檔案來檢閱衝突，並進行任何必要的變更，直到所有衝突都解決。  
![衝突解決編輯器，其中顯示有尚未解決之衝突的檔案。](http://docs.aws.amazon.com/zh_tw/codecommit/latest/userguide/images/codecommit-pull-request-resolve.png)
   + 您可以選擇使用來源檔案內容、目的地檔案內容，或者如果檔案不是二進位檔案，則手動編輯檔案內容來讓其只包含您想要的變更。標準 git diff 標記用來顯示檔案中目的地 (HEAD) 和來源分支之間的衝突。
   + 如果檔案是二進位檔案、Git 子模組，或是有檔案/資料夾名稱衝突，您必須選擇使用來源檔案或目的地檔案來解決衝突。您無法在 CodeCommit 主控台中檢視或編輯二進位檔案。
   + 如果有檔案模式衝突，您可以選擇來源檔案的檔案模式和目的地檔案的檔案模式，以選擇解決該衝突的選項。
   + 如果您決定要放棄對檔案的變更並恢復為衝突狀態，請選擇 **Reset file (重設檔案)**。這可讓您以不同的方法來解決衝突。

1. 對所做的變更感到滿意之後，請選擇 **Update pull request (更新提取請求)**。
**注意**  
您必須先解決檔案中的所有衝突，然後才能使用您的變更來成功更新提取請求。

1. 提取請求會根據您的變更加以更新並變成可合併。您會看到合併頁面。您可以選擇立即合併提取請求，也可以返回提取請求清單。

## 解決提取請求中的衝突 (AWS CLI)
<a name="how-to-resolve-conflict-pull-request-cli"></a>

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

沒有單一 AWS CLI 命令可讓您解決提取請求中的衝突，並合併該請求。不過，您可以使用個別命令來探索衝突、嘗試解決問題，並測試提取請求是否可以合併。您可以使用：
+ **get-merge-options**，來了解針對兩個遞交指標之間的合併，可使用哪些合併選項。
+ **get-merge-conflicts**，傳回在兩個遞交指標之間的合併中具有合併衝突的檔案清單。
+ **batch-describe-merge-conflicts**，使用指定的合併策略，取得兩個遞交之間合併檔案中所有合併衝突的相關資訊。
+ **describe-merge-conflicts**，使用指定的合併策略，取得在兩個遞交之間特定檔案的合併衝突詳細資訊。
+ **create-unreferenced-merge-commit**，使用指定的合併策略，測試合併兩個遞交指標的結果。

1. <a name="get-merge-options"></a>為了探索兩個遞交指標之間的合併有哪些可用的合併選項，請執行 **get-merge-options** 命令，指定：
   + 合併來源的遞交指標 (使用 **--source-commit-specifier** 選項)。
   + 合併目的地的遞交指標 (使用 **--destination-commit-specifier** 選項)。
   + 儲存庫的名稱 (使用 **--repository-name** 選項)。
   + (選用) 要使用的衝突解決策略 (使用 **--conflict-resolution-strategy** 選項)。
   + (選用) 所需的任何衝突的細節層次 (使用 **--conflict-detail-level** 選項)。

    例如，若要判斷可用於合併名為 {{bugfix-1234}} 的來源分支與名為 {{MyDemoRepo}} 之儲存庫中{{主要}}的目的地分支的合併策略：

   ```
   aws codecommit get-merge-options --source-commit-specifier {{bugfix-1234}} --destination-commit-specifier {{main}} --repository-name {{MyDemoRepo}}
   ```

   如果此命令成功執行，您會看到類似如下的輸出產生：

   ```
   {
       "mergeOptions": [
           "FAST_FORWARD_MERGE",
           "SQUASH_MERGE",
           "THREE_WAY_MERGE"
       ],
       "sourceCommitId": "d49940adEXAMPLE",
       "destinationCommitId": "86958e0aEXAMPLE",
       "baseCommitId": "86958e0aEXAMPLE"
   }
   ```

1. <a name="get-merge-conflict"></a>若要取得包含兩個遞交指標間合併之合併衝突的檔案清單，請執行 **get-merge-conflicts** 命令，指定：
   + 合併來源的遞交指標 (使用 **--source-commit-specifier** 選項)。
   + 合併目的地的遞交指標 (使用 **--destination-commit-specifier** 選項)。
   + 儲存庫的名稱 (使用 **--repository-name** 選項)。
   + 您想要使用的合併選項 (使用 **--merge-option** 選項)。
   + (選用) 所需的任何衝突的細節層次 (使用 **--conflict-detail-level** 選項)。
   + (選用) 要使用的衝突解決策略 (使用 **--conflict-resolution-strategy** 選項)。
   + (選用) 傳回的含衝突檔案數目上限 (使用 **--max-conflict-files** 選項)。

   例如，若要取得檔案清單，其中包含名為 feature-randomizationfeature 的來源分支與名為 main 的目的地分支之間的合併衝突，請使用名為 MyDemoRepo 的儲存庫中的三向合併策略：

   ```
   aws codecommit get-merge-conflicts --source-commit-specifier feature-randomizationfeature --destination-commit-specifier main --merge-option THREE_WAY_MERGE --repository-name MyDemoRepo
   ```

   如果此命令成功執行，您會看到類似如下的輸出產生：

   ```
   {
       "mergeable": false,
       "destinationCommitId": "86958e0aEXAMPLE",
       "sourceCommitId": "6ccd57fdEXAMPLE",
       "baseCommitId": "767b6958EXAMPLE",
       "conflictMetadataList": [
           {
               "filePath": "readme.md",
               "fileSizes": {
                   "source": 139,
                   "destination": 230,
                   "base": 85
               },
               "fileModes": {
                   "source": "NORMAL",
                   "destination": "NORMAL",
                   "base": "NORMAL"
               },
               "objectTypes": {
                   "source": "FILE",
                   "destination": "FILE",
                   "base": "FILE"
               },
               "numberOfConflicts": 1,
               "isBinaryFile": {
                   "source": false,
                   "destination": false,
                   "base": false
               },
               "contentConflict": true,
               "fileModeConflict": false,
               "objectTypeConflict": false,
               "mergeOperations": {
                   "source": "M",
                   "destination": "M"
               }
           }
       ]
   }
   ```

1. <a name="batch-describe-merge-conflicts"></a>若要取得兩個遞交指標之間的合併中，所有檔案或部分檔案之合併衝突的相關資訊，請執行 **batch-describe-merge-conflicts** 命令，指定：
   + 合併來源的遞交指標 (使用 **--source-commit-specifier** 選項)。
   + 合併目的地的遞交指標 (使用 **--destination-commit-specifier** 選項)。
   + 您想要使用的合併選項 (使用 **--merge-option** 選項)。
   + 儲存庫的名稱 (使用 **--repository-name** 選項)。
   + (選用) 要使用的衝突解決策略 (使用 **--conflict-resolution-strategy** 選項)。
   + (選用) 所需的任何衝突的細節層次 (使用 **--conflict-detail-level** 選項)。
   + (選用) 傳回的合併 hunk 數目上限 (使用 **--max-merge-hunks** 選項)。
   + (選用) 傳回的含衝突檔案數目上限 (使用 **--max-conflict-files** 選項)。
   + (選用) 目標檔案路徑，用來描述衝突 (使用 **--file-paths** 選項)。

    例如，若要使用名為 {{MyDemoRepo}} 的儲存庫中的 {{THREE\_WAY\_MERGE}} 策略，判斷合併衝突，以合併名為 {{feature-randomizationfeature}} 的來源分支與名為 {{main}} 的目的地分支：

   ```
   aws codecommit batch-describe-merge-conflicts --source-commit-specifier {{feature-randomizationfeature}} --destination-commit-specifier {{main}} --merge-option {{THREE_WAY_MERGE}} --repository-name {{MyDemoRepo}}
   ```

   如果此命令成功執行，您會看到類似如下的輸出產生：

   ```
   {
       "conflicts": [
           {
               "conflictMetadata": {
                   "filePath": "readme.md",
                   "fileSizes": {
                       "source": 139,
                       "destination": 230,
                       "base": 85
                   },
                   "fileModes": {
                       "source": "NORMAL",
                       "destination": "NORMAL",
                       "base": "NORMAL"
                   },
                   "objectTypes": {
                       "source": "FILE",
                       "destination": "FILE",
                       "base": "FILE"
                   },
                   "numberOfConflicts": 1,
                   "isBinaryFile": {
                       "source": false,
                       "destination": false,
                       "base": false
                   },
                   "contentConflict": true,
                   "fileModeConflict": false,
                   "objectTypeConflict": false,
                   "mergeOperations": {
                       "source": "M",
                       "destination": "M"
                   }
               },
               "mergeHunks": [
                   {
                       "isConflict": true,
                       "source": {
                           "startLine": 0,
                           "endLine": 3,
                           "hunkContent": "VGhpcyBpEXAMPLE=="
                       },
                       "destination": {
                           "startLine": 0,
                           "endLine": 1,
                           "hunkContent": "VXNlIHRoEXAMPLE="
                       }
                   }
               ]
           }
       ],
       "errors": [],
       "destinationCommitId": "86958e0aEXAMPLE",
       "sourceCommitId": "6ccd57fdEXAMPLE",
       "baseCommitId": "767b6958EXAMPLE"
   }
   ```

1. <a name="describe-merge-conflicts"></a>若要取得兩個遞交指標之間的合併中，特定檔案之任何合併衝突的相關資訊，請執行 **describe-merge-conflicts** 命令，指定：
   + 合併來源的遞交指標 (使用 **--source-commit-specifier** 選項)。
   + 合併目的地的遞交指標 (使用 **--destination-commit-specifier** 選項)。
   + 您想要使用的合併選項 (使用 **--merge-option** 選項)。
   + 目標檔案路徑，用來描述衝突 (使用 **--file-path** 選項)。
   + 儲存庫的名稱 (使用 **--repository-name** 選項)。
   + (選用) 要使用的衝突解決策略 (使用 **--conflict-resolution-strategy** 選項)。
   + (選用) 所需的任何衝突的細節層次 (使用 **--conflict-detail-level** 選項)。
   + (選用) 傳回的合併 hunk 數目上限 (使用 **--max-merge-hunks** 選項)。
   + (選用) 傳回的含衝突檔案數目上限 (使用 **--max-conflict-files** 選項)。

   例如，若要使用名為 {{MyDemoRepo}} 的儲存庫{{readme.md}}中的 {{THREE\_WAY\_MERGE}} 策略，判斷名為 {{feature-randomizationfeature}} 之來源分支中名為 {{main}} 之檔案的合併衝突：

   ```
   aws codecommit describe-merge-conflicts --source-commit-specifier {{feature-randomizationfeature}} --destination-commit-specifier {{main}} --merge-option {{THREE_WAY_MERGE}} --file-path {{readme.md}} --repository-name {{MyDemoRepo}}
   ```

   如果此命令成功執行，您會看到類似如下的輸出產生：

   ```
   {
       "conflictMetadata": {
           "filePath": "readme.md",
           "fileSizes": {
               "source": 139,
               "destination": 230,
               "base": 85
           },
           "fileModes": {
               "source": "NORMAL",
               "destination": "NORMAL",
               "base": "NORMAL"
           },
           "objectTypes": {
               "source": "FILE",
               "destination": "FILE",
               "base": "FILE"
           },
           "numberOfConflicts": 1,
           "isBinaryFile": {
               "source": false,
               "destination": false,
               "base": false
           },
           "contentConflict": true,
           "fileModeConflict": false,
           "objectTypeConflict": false,
           "mergeOperations": {
               "source": "M",
               "destination": "M"
           }
       },
       "mergeHunks": [
           {
               "isConflict": true,
               "source": {
                   "startLine": 0,
                   "endLine": 3,
                   "hunkContent": "VGhpcyBpEXAMPLE=="
               },
               "destination": {
                   "startLine": 0,
                   "endLine": 1,
                   "hunkContent": "VXNlIHRoEXAMPLE="
               }
           }
       ],
       "destinationCommitId": "86958e0aEXAMPLE",
       "sourceCommitId": "6ccd57fdEXAMPLE",
       "baseCommitId": "767b69580EXAMPLE"
   }
   ```

1. <a name="create-unreferenced-merge-commit"></a>若要建立未參照遞交來代表合併兩個遞交指標的結果，請執行 **create-unreferenced-merge-commit** 命令，指定：
   + 合併來源的遞交指標 (使用 **--source-commit-specifier** 選項)。
   + 合併目的地的遞交指標 (使用 **--destination-commit-specifier** 選項)。
   + 您想要使用的合併選項 (使用 **--merge-option** 選項)。
   + 儲存庫的名稱 (使用 **--repository-name** 選項)。
   + (選用) 要使用的衝突解決策略 (使用 **--conflict-resolution-strategy** 選項)。
   + (選用) 所需的任何衝突的細節層次 (使用 **--conflict-detail-level** 選項)。
   + (選用) 要包含的遞交訊息 (使用 **--commit-message** 選項)。
   + (選用) 用於遞交的名稱 (使用 **--name** 選項)。
   + (選用) 用於遞交的電子郵件地址 (使用 **--email** 選項)。
   + (選用) 是否保留任何空資料夾 (使用 **--keep-empty-folders** 選項)。

    例如，若要使用名為 {{MyDemoRepo}} 的儲存庫中的 ACCEPT\_SOURCE 策略，判斷合併衝突，以合併名為 {{bugfix-1234}} 的來源分支與名為 {{main}} 的目的地分支：

   ```
   aws codecommit create-unreferenced-merge-commit --source-commit-specifier {{bugfix-1234}} --destination-commit-specifier {{main}} --merge-option THREE_WAY_MERGE --repository-name {{MyDemoRepo}} --name "Maria Garcia" --email "maria_garcia@example.com" --commit-message "Testing the results of this merge."
   ```

   如果此命令成功執行，您會看到類似如下的輸出產生：

   ```
   {
       "commitId": "4f178133EXAMPLE",
       "treeId": "389765daEXAMPLE"
   }
   ```