マージエンジンが最も優れているリビジョンコントロールはどれですか。[閉まっている]


8

マージに関しては、各コントロールバージョンにそれを実行するエンジンがあります。競合は避けられませんが、問題は-どのリビジョン管理が競合を回避するのに最適なAIを持つかです。

そのようなものを測定することは可能ですか?

具体的には、GITへの移行を検討しています。これは、誇大宣伝とうわさがあり、競合をより適切に処理するためです...

コメントは大歓迎です...


10
結局、VCSは、異世界的なことをせずに「クローズマージ」をうまく処理できません。ある人が一方向に進むルーチンにロジックを追加し、他の誰かが似たようなことをしますが、まったく異なる場合、人間は関与する必要があります。
Peter Rowell、2011

1
理論的には、実際にソースコードをコンパイルした場合、マージアルゴリズムは非常に優れている可能性があります。そこにあるように見えますが、それはおそらく時間の問題です。
カールビーレフェルト

1
@カール:え?どのソースコードをコンパイルします-行をx = 1に変更し、同僚が同じ行をx = 2に変更した場合、コンパイラーは、マージされた残りのコミットが与えられた場合、どの行が「正しい」かをどのように判断しますか。
gbjbaanb 2011

1
@gbj、あなたの例が証明するように、人間の介入を完全に回避することは決してできないでしょう。ただし、ソースコードをコンパイルすると、変数やメソッドの名前の変更、機能的には同じでテキスト的に異なる2つの方法での変更など、より簡単にマージできます。
カールビーレフェルト

テストで「ヒューマン」要因の一部を解決できませんでした。人間は自分が何を作ろうとしているのかを知っているので、テストをコンパイルして実行することで衝突を解決できます。ユニットテストは、同じメソッドへの2回の更新が数回のパスで実行可能であるほど十分に小さいレベルであると想定されています。テストが成功すると、人間が関与する必要があり、マージシステムがバリエーションが多すぎると判断した場合コンパイルは扱いにくいものではない人間が関与する必要があります。
クォータニオン2011

回答:


21

これは正しい質問ではないと思います。

問題は、多くのコーナーケースがあり、マージ用の「スマート」アルゴリズムは、実際にコードを完全にスクローズしたときに、マージが正しく行われたと思い込ませることができることです。運が良ければ、そのような悪いマージはコンパイル時の失敗を引き起こします。運が悪いと、追跡に時間がかかる微妙なバグが発生する可能性があります。

Gitはかなり単純なマージアルゴリズムを使用し、手を上げて、マージできない場合は助けを求めます。私の意見では、これはまさにあなたがバージョン管理システムにしたいことです。これによって免れる悲しみの量は、競合を手動で修正するのにかかる時間に十分に値します。(また、マージで競合がある場合、gitは競合するファイルを自動生成されたコミットメッセージにリストします-これは、コード履歴を調べているときにエラーを見つけるのに非常に便利です)。


6

最良のアルゴリズムはDarcsのパッチ代数であると言われています。Codevilleに興味深いアルゴリズムが開発されています。
ただし、すべての実用的な理由から、3者間マージを使用するツールであれば問題ありません。これにはgit(バリアントを含む)、mercurial、bazaar、および多くの外部ツール(注目に値する例外:Macのopendiffおよびkaleidoscope)が含まれるため、おそらく最良のオプションがすでに使用されています。@Peterが指摘したように、アルゴリズムが役に立たない場合があります。


4
どの共通の祖先が選択されているか、ラインのマッチングで使用される2ウェイ差分の品質など、3ウェイマージアルゴリズムに微妙な違いがありますが、実際に違いがあるケースは正しいと思います比較的まれです。
カールビーレフェルト

TMK Mercurialには真の3ウェイマージがありません。2つの2ウェイマージを行う必要があります
TheLQ

@TheLQのドキュメントはそうではないと言っています:mercurial.selenic.com/wiki/MergeProgramしかし、詳細については少々抜け目があります
Agos

@TheLQ- 3方向の差分3方向のマージに大きな違いがあります。三方diffは二つのファイルマージされるプラスの共通の祖先を使用すると、2つのソースが発散しているかを確認することができます共通の祖先、です。3ウェイ・マージが必要になり、四方デフ、3つの発散ファイルに加えて彼らの共通の祖先を。
マークブース

3

私はgitとmercurialを使用していますが、あなたの質問はdarcsのパッチ理論を覚えています。今週末は宿題を読む予定です。

PD:パッチの理論を聞かないでください、私にとっては非常に複雑です:)


興味深いことに、SVNはパッチを適用することでマージを行いますが、rとmの両方を同じ単語に適用する完全なパッチアルゴリズムでは正しい結果が得られません。この場合でも、人間の介入が必要です。
gbjbaanb 2011

3

それはHuman Revision Controlと呼ばれていました。(Human Merging Engine)

私たちはSeapine Surroundを使用しており、ほとんどの場合、マージはうまく機能していますが、ソース管理で実行できないマージ競合を修正する唯一の方法は、人間の介入によるものです。

だから、私のアドバイスは:

すばやくマージしてみてください。悪夢の1つに、ほぼ2年間メインラインに復帰しないブランチがありました。それが統合されたとき、多くの衝突が解決される必要がありました。ある開発者は、マージの問題の修正に多くの時間を費やした後、「マージマスター」というニックネームを獲得しました。

ウィザードなどから自動生成されたコードに注意してください。同じファイルで2つのブランチが自動生成された変更を変更する場合、特にこれをマージするのが本当に面倒になることがあります。

開発を制御してみてください。開発者AがコードファイルXとYを分解している場合、開発者Bが別のブランチのXとYで作業することはあまり意味がありません。マージ管理の一部は、マージの競合の可能性を回避するために変更されているものを試行して制御することです。

これは、2人の開発者が2つの異なるブランチの同じファイルで作業することができないと言っているのではありません。1人の開発者がメソッドAを追加し、別の開発者がメソッドBを追加した場合、マージは簡単に行われるはずです。

結局のところ、常に人間の介入を必要とするいくつかの紛争があります。それらを最小限に抑えることにより、最良のマージ結果が得られます。


2
私見自動生成されたファイルはバージョン管理されるべきではありません。それらを生成するために使用されるファイルのみ。
Calmarius 14年

2

完璧なマージエンジンは、マージされるファイルのセマンティクスを理解します。つまり、ソースコードを解析して理解します。そのようなマージエンジン/バージョン管理はまだ見ていません...

ほとんどのマージツールは、ファイルをテキストとしてマージします。だから私は盲目的にそれらに依存することは決してありません、それをあなたのブランチにコミットする前に変更をレビューすることは常に良い考えです。

自動的にマージしないPerforceを使用しています。ソースファイルが共通ベースに関連して変更されるたびに、競合がない場合でもターゲットファイルを解決する必要があると表示されます。だから私はマージツールを開いて、それらが適切であるかどうかを確認するために考えたハンクをすばやくステップし(そして他のピアが何をしているかの大まかな画像を取得します)、ほとんどの場合、それらはフィットして結果を受け入れます。

また、メインラインの変更通知をサブスクライブしたので、ブランチへの変更をできるだけ早くマージして、後で問題を回避できるようにしています。


1

えっと...

mercurial(およびgitもそうだと思います)を使用する場合、マージエンジンを選択します。デフォルトではkdiff3ですが、(compare、p4mergeなどを除く)好きなものを使用できます。

多くの場合、マージエンジンとVCSは、コンパイラやテキストエディタのように、完全に独立しています。たとえば、XMLとコードを比較します。それらをマージするためにさまざまなものが必要になります。それらは同じように機能しないため、同じようにマージすることはできません。

より良いマージツールが必要なためにバージョン管理を切り替える場合、間違った理由でバージョン管理を切り替える必要があります。バージョン管理を切り替える必要があるのは、現在使用しているバージョンがプロセスにうまく適合しない場合(または別のプロセスが適切な場合)だけです。より良いプロセスを使用できるようにします)。


1
すべてのVCSには、使用する組み込みのマージアルゴリズムがあります。参照するマージツールは、内部エンジンが解決できない競合がある場合にのみ使用されます。質問は、どのVCSマージアルゴリズムが「最適」かということですが、明確に定義された質問かどうかはわかりません。一部の人々はそれを「解決が必要な最も少ない紛争を生み出す」と定義しています。私が言うには、エラーが最も少ない。
ebneter、2011

1
mercurialが実際には舞台裏のdiffツールを使用していると確信しています。どこかに変更できる設定があります。私が言及したすべてのdiffツールには3方向マージモード(単なるdiffモードではない)があり、p4mergeは間違いなくperforceが衝突を検出するときに使用するツールです。VCS自体には、マージの前兆である衝突検出アルゴリズム(つまり、同じ場所で同じファイルを変更したかどうか)しかないと思います。
エドジェームス

デフォルトでは、Mercurialは単純な3者間マージアルゴリズムを使用します。ただし、はい、それを上書きできます。さらに言えば、ほとんどのVCSツールに組み込まれているマージを上書きできます。ただし、AFAIK、それらすべては競合を探すためにいくつかの内部マージアルゴリズムを使用しており、これは実際にはここで重要なポイントです-VCSの内部マージアルゴリズムが賢すぎる場合、必要な場所で競合を見つけることができない可能性があります。
ebneter 2011

DVCSでは、ブランチがマージされるたびに、メインマージツールを介して両方のブランチで編集されたファイルが実行されることを期待しています。マージの競合を探す必要はありません。マージの競合があると仮定してください。存在しない場合は、何も失われていません。同じことが標準のVCSにも当てはまると思います。
エドジェームズ

「メインマージツール」とはどういう意味ですか?デフォルトのアルゴリズムですか、それとも指定したものですか?後者を意味するのであれば、私が知っているように公平であるとしても、そのように機能するものはありません。私が精通しているすべてのVCSは、内部アルゴリズムを使用してマージし、競合がある場合にのみユーザーが選択したツールを呼び出します。gitのような一部のVCSは、いくつかの組み込み戦略から選択できること、一部のVCSはかなり高度な内部アルゴリズムを備えていることに注意してください。
ebneter 2011

1

衝突は避けられない

VCSがファイル内の競合をどの程度適切に処理するかは、私の考えでは少し過大評価されています。まず、そのような紛争に対処する最善の方法は、そもそもそれらを持たないことです。ソフトウェアをうまく​​因数分解し、先見の明のある割り当てを分割することで、ファイルのクラスター内(ファイル内だけでなく)の競合を大幅に減らすことができます。あまりにも多くのgodクラスを投げたり、誰もが使用しなければならず、誰もがやりたがっている共通の構成ファイルを投げたり、ファイルレベルの競合を要求したりするなど、悪い仕事をしてください。

もう1つは、ほとんど同じ(お粗末な)アルゴリズムを使用していることです。例:私たちのプロジェクトのアルファ版リリースでマイナーなメモリリークが発生しました。これはリークというよりドリップであり、リークは初期化時間の終わりに停止しました。修正に値するものであり、パッチに値するものではありません。お客様の1人が問題を「修正」し、無料を間違った場所に置きました。この問題は次のリリースで修正されました。この顧客は、完全な置き換え(WTF?)ではなく、新しいリリースをマージしました。3者間マージで競合はありませんでした。freeへの呼び出しは、互いに分離されていました。そのため、ソフトウェアはダブルフリーのためにコアをドロップしています。

議論で見逃されているのは、作業をソフトウェアのメインラインにマージするのがどれほど難しい/時間のかかる/エラーが発生しやすいかです。

SVNでは、あなた

  • 変更をブランチにコミットします。
  • トランクをブランチにマージします。
  • 大きなプロジェクトがある場合は、コーヒーブレークをとるか、ランチに行くことを考えてください。
  • あなたが戻ってきたときに、あなたが木の衝突を見ることがないように祈ってください。
  • マージの結果をブランチにコミットします。
  • ブランチをトランクにマージします。
  • 別のコーヒー休憩を取る。
  • もう一度、戻ってきたときに木が衝突しないように祈ってください。
  • 変更をトランクにコミットします。
  • 同じことをしようとしていた同僚との衝突を避けるために、ドアを閉めてください。

これは非常に多くの非アトミックなステップであり、エラーが入り込む可能性のある場所が多すぎ(ツリーの競合は単に厄介なものです)、時間がかかりすぎます。マージプロセスが非常に時間がかかり、エラーが発生しやすいため、subversionでブランチを使用することをあきらめた複数のプロジェクトを見てきました。これにより、さらに多くのプロジェクトがsubversionから完全に切り替わるのを見てきました。


1

mergeと呼ばれる小さなテストスイートがあり、これはリビジョン管理システムを実際のマージシナリオと比較します。シナリオごとに、VCSが以下を正しく実行できることを確認します。

  • 競合せずにブランチをマージする
  • コンパイルするコードを生成する
  • 正しく動作するコードを生成する

マージで成功したテストの数に基づくと、これには2つの層のパフォーマンスがあるようです。

  1. Darcs、Git
  2. Mercurialバザール

マージしようとしているプログラミング言語によっては、正確なテスト結果が重要になる場合があります。詳細な比較表については、プロジェクトのWebサイトを参照してください。



0

私はIBM / Rational ClearCaseを使用しており、マルチブランチのマージは素晴らしいです。subversionの周りにリングを実行します。(Gitや水銀の経験はありません。)


hgのマージはccと同等かそれ以上です。両方使用しました。
Paul Nathan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.