[解決済み] 名前付きブランチとマルチリポジトリの比較
質問
現在、比較的大きなコードベースで 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' ブランチに基づいて行っています。詳細は 標準ブランチ のページをご覧ください。
関連
-
[解決済み] hg forgetとhg removeの違いは何ですか?
-
[解決済み] マージされたGitブランチをすべて削除するにはどうすればよいですか?
-
[解決済み] すべてのGitブランチを取得する方法
-
[解決済み] Git のブランチの一覧を最新のコミット順に表示するにはどうしたらよいですか?
-
[解決済み] Subversionリポジトリにおける「branch」、「tag」、「trunk」の意味とは?
-
[解決済み] masterブランチとorigin/masterが分岐してしまったので、分岐を解除する方法を教えてください。
-
[解決済み】Gitで複数のコミットの著者名やコミッター名、Eメールを変更する方法は?
-
[解決済み】指定したコミットを含むブランチを一覧表示するには?
-
[解決済み] 開発はブランチで続けるか、トランクで続けるか?[クローズド]
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DreamWeaver の _notes フォルダと dwsync.xml ファイルは、ソースコントロールによって安全に無視できますか?
-
[解決済み] Mercurialで不正なコミットメッセージを編集するには?重複
-
[解決済み】3ウェイマージの方が2ウェイマージより有利なのはなぜですか?
-
[解決済み】ソースコントロールに変更をコミットする頻度を教えてください。[クローズド]
-
[解決済み】Mercurial - 古いバージョンに戻してそこから継続する
-
[解決済み] TFSソースコントロールで複数のファイルを移動する
-
[解決済み] 開発はブランチで続けるか、トランクで続けるか?[クローズド]
-
[解決済み] Hudson / Jenkinsの設定ファイルをソース管理する方法はありますか?
-
[解決済み] IntelliJ IDEA 9/10、ソースコントロールにチェックインする(しない)フォルダは何ですか?
-
[解決済み] git add . vs git commit -a