[質問] mercurialで自動マージの結果新たにマージすべき場所が発生した場合はどのように処理しているのでしょうか?

65 views
Skip to first unread message

ohira

unread,
Jul 11, 2017, 3:26:20 AM7/11/17
to mercurial-ja

いつもお世話になっております。

おおひらです。

経緯:
winmergeの起動時のオプションで自動マージを指定しているのですが、
なぜか自動マージが行われていない水色の場所が残っていることが有りました。

作者の方に連絡したところ
自動マージが行われていないのではなくて、自動マージが行われた結果
新たにマージすべき場所が発生して、それが残った現象であることがわかりました。

自分の希望としては、水色の箇所があったら再度自動マージを自動で行って
解消していただきたいところなのですが、可能ではあるが本当にそうして良いのか悩んでいるということでした。


自動でマージした結果、新たにマージすべき場所が発生するという現象は
mercurialでも同じように起きると思います。

質問:
mercurialの場合自動マージの結果マージすべき場所が発生した場合は、どのように処理しているのでしょうか?

Katsunori FUJIWARA

unread,
Jul 21, 2017, 5:38:09 AM7/21/17
to mercurial-ja
藤原です。

返信が遅くなって済みません。

2017年7月11日 16:26 ohira <shin....@gmail.com>:
>
> いつもお世話になっております。
>
> おおひらです。
>
> 経緯:
> winmergeの起動時のオプションで自動マージを指定しているのですが、
> なぜか自動マージが行われていない水色の場所が残っていることが有りました。

以下、上記の「自動マージが行われていない水色の場所が残っている」と
いうのが、こちらで確認した以下の現象のことと仮定して話を進めます。

- マージ対象ファイルは、以下のコメントで添付されているものを使用

https://bitbucket.org/sdottaka/winmerge-v2/issues/59#comment-36973678

base
====
A
B
C
C
D
E
====

other
====
A
B
D
C
C
E
====

local
====
D
A
B
C
G
C
C
D
E
====

- "local" に表示される以下の内容において、末尾から2行目の "D" の
行に対して、"衝突未解決" を意味する「水色」が、LocationPane に
表示される

====
D
A
B
D
C
G
C
C
D <<
E
====

> 作者の方に連絡したところ
> 自動マージが行われていないのではなくて、自動マージが行われた結果
> 新たにマージすべき場所が発生して、それが残った現象であることがわかりました。
>
> 自分の希望としては、水色の箇所があったら再度自動マージを自動で行っ
> て解消していただきたいところなのですが、可能ではあるが本当にそう
> して良いのか悩んでいるということでした。
>
> https://bitbucket.org/sdottaka/winmerge-v2/issues/59
>
> 自動でマージした結果、新たにマージすべき場所が発生するという現象は
> mercurialでも同じように起きると思います。

少なくとも、「3way マージ処理」は、繰り返し適用する類のものではあ
りません。ですので、「自動でマージした結果、新たにマージすべき場所
が発生する」というのは、「3way マージ処理」の視点から見ると、「何
を言っているのかわからない」というのが正直なところです。

上記障害報告でのやりとりを見た範囲では、「自動でマージした結果、新
たにマージすべき場所が発生」というのは、「WinMerge の実装上の都合」
の話であって、「3way マージ処理」そのものに関する話ではないと思い
ます。

WinMerge での 3way マージ機能は、他のマージツールが 4 ペイン構
成 (base, local, other, output) であるのに対して、3ペイン構成になっ
ています。

実現方法としては、本当はp4mergeの様な4ペイン形式にしたかったの
ですが、 今まで実装する気力がわいてこなかったのと、最近3ペイン
形式でもよいかと考え直して、今のように実装してみました

http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html#3way-merge

そのため、local ペインがマージ結果 (= output) 表示を兼ねる形になって
いるのですが、これが「自動マージ後再度3方向比較」をしないと、「ロ
ケーションペイン等が更新されず」云々の原因になっているのではないで
しょうか?

これをしないとロケーションペイン等が更新されず、また、自動的に
再度3方向比較をしなくても 手動でF5キー等を押して再比較すると同
じ結果になってしまいますので なやましいところです。

https://bitbucket.org/sdottaka/winmerge-v2/issues/59#comment-36973678


> 質問:
> mercurialの場合自動マージの結果マージすべき場所が発生した場合は、
> どのように処理しているのでしょうか?

https://bitbucket.org/foozy/hgext-simplemerge を使って、
"hg simplemerge --debug" で件のファイル群を 3way マージした場合、
マージ結果の各行は、以下のような由来になります。

====
use-local: [1 - 1] of 3.localfile
|D
unchanged: [1 - 2] of 1.basefile
|A
|B
use-other: [3 - 3] of 2.otherfile
|D
unchanged: [3 - 3] of 1.basefile
|C
use-local: [5 - 6] of 3.localfile
|G
|C
unchanged: [4 - 4] of 1.basefile
|C
use-other: [6 - 5] of 2.otherfile <<<< ※ other での "D" 行の削除
unchanged: [6 - 6] of 1.basefile
|E
====

元ファイルとの目視でも、この結果は至極妥当なものであることがわかる
と思います。少なくとも、「自動マージ後再度3方向比較」なるものの必
要性は全く見当たりません。

その一方で WinMerge による 3way マージでは、「local で変更無し」/
「other で削除」なファイル末尾の "D" 行 (上記出力の ※) が、
output 兼用の local ペインにそのまま残っている = other での削除が
適切に取り込めていません。

これがまさに「自動マージが行われていない水色の場所が残っている」部
分に該当しています。

--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)
Reply all
Reply to author
Forward
0 new messages