[解決済み] なぜSubversionよりMercurialの方がブランチやマージが簡単なのか?
質問
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+ のマージ記録機能については経験がありませんが、ワークフローは分散システムよりもずっと工夫されているように見えます。 ワークフローは、分散型システムよりもはるかに工夫されているようです。 もし本当にそうだとしたら、それはおそらく--上記のコメントで言及されているように--、その理由があるのでしょう。 上記のコメントで言及されているように、変更そのものよりもリポジトリの構成に焦点が置かれているからでしょう。
関連
-
[解決済み] EclipseのSVNプラグイン、SubclipseとSubversiveの長所と短所を教えてください。[クローズド]です。
-
[解決済み] 履歴のある SVN リポジトリを新しい Git リポジトリに移行するにはどうすればよいですか?
-
[解決済み] Subversionリポジトリにおける「branch」、「tag」、「trunk」の意味とは?
-
[解決済み] MercurialとGitの違いは何ですか?
-
[解決済み] なぜGitはSubversionよりも優れているのですか?
-
[解決済み】Git のマージは SVN よりも優れているのでしょうか?
-
[解決済み] あるSubversionのリポジトリから別のリポジトリに1つのフォルダを移動するにはどうしたらいいですか?
-
[解決済み] svn:トランクをブランチに置き換える
-
[解決済み] gitでマージした後にgit-svnでdcommitするのは危険ですか?
-
[解決済み】GitとMercurial - 比較と対比
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Subversionで既にコミットされたログメッセージを編集するには?
-
[解決済み] バージョン管理されていないファイルをすべてSVNに「追加」するには?
-
[解決済み] あるファイルの以前のSVNリビジョンに戻すより良い方法?
-
[解決済み] SVNファイルの旧バージョンを表示するには?
-
[解決済み] サブバージョン履歴の検索(全文)
-
[解決済み] マージ Hg/Git vs. SVN
-
[解決済み] WinMergeでSVNフォルダを無視するには?
-
[解決済み] subversion で、現在チェックアウトされているブランチとは異なるブランチに変更をコミットします。
-
[解決済み] バージョンコントロールのリポジトリはどのように整理されていますか?
-
[解決済み] SVN+SSHでssh-addを毎回する必要はない?(Mac OS)