HTMLおよびJSXテンプレートのコンフリクト解決

ネストされたタグ構造により変更箇所の特定が困難なHTMLテンプレートやReact JSXでのコンフリクトを処理します。

Best Practices

詳細な説明

HTMLとJSXテンプレートのコンフリクト

HTML、JSX、Vue SFCファイルのテンプレートコンフリクトは、ネストされたタグ構造により1つの要素の変更が周囲の多くの行のインデントやラッピングに影響するため、困難です。2つのブランチが同じコンポーネントの異なる側面を変更しても、Gitはテンプレートブロック全体をコンフリクトとして認識することがあります。

典型的なJSXコンフリクト

<<<<<<< HEAD
<Card className="p-4">
  <CardHeader>
    <h2>{title}</h2>
    <Badge variant="success">{status}</Badge>
  </CardHeader>
  <CardBody>{description}</CardBody>
</Card>
=======
<Card className="p-6 shadow-lg">
  <CardHeader>
    <h2>{title}</h2>
    <span className="text-sm text-gray-500">{date}</span>
  </CardHeader>
  <CardBody>{description}</CardBody>
  <CardFooter>
    <Button onClick={onAction}>View Details</Button>
  </CardFooter>
</Card>
>>>>>>> feature/card-actions

分析アプローチ

テンプレートを論理的なセクションに分解します:

セクション HEADの変更 取り込み元の変更
Cardラッパー className="p-4" className="p-6 shadow-lg"
ヘッダーコンテンツ Badgeを追加 日付spanを追加
ボディ 変更なし 変更なし
フッター なし Buttonで追加

解決戦略

JSXコンフリクトはほぼ必ずManual Editが必要です。解決バージョンを以下のように構築します:

  1. 全体の構造から始める(最も完全なバージョンをベースとして使用)。
  2. 両方のブランチからクラス名とpropsをマージ。
  3. 両方のブランチからのすべての新しい子要素を含める。
  4. すべてのタグが正しく開閉されていることを確認。
  5. JSX式({})が正しいことを検証。

よくある落とし穴

  • 閉じられていないタグ: 部分的なHTMLのマージでタグが閉じられないことがあります。
  • propsの欠落: 一方のブランチからのclassNameの変更を含め忘れる。
  • key props: リストレンダリングでマージ後にユニークなキーを確認。
  • イベントハンドラー: すべてのonClick、onChangeなどのハンドラーが保持されていることを確認。

検証

解決後、JSXがコンパイルされることを確認してください。JSX厳格モードのTypeScriptはほとんどの構造的エラーを即座にキャッチします。

ユースケース

2つのブランチがReactカードコンポーネントを変更しました — 1つはヘッダーにステータスバッジを追加し、もう1つはアクションボタン付きのフッターを追加してスペーシングを更新しました。JSX構造がコンポーネント全体でコンフリクトします。

試してみる — Git Conflict Resolver

フルツールを開く