AWS CodeCommit リポジトリ内のプルリクエストの競合を解決する - AWS CodeCommit

AWS CodeCommit リポジトリ内のプルリクエストの競合を解決する

プルリクエストに競合があるためにマージできない場合、つぎのいずれかの方法でこの競合の解決を試みることができます。

  • ローカルコンピューターで、git diff コマンドを使用して 2 つのブランチ間の競合を見つけ、解決するために変更を加えます。また、別のツールや他のソフトウェアを使用して差異を見つけて解決を試みることもできます。満足できる解決方法を実行したら、解決した競合が含まれる変更がある送信元のブランチをプッシュして、プルリクエストを更新できます。git diff および git difftool についての詳細は、Git ドキュメントを参照してください。

  • コンソールでは、[Resolve conflicts (競合の解決)] を選択できます。これにより、プレーンテキストエディタが開き、git diff コマンドに類似する方法で競合が表示されます。競合が含まれるファイルごとに手動で競合を確認し、変更を加えたら、変更されたものでプルリクエストを更新します。

  • AWS CLI では、AWS CLI を使用して競合のマージについての情報を取得し、マージをテストするために非参照のマージコミットを作成できます。

プルリクエストの衝突を解決する (コンソール)

CodeCommit コンソールを使用して、CodeCommit リポジトリ のプルリクエストで競合を解決できます。

  1. https://console.aws.amazon.com/codesuite/codecommit/home にある CodeCommit コンソールを開きます。

  2. リポジトリで、リポジトリの名前を選択します。

  3. ナビゲーションペインで、[プルリクエスト] を選択します。

  4. デフォルトでは、すべての未解決のプルリクエストが一覧表示されます。マージしたいけれど、競合があるオープンプルリクエストを選択します。

  5. プルリクエストで [Resolve conflicts] を選択します。このオプションは、プルリクエストがマージできるようになる前に競合を解決する必要がある場合のみ表示されます。

    
                            プルリクエストがマージできるようになる前に解決する必要がある競合があることを示すプルリクエスト。
  6. 解決する必要がある競合がある各ファイルをリスト化した競合解決ウィンドウが開きます。リストの各ファイルを選択して競合を確認し、すべての競合が解決されるまで必要な変更を加えます。

    
                        まだ解決されていない競合があるファイルを示す競合解決エディタ。
    • 送信元のファイルコンテンツあるいは送信先のファイルコンテンツを使用するかを選択でき、また、ファイルがバイナリファイルではない場合には手動でファイルのコンテンツを編集して必要な変更のみが含まれるようにできます。スタンダード git diff マーカーは、ファイルの送信先ブランチ (HEAD) と送信元ブランチ間の競合を示すために使用されます。

    • ファイルがバイナリファイル、Git サブモジュールの場合、またはファイルあるいはフォルダの名前の競合がある場合、競合を解決するために送信元のファイルあるいは送信先のファイルを使用するかを選択する必要があります。CodeCommit コンソールでバイナリファイルを表示あるいは編集することはできません。

    • ファイルモードの競合がある場合、送信元ファイルのファイルモードと送信先ファイルのファイルモードのどちらかを選択することで、解決するためのオプションが表示されます。

    • ファイルの変更を破棄して競合状態に戻すには、[Reset file (ファイルのリセット)] を選択します。これにより、異なる方法で競合を解決できます。

  7. 変更に満足したら、[Update pull request (プルリクエストの更新)] を選択します。

    注記

    変更を使用してプルリクエストを正常に更新する前に、すべてのファイルですべての競合を解決する必要があります。

  8. プルリクエストは、変更を使用して更新され、マージ可能になります。マージページが表示されます。この時点でプルリクエストをマージするか、またはプルリクエストのリストに戻るかを選択できます。

プルリクエスト内の競合を解決 (AWS CLI)

AWS CLI コマンドを CodeCommit で使用するには、AWS CLI をインストールします。詳細については、「コマンドラインリファレンス」を参照してください。

いずれの AWS CLI コマンドも単一でプルリクエスト内の競合を解決して、このリクエストをマージすることを許可しません。ただし、個別のコマンドを使用すると、競合の検出、これらの解決の試行、およびプルリクエストがマージ可能かどうかのテストを行うことができます。次を使用できます。

  • get-merge-options を使用して、どのマージオプションが 2 つのコミット識別子間のマージに使用できるかを検出します。

  • get-merge-conflicts を使用して、2 つのコミット識別子間のマージにおけるマージ競合があるファイルのリストを返します。

  • batch-describe-merge-conflicts を使用して、指定するマージ戦略を使用した 2 つのコミット間のマージにおけるファイル内のすべてのマージ競合についての情報を取得します。

  • describe-merge-conflicts を使用して、指定するマージ戦略を使用した 2 つのコミット間の特定のファイルにおけるマージ競合に関する詳細を取得します。

  • create-unreferenced-merge-commit を使用して、指定するマージ戦略を使用した 2 つのコミット識別子をマージする結果をテストします。

  1. 2 つのコミット識別子間でのマージに使用できるマージオプションを判断するためには、次を指定して get-merge-options コマンドを実行します。

    • マージの送信元のコミット識別子 (--source-commit-specifier オプションを指定)。

    • マージの送信先のコミット識別子 (--destination-commit-specifier オプションを指定)。

    • レポジトリの名前 (--repository-name オプションを指定)。

    • (オプション) 使用する競合解決戦略 (--conflict-resolution-strategy オプションを指定)。

    • (オプション) すべての競合についての詳細度レベル (--conflict-detail-level オプションを指定)。

    たとえば、bugfix-1234 という名前の送信元ブランチを MyDemoRepo というリポジトリ内で master という名前の送信先ブランチにマージするために使用できるマージ戦略を判断するためには、次を行います。

    aws codecommit get-merge-options --source-commit-specifier bugfix-1234 --destination-commit-specifier master --repository-name MyDemoRepo

    このコマンドが正常に実行されると、次のような出力が生成されます。

    { "mergeOptions": [ "FAST_FORWARD_MERGE", "SQUASH_MERGE", "THREE_WAY_MERGE" ], "sourceCommitId": "d49940adEXAMPLE", "destinationCommitId": "86958e0aEXAMPLE", "baseCommitId": "86958e0aEXAMPLE" }
  2. 2 つのコミット識別子間のマージのマージ競合が含まれるファイルのリストを取得するには、次を指定して get-merge-conflicts コマンドを実行します。

    • マージの送信元のコミット識別子 (--source-commit-specifier オプションを指定)。

    • マージの送信先のコミット識別子 (--destination-commit-specifier オプションを指定)。

    • レポジトリの名前 (--repository-name オプションを指定)。

    • 使用するマージオプション (--merge-option オプションを指定)。

    • (オプション) すべての競合についての詳細度レベル (--conflict-detail-level オプションを指定)。

    • (オプション) 使用する競合解決戦略 (--conflict-resolution-strategy オプションを指定)。

    • (オプション) 返す競合があるファイルの最大数 (--max-conflict-files オプションを指定)。

    たとえば、MyDemoRepo という名前のリポジトリで 3 方向マージ戦略を使用した、feature-randomizationfeature という名前の送信元ブランチと master という名前の送信先ブランチ間のマージにおける競合があるファイルのリストを取得するには、次を行います。

    aws codecommit get-merge-conflicts --source-commit-specifier feature-randomizationfeature --destination-commit-specifier master --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" } } ] }
  3. 2 つのコミット識別子間のマージにおいて、すべてのファイルあるいはファイルのサブセットないのマージ競合についての情報を取得するには、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 オプションを指定)。

    たとえば、feature-randomizationfeature という名前の送信元のブランチと master という名前の送信先ブランチを MyDemoRepo という名前のリポジトリで THREE_WAY_MERGE 戦略を使用してマージするときのマージ競合を判断するためには、次を行います。

    aws codecommit batch-describe-merge-conflicts --source-commit-specifier feature-randomizationfeature --destination-commit-specifier master --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" }
  4. 2 つのコミット識別子間のマージの特定のファイルにおけるマージ競合についての詳細を取得するには、次を指定して 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 オプションを指定)。

    たとえば、readme.md という名前のファイルで feature-randomizationfeature という名前の送信元ブランチと master という名前の送信先ブランチでの MyDemoRepo という名前のリポジトリ内の THREE_WAY_MERGE 戦略を使用したマージ競合を判断するには、次を行います。

    aws codecommit describe-merge-conflicts --source-commit-specifier feature-randomizationfeature --destination-commit-specifier master --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" }
  5. 2 つのコミット識別子をマージした結果を表す非参照のコミットを作成するには、次を指定して create-unreferenced-merge-commit コマンドを実行します。

    • マージの送信元のコミット識別子 (--source-commit-specifier オプションを指定)。

    • マージの送信先のコミット識別子 (--destination-commit-specifier オプションを指定)。

    • 使用するマージオプション (--merge-option オプションを指定)。

    • レポジトリの名前 (--repository-name オプションを指定)。

    • (オプション) 使用する競合解決戦略 (--conflict-resolution-strategy オプションを指定)。

    • (オプション) すべての競合についての詳細度レベル (--conflict-detail-level オプションを指定)。

    • (オプション) 含めるコミットメッセージ (--commit-message オプションを指定)。

    • (オプション) コミットに使用する名前 (--name オプションを指定)。

    • (オプション) コミットに使用する E メールアドレス (--email オプションを指定)。

    • (オプション) 空のフォルダを保持するかどうか (--keep-empty-folders オプションを指定)。

    たとえば、bugfix-1234 という名前の送信元のブランチと master という名前の送信先ブランチを MyDemoRepo という名前のリポジトリで ACCEPT_SOURCE 戦略を使用してマージするときのマージ競合を判断するためには、次を行います。

    aws codecommit create-unreferenced-merge-commit --source-commit-specifier bugfix-1234 --destination-commit-specifier master --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" }