

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

# 解决 Amazon CodeCommit 存储库中的拉取请求中的冲突
<a name="how-to-resolve-conflict-pull-request"></a>

如果拉取请求存在冲突而无法合并，您可以尝试使用几种方法之一解决冲突：
+ 在本地计算机上，您可以使用 **git diff** 命令查找两个分支之间的冲突，并进行更改以解决这些冲突。您还可以使用差异工具或其他软件帮助查找和解决差异。在解决这些冲突并感到满意后，您可以推送具有更改（包含解决的冲突）的源分支，这会更新拉取请求。有关 **git diff** 和 **git difftool** 的更多信息，请参阅 Git 文档。
+ 在控制台中，您可以选择 **Resolve conflicts (解决冲突)**。这会打开一个纯文本编辑器，以使用与 **git diff** 命令类似的方式显示冲突。您可以在包含冲突的每个文件中手动查看这些冲突，进行更改，然后使用更改更新拉取请求。
+ 在 Amazon CLI 中，您可以使用 Amazon CLI 获取有关合并冲突的信息，并创建未引用的合并提交以测试合并。

**Topics**
+ [解决拉取请求中的冲突（控制台）](#how-to-resolve-conflict-pull-request-console)
+ [解决拉取请求中的冲突 (Amazon CLI)](#how-to-resolve-conflict-pull-request-cli)

## 解决拉取请求中的冲突（控制台）
<a name="how-to-resolve-conflict-pull-request-console"></a>

您可以使用 CodeCommit 控制台解决 CodeCommit 存储库中的拉取请求冲突。

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

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

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

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

1. 在拉取请求中，选择 **Resolve conflicts (解决冲突)**。只有在具有必须解决后才能合并拉取请求的冲突时，才会显示该选项。  
![显示具有必须解决后才能合并的冲突的拉取请求。](http://docs.amazonaws.cn/codecommit/latest/userguide/images/codecommit-pull-request-resolve-conflicts.png)

1. 将打开冲突解决窗口，其中列出具有必须解决的冲突的每个文件。在列表中选择每个文件以查看冲突，并进行所需的任何更改，直到解决了所有冲突。  
![显示具有尚未解决的冲突的文件的冲突解决编辑器。](http://docs.amazonaws.cn/codecommit/latest/userguide/images/codecommit-pull-request-resolve.png)
   + 您可以选择使用源文件内容、目标文件内容，或者如果文件不是二进制文件，则手动编辑文件内容以使其仅包含所需的更改。标准 git diff 标记用于显示文件中的目标 (HEAD) 和源分支之间的冲突。
   + 如果文件是二进制文件、Git 子模块，或者存在文件/文件夹名称冲突，您必须选择使用源文件或目标文件以解决这些冲突。您无法在 CodeCommit 控制台中查看或编辑二进制文件。
   + 如果存在文件模式冲突，您将会看到在源文件的文件模式和目标文件的文件模式之间选择以解决该冲突的选项。
   + 如果您决定要放弃对文件的更改并将其恢复为冲突状态，请选择 **Reset file (重置文件)**。这样，您就可以使用不同的方式解决冲突。

1. 如果对更改感到满意，请选择 **Update pull request (更新拉取请求)**。
**注意**  
您必须先解决所有文件中的所有冲突，然后才能使用更改成功更新拉取请求。

1. 将使用更改更新拉取请求，并且可以合并该请求。您将会看到合并页面。您可以选择此时合并拉取请求，也可以返回到拉取请求列表。

## 解决拉取请求中的冲突 (Amazon CLI)
<a name="how-to-resolve-conflict-pull-request-cli"></a>

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

您无法使用单个 Amazon 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** 选项）。

    例如，要确定可用于在名为 {{MyDemoRepo}} 的存储库中合并名为 {{bugfix-1234}} 的源分支与名为 {{main}} 的目标分支的合并策略，请运行以下命令：

   ```
   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** 选项）。

   例如，要获取包含在名为 MyDemoRepo 的存储库中使用三向合并策略合并名为 feature-randomizationfeature 的源分支和名为 main 的目标分支时产生的冲突的文件列表，请运行以下命令：

   ```
   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** 选项）。
   + （可选）要返回的最大合并块数（使用 **--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** 选项）。
   + （可选）要返回的最大合并块数（使用 **--max-merge-hunks** 选项）。
   + （可选）要返回的包含冲突的最大文件数（使用 **--max-conflict-files** 选项）。

   例如，要确定在名为 {{MyDemoRepo}} 的存储库中使用 {{THREE\_WAY\_MERGE}} 策略将名为 {{feature-randomizationfeature}} 的源分支中名为 {{readme.md}} 的文件与名为 {{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"
   }
   ```