3-way 比較¶
3-way モードは共通のベースに対して 2 つの派生ファイルを比較し、自動マージ可能な変更と 真の競合を分離します。
テキスト CLI¶
ayame-diff 3way text BASE LEFT RIGHT
ayame-diff 3way text --json BASE LEFT RIGHT
ayame-diff 3way text --format unified BASE LEFT RIGHT
ayame-diff 3way text --choice 2=right --output merged.txt BASE LEFT RIGHT
ayame-diff 3way text --allow-conflicts --output review.txt BASE LEFT RIGHT
ayame-diff 3way text --allow-conflicts --merge-exit-code \
--output merged.txt BASE LEFT RIGHT
実装は bounded-window の BASE→LEFT / BASE→RIGHT 行差分を実行し、ベース範囲が重なる
部分だけをクラスタ化します。イベントは左のみ、右のみ、両側の同一変更、競合に分類します。
独立した変更と同一変更は自動マージします。未解決のテキスト競合は
--allow-conflicts なしでは拒否し、指定時は標準的な LEFT/BASE/RIGHT マーカーを書きます。
--merge-exit-code は --output を必須とし、完了した clean merge と
未解決 marker を含む保存済みファイルを区別します。0 は未解決 conflict のない
出力を書けたこと、1 は marker 付き出力を書いたことを表します。usage error は 2、
実行時・書き込み失敗は 3 のままです。文書化した Git custom mergetool は、この
安全な exit contract を使います。
キー付き CSV / TSV CLI¶
ayame-diff 3way csv --base base.csv --left team-a.csv --right team-b.csv \
--key id --json
ayame-diff 3way csv --base base.csv --left team-a.csv --right team-b.csv \
--key id --choice 0123456789abcdef=left --output reconciled.csv
明示的なキー(または exclude-key セット)が必要です。既存の分割・外部ソート比較を 2 回実行し、変更されたキーグループだけをメモリ上で結合します。保存時は BASE を ストリーミングし、影響するキーグループを置換するため、変更のない行を実体化しません。 置換行は元の BASE 行があった位置に書くため、他のキーと交互に並ぶ行も位置を保ちます。
重複キーはグループ単位ではなく行単位でマージします。同じキーを持つ別々の BASE 行を
LEFT と RIGHT がそれぞれ編集した場合、両方の編集が適用され、選択を求めずに merged
として報告します。競合になるのは同じ BASE 行を双方が消費した場合だけです。選択のない
CSV 競合は拒否します。明示的に --allow-conflicts を指定した場合は、競合マーカーが
構造化レコードとして無効なため BASE 行を保持します。
調整済み出力は BASE ファイルの文字エンコーディング、UTF-8 BOM、改行コードを再現します
(BOM なし UTF-8 + LF に正規化しません)。.csv / .csv.gz はカンマ、.tsv /
.tsv.gz はタブを使います。gzip 入力、日本語文字コード判定、引用、複数行セル、列整列、
lazy quotes、trim-leading-space の設定は通常の CSV エンジンに従います。UTF-8 以外の
入力はバイト指向の比較エンジンに渡す前に復号するため、Shift_JIS・EUC-JP・UTF-16・
ISO-2022-JP のキーもテキストとして比較されます。
GUI¶
3-way text または 3-way csv を選び、BASE、LEFT、RIGHT を指定します。
結果は 3 ペインで競合数を表示します。競合カードでは BASE / LEFT / RIGHT を選択でき、
全競合操作、元に戻す/やり直し、アトミック保存は 2-way マージの安全モデルを再利用します。
差分ナビゲーションは 3-way イベント間でも動作し、Alt+Left / Alt+Right で側を、
Alt+B で BASE を選びます。
上書きオプションと破壊的確認の両方がない限り、入力は上書きしません。新しい結果パスは 一時的な同階層ファイルを経由して rename します。