YAML設定ファイルのコンフリクト解決

docker-compose.yml、GitHub Actionsワークフロー、Kubernetesマニフェストなど、インデントが重要なYAMLファイルのマージコンフリクトを修正します。

Common Patterns

詳細な説明

YAML設定のコンフリクト

YAMLファイルはインデントが構文的に意味を持つため、コンフリクト解決時に独特の課題を呈します。スペース1つの誤りでドキュメント全体の構造が変わる可能性があります。YAMLコンフリクトはCI/CDパイプライン(GitHub Actions、GitLab CI)、コンテナオーケストレーション(docker-compose.yml、Kubernetesマニフェスト)、アプリケーション設定でよく発生します。

よくあるYAMLコンフリクトの例

services:
  api:
<<<<<<< HEAD
    image: node:18-alpine
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: production
      DATABASE_URL: postgres://db:5432/app
=======
    image: node:20-alpine
    ports:
      - "3000:3000"
      - "9229:9229"
    environment:
      NODE_ENV: development
      DEBUG: "true"
>>>>>>> feature/debug-mode

YAMLコンフリクトが危険な理由

  1. 見えないエラー: タブ文字や間違ったインデントレベルは、意図とまったく異なる意味を持つ有効なYAMLを生成します。
  2. ブロックスカラー: |>構文を使用する複数行文字列は、コンフリクト解決中にアライメントがずれる可能性があります。
  3. アンカーとエイリアス: &anchor*aliasのようなYAML機能は、参照ブロックが一方のバージョンで変更されると壊れる可能性があります。

解決戦略

  • YAMLコンフリクトでは常にManual Editを使用し、インデントを正確に制御してください。
  • 解決後、リンターまたはYAMLフォーマッターツールでYAMLを検証してください。
  • docker-composeファイルの場合、docker-compose configを実行して解決されたファイルが正しく解析されることを確認してください。
  • GitHub Actionsの場合、コミット前にワークフロー構文チェッカーを使用してください。

インデントの保持

Git Conflict ResolverのManual Editオプション使用時は、一貫したインデント(YAMLでは通常2スペース)を維持するよう注意してください。一方の側を開始点としてコピーし、もう一方の不足要素を追加してください。

ユースケース

2つのブランチがdocker-compose.ymlファイルを変更しました — 1つはNode.jsイメージのバージョンをアップグレードし、もう1つはデバッグポートと環境変数を追加しました。マージによりサービス定義にコンフリクトが発生します。

試してみる — Git Conflict Resolver

フルツールを開く