1. ホーム
  2. svn

[解決済み] なぜSubversionよりMercurialの方がブランチやマージが簡単なのか?

2023-02-25 16:22:09

質問

Subversion や CVS でブランチへの複数のマージを処理することは、経験しなければならないことのひとつです。Mercurial (そしておそらく他の分散システムも) ではブランチとマージを追跡するのが非常に簡単なのですが、なぜなのでしょうか。他に誰か知っている人はいますか?

私の疑問は、Mercurial では Subversions/CVS のセントラルリポジトリと同様の作業方法を採用でき、すべてがうまくいくという事実に起因しています。同じブランチで複数のマージを行うことができ、コミット番号やタグ名を書いた紙切れが無限に必要なわけではありません。

Subversion の最新バージョンにはブランチへのマージを追跡する機能があるので、同じ程度の手間はかからないと思いますが、それは彼ら側の巨大で主要な開発であり、開発チームが望んでいることすべてをまだ実現できていません。

根本的な違いがあるのでしょうね。

どのように解決するのか?

<ブロッククオート

Subversion (および CVS) では、まずリポジトリがあります。git や mercurial では、同じようにリポジトリという概念はありません。 ここでは変更が中心テーマです。

+1

CVS/SVN の面倒なところは、これらのシステムが次のようなことを行っているという事実からきています。 ではなく が変更の親子関係を記憶していないことに起因します。 Git と Mercurial では。 では、コミットは複数の子を持つことができるだけでなく、複数の親を持つこともできます。 親を持つこともできます。

これは、グラフィカルなツールのひとつを使えば簡単に観察できます。 gitk または hg view . 次の例では、#2 ブランチは#1 ブランチから からフォークされ、その後一度マージされています (M で、コミット B とマージされました)。

o---A---o---B---o---C         (branch #1)
     \       \
      o---o---M---X---?       (branch #2)

AとBには2人の子供がいるのに対し、Mには2人の子供がいることに注意してください。 . これらの の関係は に記録されています。 に記録されます。 のメンテナが ブランチ#2 のメンテナがブランチ#1 の最新の変更点をマージしたいとします。 のようなコマンドを発行します。

$ git merge branch-1

とすると、ツールは自動的に ベース が B であることを自動的に認識します。 はコミット M に記録されており、#2 の先端の祖先であるからです。 の先祖であるコミット M に記録されているからです。 CVS はこの情報を記録しませんし、バージョン 1.5 より前の SVN もそうでした。 バージョン1.5以前のSVNも同様です。 これらのシステムでは、グラフ は次のようになります。

o---A---o---B---o---C         (branch #1)
     \    
      o---o---M---X---?       (branch #2)

ここで、M は A と B の間に起こったすべてのことの巨大な "squashed" commit であり、M の上に適用されます。 M の上に適用されます。 跡形もない 左 は残りません (人間が読むことのできるコメントは除く)。 がどこから来たのか、また がいくつ のコミットもわかりません。 歴史はより不可解なものになります。

さらに悪いことに、2 度目のマージを実行するのは悪夢のようなものです。 最初のマージの時点でマージベースが何であったか (そして、1 つの があります。

知っている を知ること!)、そしてその情報をツールに提示します。 その情報をツールに提示し、ツールが M の上で A..B を再生しようとしないようにします。 このすべては、緊密な共同作業では十分に困難ですが、分散環境では単純に不可能です。 分散環境では単純に不可能です。

関連する)問題は、次の質問に答える方法がないことです:"does X は B を含んでいますか? ここで、B は潜在的に重要なバグ修正です。 そこで、なぜその情報をコミットで記録しないのでしょうか。 それは 既知の であるのですから!

P.-S. -- 私は SVN 1.5+ のマージ記録機能については経験がありませんが、ワークフローは分散システムよりもずっと工夫されているように見えます。 ワークフローは、分散型システムよりもはるかに工夫されているようです。 もし本当にそうだとしたら、それはおそらく--上記のコメントで言及されているように--、その理由があるのでしょう。 上記のコメントで言及されているように、変更そのものよりもリポジトリの構成に焦点が置かれているからでしょう。