1. ホーム
  2. version-control

[解決済み] 名前付きブランチとマルチリポジトリの比較

2022-07-19 05:55:40

質問

現在、比較的大きなコードベースで subversion を使用しています。各リリースは独自のブランチを持ち、修正はトランクに対して実行され、リリースブランチに svnmerge.py

私はより良いソース管理に移行する時期が来たと信じており、しばらくの間 Mercurial を試していました。

Mercurial を使ってこのようなリリース構造を管理するには、2つの流儀があるように思われます。 各リリースは独自のリポジトリを取得し、修正はリリースブランチに対して行われ、メインブランチ (および他の新しいリリースブランチ) にプッシュされます。または、単一のリポジトリ (または複数の一致するコピー) 内で名前付きブランチを使用します。

どちらの場合でも、リリースブランチに含める変更をチェリーピックするために transplant のようなものを使用している可能性があるようです。

それぞれのアプローチの相対的な利点は何でしょうか?

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

最も大きな違いは、ブランチ名の履歴への記録方法です。名前付きブランチの場合、ブランチ名は が埋め込まれます。 に埋め込まれ、履歴の不変部分となります。クローンでは 永久 記録は残りません。

つまり、クローンはブランチ名を記録したくない素早い実験に最適で、名前付きブランチは長期的なブランチ ("1.x" や "2.x" など) に適しているということです。

Mercurial では、1つのリポジトリに複数の軽量ブランチを簡単に収容できることにも注意してください。このようなリポジトリ内ブランチはブックマークしておけば、簡単に再探索することができます。例えば、会社のリポジトリをクローンしたとき、次のような状態だったとしましょう。

[a] --- [b]

ハックして [x][y] :

[a] --- [b] --- [x] --- [y]

誰かが [c][d] をリポジトリに登録することで、プルしたときにこのような履歴グラフが表示されます。

            [x] --- [y]
           /
[a] --- [b] --- [c] --- [d] のようになります。

ここでは、1つのリポジトリに2つのヘッドがあります。作業コピーは常に1つのチェンジセット、いわゆる作業コピーの親チェンジセットを反映します。で確認してください。

% hg parents

例えば、次のように報告するとします。 [y] . で頭を見ることができます。

% hg heads

で、これが報告されます。 [y] そして [d] . リポジトリをクリーンなチェックアウトに更新したい場合は [d] のクリーンなチェックアウトに更新したいのであれば、単純に (代わりの [d] をリビジョン番号に置き換えて [d] ):

% hg update --clean [d]

すると、次のようになります。 hg parents 報告 [d] . つまり、次のコミットでは [d] を親として持つことになります。このようにして、メインブランチで気づいたバグを修正し、チェンジセット [e] :

            [x] --- [y]
           /
[a] --- [b] --- [c] --- [d] --- [e] のようになります。

チェンジセットをプッシュするには [e] のみをプッシュするには、次のようにします。

% hg push -r [e]

ここで [e] はチェンジセットのハッシュです。デフォルトでは hg push は単にリポジトリを比較し、その中で [x] , [y] そして [e] が欠落している場合、共有したくないかもしれません。 [x][y] はまだです。

もしそのバグフィックスがあなたにも影響するのであれば、あなたの機能ブランチにマージしたいですよね。

% hg update [y]
% hg merge

そうすると、リポジトリのグラフは以下のようになります。

            [x] --- [y] ----------- [z]
           / /
[a] --- [b] --- [c] --- [d] --- [e] です。

ここで [z] の間のマージです。 [y][e] . また、枝を捨てるという選択肢もあったでしょう。

% hg strip [x]

この話の本題はこれです。 1つのクローンが簡単に開発のいくつかのトラックを表すことができます。これは、拡張機能を使用しないプレーンな hg" に対して常に当てはまります。これは ブックマーク拡張機能 はとても助かりますが。これはチェンジセットに名前(ブックマーク)を割り当てることができます。上の例では、開発用ヘッドと上流用ヘッドにそれぞれブックマークが必要です。ブックマークは プッシュとプル Mercurial 1.6 ではプッシュとプル、Mercurial 1.8 ではビルトイン機能として追加されました。

2つのクローンを作ることを選択した場合、開発用クローンは次のようになります。 [x][y] :

[a] --- [b] --- [x] --- [y]

そして、上流のクローンには

[a] --- [b] --- [c] --- [d]

これでバグに気づき、修正することができました。ここで、あなたは hg update をつける必要はありません。コミットして [e] :

[a] --- [b] --- [c] --- [d] --- [e]

開発用クローンにバグフィックスを取り込むには、そこにバグフィックスを取り込みます。

[a] --- [b] --- [x] --- [y] のようになります。
           \
            [c] --- [d] --- [e] のようになります。

とマージします。

[a] --- [b] --- [x] --- [y] --- [z].
           \ /
            [c] --- [d] --- [e]

グラフの見た目は違っても、構造は同じで、最終的な結果は同じです。クローンを使うことで、頭の中の整理が少し楽になりましたね。

名前付きブランチは、かなり任意なものなので、ここではあまり登場しませんでした。Mercurial 自体は、名前付きブランチの使用に切り替えるまで、何年も 2 つのクローンを使って開発されていました。私たちは 'default' ブランチの他に 'stable' というブランチを維持し、リリースは 'stable' ブランチに基づいて行っています。詳細は 標準ブランチ のページをご覧ください。