<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Bazaarの哲学 — Bazaar 2.7.0 ドキュメント</title> <link rel="stylesheet" href="../_static/classic.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', VERSION: '2.7.0', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> <script type="text/javascript" src="../_static/translations.js"></script> <link rel="shortcut icon" href="../_static/bzr.ico"/> <link rel="search" title="検索" href="../search.html" /> <link rel="top" title="Bazaar 2.7.0 ドキュメント" href="../index.html" /> <link rel="up" title="Bazaarユーザーガイド" href="index.html" /> <link rel="next" title="単独で始める" href="solo_intro.html" /> <link rel="prev" title="プラグインを利用する" href="plugins.html" /> </head> <body role="document"> <div class="related" role="navigation" aria-label="related navigation"> <h3>ナビゲーション</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="solo_intro.html" title="単独で始める" accesskey="N">次へ</a></li> <li class="right" > <a href="plugins.html" title="プラグインを利用する" accesskey="P">前へ</a> |</li> <li class="nav-item nav-item-0"><a href="../index.html">目次 (2.7.0)</a> »</li> <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Bazaarユーザーガイド</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <div class="section" id="bazaar"> <h1>Bazaarの哲学<a class="headerlink" href="#bazaar" title="このヘッドラインへのパーマリンク">¶</a></h1> <div class="section" id="id1"> <h2>Bazaarを完全に理解する<a class="headerlink" href="#id1" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>Bazaarは多くの点で他のVCSに似ていますが、最初見たときに必ずしも明らかではない大きな違いがいくつかあります。 このセクションでは Bazaarを”grok”するため、すなわち深く理解するために、 ユーザーが知る必要のあるいくつかの内容の説明を試みます。</p> <p>注: Bazaarを使うためにこのセクションを十分に理解する必要はありません。 このセクションをさっと読んで後で戻るとよいでしょう。</p> </div> <div class="section" id="id2"> <h2>リビジョン番号を理解する<a class="headerlink" href="#id2" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>ブランチのメインラインのすべてのリビジョンは単純に増加する整数を持ちます(最初のコミットは1、10番目のコミットは10などです)。 これによって “私のブランチから10番目のリビジョンを獲得する”、もしくは “リビジョン3050で修正した” という言い方が自然になります。</p> <p>ブランチにマージされるリビジョンに関しては、ドットつきのバージョンが使われます(たとえば、3112.1.5)。 ドットつきのリビジョン番号は3つの番号を持ちます <a class="footnote-reference" href="#id4" id="id3">[1]</a>. 最初の番号はメインのリビジョンの変更の由来を示します。 2番目の番号はブランチのカウンターです。 同じリビジョンから多くのブランチが由来することがあり得るので、それらのブランチはユニークな番号を取得します。 3番目の番号はブランチの開始以降のリビジョン番号です。 たとえば、3112.1.5はリビジョン3112からの最初のブランチで、そのブランチ上の5番目のリビジョンです。</p> <table class="docutils footnote" frame="void" id="id4" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id3">[1]</a></td><td>バージョン1.2以前のbzrでは少し異なるアルゴリズムが使われていました。 いくつかの入れ子のブランチはよりシンプルな3つの番号システムではなく追加の番号(たとえば1.1.1.1.1)を取得します。</td></tr> </tbody> </table> </div> <div class="section" id="id5"> <h2>階層形式の履歴はよいものである<a class="headerlink" href="#id5" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>多くの変更が一連のコミットで構成される状況で複数の開発者が変更を投稿するプロジェクトを想像してください。 具体例を示すために、次の事例を考えてみましょう:</p> <blockquote> <div><ul class="simple"> <li>プロジェクトのトランクのチップはリビジョン100です。</li> <li>Maryは機能Xを配信するために3つの変更を行う</li> <li>Billは機能Yを配信するために4つの変更を行う</li> </ul> </div></blockquote> <p>開発者が並行して作業して伝統的な集中型のVCSのアプローチを利用する場合、 大抵の場合プロジェクトの履歴は次のようにMaryの変更とBillの変更が交互に混ざります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">107</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">106</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">Y</span> <span class="mi">105</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mi">104</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">103</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>多くのチームはこのアプローチを利用します。彼らのツールではブランチの作成とマージが難しいからです。 結果として、開発者はトランクからの更新とコミットを頻繁に行い、すべてのコミットを通してそれを広げることで統合の苦痛を最小化します。 望むのであれば、このようにBazaarを使うことができます。 Bazaarは考慮すべき別の方法を提供します。</p> <p>分散型のVCSツールによって推奨される代替のアプローチは機能ブランチを作り、準備ができたらそれらを統合することです。 この場合、Maryの機能ブランチは次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">103</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>そしてBillのものは次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">104</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">103</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">Y</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>機能が独立していてリニアな履歴を維持したいのであれば、変更はバッチでトランクにpushされます。 (技術的には、これを行う方法は無数にありますがこの検討内容の範囲を超えます。) 結果の履歴は次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">107</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mi">106</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">105</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">104</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">103</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">Y</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>これを実現するために少し努力が必要な一方で、リビジョンをランダムに織り交ぜるよりもいくつかの利点があります。 よりベターですが、non-linearな履歴を形成してブランチは一緒にマージできます。 結果は次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">102</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">X</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">4</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="k">for</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>もしくは次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">102</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">X</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">4</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>多くの理由からこれはよいものと考えられます:</p> <blockquote> <div><ul class="simple"> <li>プロジェクトの履歴を理解するのが楽になります。 関連した変更はクラスターを形成し明確に区切られます。</li> <li>ブランチのメインライン上のコミットだけを見るために履歴を簡単に折りたたむことができます。 (このレベルでは興味のない膨大な数のコミットの代わりに) このようなトランクの履歴を閲覧するとき、高いレベルのコミットだけ見えます。</li> <li>必要であれば、より簡単に機能の変更を取り消します</li> <li>継続的インテグレーション(Continuous integration: CI)ツールは マージをメインラインにコミットするためにすべてのテストが合格することを保証するために使われます。 (多くの場合、すべての単独のコミットの後でCIツールの引き金を引くのは適切ではありません。 テストの中には開発の間に失敗するものがあるからです。 実際、テストファーストの追加 - テスト駆動開発(TDD)のスタイル - によってこれが保証されます!)</li> </ul> </div></blockquote> <p>要約すると、重要な点は次のとおりです:</p> <blockquote> <div><p><em>ブランチを利用してあなたの作業内容を編成する</em></p> <p><em>マージ機能を利用して変更を統合する</em></p> <p><em>順序つきの番号と階層によって履歴を追跡するのが楽になる</em></p> </div></blockquote> </div> <div class="section" id="id6"> <h2>それぞれのブランチは履歴の独自のビューを持つ<a class="headerlink" href="#id6" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>上述のように、Bazaarは次の内容を区別します:</p> <blockquote> <div><ul class="simple"> <li>メインラインのリビジョン、すなわちブランチにコミットしたもの</li> <li>マージしたリビジョン、マージをコミットすることで祖先として追加されるもの</li> </ul> </div></blockquote> <p>それぞれのブランチは効率的に履歴の独自ビューを持ち、すなわち、 異なるブランチは同じリビジョンに異なる”ローカルな”リビジョン番号を与えます。</p> <p>マージされたリビジョンは常にドットつきのリビジョン番号を入手するのに対して メインラインのリビジョンは常に単独の数字のリビジョン番号が割り当てられます。</p> <p>上記の例を拡張するためには、Maryが変更を完了させた後でプロジェクトのトランクにマージした後に Maryのブランチのリビジョンの履歴は次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">104</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">mainline</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">4</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="mi">103</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>繰り返しますが、Maryはこの変更を開発するためにステップを見るために彼女の履歴のトップレベルを調べることが簡単になります。 この文脈では、トランクのマージ(とそれを行うことによる衝突の解消)はこのブランチの履歴に関しては単なる1つのステップです。</p> <p>Bazaarは履歴を変更するのでなければグローバルなリビジョン識別子を変更するのでもないことを覚えておくのは大事です。 本当に望むのであれば常に後者を使用できます。 実際、ブランチのURLをコンテクストとして提供する <em>限り</em> コミュニケーションをするときに特定のリビジョン番号を使うことができます。 (多くのBazaarのプロジェクトでは、開発者はブランチURLなしでリビジョン番号を交換するとき中心のトランクのブランチをほのめかします)</p> <p>マージはブランチのリビジョン番号を変更しません。それらはローカルのリビジョン番号を新しくマージしたリビジョンに割り当てるからです。 Bazaarがブランチのリビジョン番号を変更する唯一のときはあなたが明示的に別のブランチをミラーリングするように頼むときです。</p> <p>注: リビジョンは安定した方法で番号づけされます: 2つのブランチがメインラインで同じリビジョン番号を持つとき、 そのリビジョンの祖先のすべてのリビジョンは同じリビジョン番号を持ちます。 たとえば、AliceとBobのブランチがリビジョン10に一致するのであれば、それらはそれ以前のすべてのリビジョンで一致します。</p> </div> <div class="section" id="id7"> <h2>要約<a class="headerlink" href="#id7" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>一般的に、前に示されたアドバイスに従うのであれば - ブランチの中で作業し、連携するためにマージを使う - Bazaarが一般的にあなたが期待することを行うことがわかります。</p> <p>次の章では、Bazaarを利用したさまざまな方法: もっとも単純なプロジェクト、個人プロジェクトなどを試します。</p> </div> </div> </div> </div> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3><a href="../index.html">目次</a></h3> <ul> <li><a class="reference internal" href="#">Bazaarの哲学</a><ul> <li><a class="reference internal" href="#id1">Bazaarを完全に理解する</a></li> <li><a class="reference internal" href="#id2">リビジョン番号を理解する</a></li> <li><a class="reference internal" href="#id5">階層形式の履歴はよいものである</a></li> <li><a class="reference internal" href="#id6">それぞれのブランチは履歴の独自のビューを持つ</a></li> <li><a class="reference internal" href="#id7">要約</a></li> </ul> </li> </ul> <h4>前のトピックへ</h4> <p class="topless"><a href="plugins.html" title="前の章へ">プラグインを利用する</a></p> <h4>次のトピックへ</h4> <p class="topless"><a href="solo_intro.html" title="次の章へ">単独で始める</a></p> <div role="note" aria-label="source link"> <h3>このページ</h3> <ul class="this-page-menu"> <li><a href="../_sources/user-guide/zen.txt" rel="nofollow">ソースコードを表示</a></li> </ul> </div> <div id="searchbox" style="display: none" role="search"> <h3>クイック検索</h3> <form class="search" action="../search.html" method="get"> <div><input type="text" name="q" /></div> <div><input type="submit" value="検索" /></div> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related" role="navigation" aria-label="related navigation"> <h3>ナビゲーション</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="solo_intro.html" title="単独で始める" >次へ</a></li> <li class="right" > <a href="plugins.html" title="プラグインを利用する" >前へ</a> |</li> <li class="nav-item nav-item-0"><a href="../index.html">目次 (2.7.0)</a> »</li> <li class="nav-item nav-item-1"><a href="index.html" >Bazaarユーザーガイド</a> »</li> </ul> </div> <div class="footer" role="contentinfo"> © Copyright 2009-2011 Canonical Ltd. このドキュメントは <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.9 で生成しました。 </div> </body> </html>