<!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 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="Shelving Changes" href="shelving_changes.html" /> <link rel="prev" title="これからの長い旅" href="part2_intro.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="shelving_changes.html" title="Shelving Changes" accesskey="N">次へ</a></li> <li class="right" > <a href="part2_intro.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="id1"> <h1>疑似マージ<a class="headerlink" href="#id1" title="このヘッドラインへのパーマリンク">¶</a></h1> <div class="section" id="id2"> <h2>チェリーピッキング<a class="headerlink" href="#id2" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>時々、ブランチの変更の全部ではなく一部だけを選んでマージすることが便利であることがあります。 これは一般的に <em>チェリーピッキング(cherrypicking)</em> として言及されます。</p> <p>チェリーピッキングが役に立ついくつかの事例:</p> <ul class="simple"> <li>メインの開発ブランチから修正の一部を取り出してリリースブランチに取り込む</li> <li>実験ブランチから改善内容を選別して機能ブランチに取り込む</li> </ul> <p><code class="docutils literal"><span class="pre">foo</span></code> ブランチのリビジョン Xによってなされた変更のみをマージするためには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">c</span> <span class="n">X</span> <span class="n">foo</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">foo</span></code> ブランチのリビジョンXまでの変更のみをマージするためには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">r</span> <span class="n">X</span> <span class="n">foo</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">foo</span></code> のリビジョンX以降の変更のみをマージするためには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">r</span> <span class="n">X</span><span class="o">..</span> <span class="n">foo</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">foo</span></code> ブランチのリビジョンXからリビジョンYまでの変更のみをマージするには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">r</span> <span class="n">X</span><span class="o">..</span><span class="n">Y</span> <span class="n">foo</span> </pre></div> </div> <p>通常のマージと同じように、チェリーピックは明示的にコミットしなければなりません。 これを行う前に、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></code> を利用した変更を見て何かあればテストスイートを実行するとよいでしょう。</p> <p>通常のマージとは異なり、Bazaarは現在はチェリーピックを追跡しません。 具体的に言うと、変更は通常のコミットと同じようになり、他のブランチから来た(内部の)変更履歴は失われます。 上記のようなチェリーピックが役に立つ場面では、このことはたいてい重大な問題ではありません。 フルマージが後で行われることはけっしてないと言える十分な理由があるからです。 そうではない場面では、変更が再びマージされたときにまた衝突を解消する必要があります。</p> </div> <div class="section" id="id3"> <h2>親のないマージ<a class="headerlink" href="#id3" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>チェリーピックに関連したテクニックとして、マージ元のリビジョンを参照せずに、 コミット前に親リビジョンを忘れることができます。 こうすると、このマージで行われた全ての変更が、1回のコミットで行われたような 効果があります。 マージしたあと、コミットする前に次のコマンドを実行します。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">revert</span> <span class="o">--</span><span class="n">forget</span><span class="o">-</span><span class="n">merges</span> </pre></div> </div> <p>これで、作業ツリー内の変更は残したまま、その変更がどこからマージされたかの 記録だけを削除します。そして、次のコミットではマージされたリビジョンに 関する情報が一切ない状態で、全ての変更を記録します。</p> <p>この機能は、「きれいな」履歴を作りたいユーザーに取って便利なものですが、 Bazaarはもともとマージされた履歴を段階的に表示する機能を持っているので、 失った履歴の価値が履歴のきれいさの価値を上回らないように気をつける必要があります。 特に、この機能を使うとマージ元の変更だけを取り込んでその変更のマージ元を 記録しないので、後で同じマージ元からマージしようとすると余計なコンフリクトを 発生させる可能性があります。</p> </div> <div class="section" id="reverse-cherrypicking"> <span id="id4"></span><h2>リバースチェリーピッキング<a class="headerlink" href="#reverse-cherrypicking" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>チェリーピッキングは一連の変更を元に戻すことができます。この場合、リビジョン範囲の上界(upper bound)が下界(lower bound)よりも <em>小さく</em> なります。 たとえば、リビジョン10の変更を取り消すためのコマンドはこうなります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">r</span> <span class="mf">10.</span><span class="o">.</span><span class="mi">9</span> </pre></div> </div> <p>どこかから、すべてではない大半の変更を得たい場合通常のマージをした後に少しのリバースチェリーピックを行うとよいでしょう。</p> </div> <div class="section" id="id5"> <h2>コミットされていない変更をマージする<a class="headerlink" href="#id5" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>複数のブランチを持っており、間違えて別のブランチを変更し始めた場合、訂正をとるステップは次のとおりです。 ブランチ <code class="docutils literal"><span class="pre">bar</span></code> で作業したかったのに、ブランチ <code class="docutils literal"><span class="pre">foo</span></code> で作業を始めてしまったという場合を前提とします:</p> <ol class="arabic simple"> <li><code class="docutils literal"><span class="pre">bar</span></code> ブランチに移動する</li> <li><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">merge</span> <span class="pre">--uncommitted</span> <span class="pre">foo</span></code> を実行する</li> <li>やってくる変更をチェックする (<code class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></code>)</li> <li><code class="docutils literal"><span class="pre">foo</span></code> ブランチに変更する</li> <li><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">revert</span></code> を実行する</li> </ol> </div> <div class="section" id="id6"> <h2>リベースする<a class="headerlink" href="#id6" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>通常のマージの別のオプションは <em>リベース(rebase)</em> です。 すなわち、現在のブランチが本来とは異なる地点をベースにするようにします。 リベースは <code class="docutils literal"><span class="pre">rebase</span></code> プラグインによって提供される <code class="docutils literal"><span class="pre">rebase</span></code> コマンドによってサポートされます。</p> <p><code class="docutils literal"><span class="pre">rebase</span></code> コマンドは現在の作業ディレクトリ内のリベースされるブランチ上で別のブランチの位置をとります。 ブランチが指定されないと親のブランチが使われ、通常これは望まれる結果です。</p> <p>最初のステップは現在のブランチのものであるが親のブランチではないリビジョンを特定することです。 現在のブランチはターゲットブランチと同じリビジョンに設定され、それぞれのリビジョンはブランチのトップで再現されます。 プロセスの終了時に現在のブランチがターゲットの最終リビジョンからブランチされたようになります。</p> <p>再現されるそれぞれのリビジョンがツリーの中で衝突を起こすことがあります。 これが起きたらコマンドは停止してそれらを修正しなければなりません。 <code class="docutils literal"><span class="pre">merge</span></code> するためにコミットを解消し、それらが解消されたものとしてマークするために <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">resolve</span></code> を実行します。 すべての衝突を解消したら、リベースオペレーションを続けるために <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">rebase-continue</span></code> を実行します。 衝突に遭遇せず続けないことを決めたら、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">rebase-abort</span></code> を実行できます。 リプレイされるコミットの一覧を表示するために <code class="docutils literal"><span class="pre">rebase-todo</span></code> を利用することもできます。</p> <p>注: マージトラッキング機能が貧弱なVCSツールから来たユーザーの中にはリベースを好む人がいます。 古いツールでの作業方法に似ている、もしくは”完璧にきれいな” 履歴が重要だからです。 Bazaarでリベースする前に、通常のマージがベターな選択肢ではないのか考えてください。 とりわけ、始める前にプライベートなブランチをリベースするのは大丈夫ですが、 他の誰かとブランチを共有した後のリベースは <strong>強く非推奨</strong> です。</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="#">疑似マージ</a><ul> <li><a class="reference internal" href="#id2">チェリーピッキング</a></li> <li><a class="reference internal" href="#id3">親のないマージ</a></li> <li><a class="reference internal" href="#reverse-cherrypicking">リバースチェリーピッキング</a></li> <li><a class="reference internal" href="#id5">コミットされていない変更をマージする</a></li> <li><a class="reference internal" href="#id6">リベースする</a></li> </ul> </li> </ul> <h4>前のトピックへ</h4> <p class="topless"><a href="part2_intro.html" title="前の章へ">これからの長い旅</a></p> <h4>次のトピックへ</h4> <p class="topless"><a href="shelving_changes.html" title="次の章へ">Shelving Changes</a></p> <div role="note" aria-label="source link"> <h3>このページ</h3> <ul class="this-page-menu"> <li><a href="../_sources/user-guide/adv_merging.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="shelving_changes.html" title="Shelving Changes" >次へ</a></li> <li class="right" > <a href="part2_intro.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>