藤原です。
2017年12月29日 12:07 ohira <
shin....@gmail.com>:
> おおひらです。
>
> 以下のような状況です。
>
> ...
> ...
> ...
> (base other local 共通)
> (base other 共通)(local 別) <---------- ここから
> (base other 共通)(local 別)
> (base other 共通)(local 別)
> (base other 共通)(local 別)
> (base 別)(other 別)(local 別) (この行だけコンフリクトで良さそうな気がしますが)
> (base other 共通)(local 別)
> (base other 共通)(local 別)
> (base other 共通)(local 別)
> (base other 共通)(local 別) <---------- ここまでがコンフリクトの対象
> (base other local 共通)
> ...
> ...
> ...
上記の挙動は想定通りのものです。
Mercurial の builtin マージ処理 (= Python の標準ライブラリの挙動)
や、diff3 (GNU diffutils) 等の CUI 3-way マージツールは、単純に
「行ごとの文字列の一致/不一致」で変更の有無を判定しています。
そのため、「local 側の変更内容」 (= 上記例における「(base other 共
通)(local 別)」な行) が、「other にとって妥当な内容か否か」を判定
することができません。
衝突内容の書き出しの際に、無理に衝突範囲を狭めるよりも、エンドユー
ザの判断に任せる方が安全である、というのは、妥当な選択だと思います。
おおひらさんの「この行だけコンフリクトで良さそうな気がしますが」と
いう感想も:
- local 側の変更は、「先頭の文字列が始まるまでの空白を一つ削除」x35行
- other 側の変更は、「行の中央部分のキャラクタを削除」x1行
という、「変更内容に対する理解」あってのものだと思います。
もしもこれが「変更内容が不明」な 35 行 (local) + 1行 (other) だと
したら、「この行だけコンフリクトで良さそう」とは思わないのではない
かと (笑)
このあたりの「内容を理解している視点で見た場合の、衝突検出の冗長性」
の問題は、本 ML でも以前触れましたが、ファイル内容を理解できるマー
ジ処理、いわゆる semantic merge が可能なツールが必要でしょうね。
暫く前に、Windows 環境& C#, VB.net, Java, C 言語限定ではあります
が、semantic merge を行う、その名もずばり SemanticMerge なるツール
の存在を知りました。
https://www.semanticmerge.com/
Mercurial 向け設定方法の説明もあります。
https://users.semanticmerge.com/documentation/how-to-configure/semanticmerge-configuration-guide.shtml#HowtoconfigurewithMercurial
2.0 リリースでは、以下の対応が予定されているとのことなので、導入が
視野に入ってくる人も増えるのでは?
- 動作環境に OSX/Linux が追加
- C++, Objective-C, JavaScript 対応
> simplemerge でハッシュ表示して、同じハッシュだけど厳密には行の内
> 容違うという可能性はあるのでしょうか?
--
----------------------------------------------------------------------
FUJIWARA Katsunori(
flying...@gmail.com)