<!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"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>疑似マージ — Bazaar 2.6.0 documentation</title> <link rel="stylesheet" href="../_static/default.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.6.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="top" title="Bazaar 2.6.0 documentation" 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> <div class="related"> <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><a href="../index.html">目次 (2.6.0)</a> »</li> <li><a href="index.html" accesskey="U">Bazaarユーザーガイド</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <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><tt class="docutils literal"><span class="pre">foo</span></tt> ブランチのリビジョン Xによってなされた変更のみをマージするためには:</p> <div class="highlight-python"><pre>bzr merge -c X foo</pre> </div> <p><tt class="docutils literal"><span class="pre">foo</span></tt> ブランチのリビジョンXまでの変更のみをマージするためには:</p> <div class="highlight-python"><pre>bzr merge -r X foo</pre> </div> <p><tt class="docutils literal"><span class="pre">foo</span></tt> のリビジョンX以降の変更のみをマージするためには:</p> <div class="highlight-python"><pre>bzr merge -r X.. foo</pre> </div> <p><tt class="docutils literal"><span class="pre">foo</span></tt> ブランチのリビジョンXからリビジョンYまでの変更のみをマージするには:</p> <div class="highlight-python"><pre>bzr merge -r X..Y foo</pre> </div> <p>通常のマージと同じように、チェリーピックは明示的にコミットしなければなりません。 これを行う前に、 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></tt> を利用した変更を見て何かあればテストスイートを実行するとよいでしょう。</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-python"><pre>bzr revert --forget-merges</pre> </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-python"><pre>bzr merge -r 10..9</pre> </div> <p>どこかから、すべてではない大半の変更を得たい場合通常のマージをした後に少しのリバースチェリーピックを行うとよいでしょう。</p> </div> <div class="section" id="id5"> <h2>コミットされていない変更をマージする<a class="headerlink" href="#id5" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>複数のブランチを持っており、間違えて別のブランチを変更し始めた場合、訂正をとるステップは次のとおりです。 ブランチ <tt class="docutils literal"><span class="pre">bar</span></tt> で作業したかったのに、ブランチ <tt class="docutils literal"><span class="pre">foo</span></tt> で作業を始めてしまったという場合を前提とします:</p> <ol class="arabic simple"> <li><tt class="docutils literal"><span class="pre">bar</span></tt> ブランチに移動する</li> <li><tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">merge</span> <span class="pre">--uncommitted</span> <span class="pre">foo</span></tt> を実行する</li> <li>やってくる変更をチェックする (<tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></tt>)</li> <li><tt class="docutils literal"><span class="pre">foo</span></tt> ブランチに変更する</li> <li><tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">revert</span></tt> を実行する</li> </ol> </div> <div class="section" id="id6"> <h2>リベースする<a class="headerlink" href="#id6" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>通常のマージの別のオプションは <em>リベース(rebase)</em> です。 すなわち、現在のブランチが本来とは異なる地点をベースにするようにします。 リベースは <tt class="docutils literal"><span class="pre">rebase</span></tt> プラグインによって提供される <tt class="docutils literal"><span class="pre">rebase</span></tt> コマンドによってサポートされます。</p> <p><tt class="docutils literal"><span class="pre">rebase</span></tt> コマンドは現在の作業ディレクトリ内のリベースされるブランチ上で別のブランチの位置をとります。 ブランチが指定されないと親のブランチが使われ、通常これは望まれる結果です。</p> <p>最初のステップは現在のブランチのものであるが親のブランチではないリビジョンを特定することです。 現在のブランチはターゲットブランチと同じリビジョンに設定され、それぞれのリビジョンはブランチのトップで再現されます。 プロセスの終了時に現在のブランチがターゲットの最終リビジョンからブランチされたようになります。</p> <p>再現されるそれぞれのリビジョンがツリーの中で衝突を起こすことがあります。 これが起きたらコマンドは停止してそれらを修正しなければなりません。 <tt class="docutils literal"><span class="pre">merge</span></tt> するためにコミットを解消し、それらが解消されたものとしてマークするために <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">resolve</span></tt> を実行します。 すべての衝突を解消したら、リベースオペレーションを続けるために <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">rebase-continue</span></tt> を実行します。 衝突に遭遇せず続けないことを決めたら、 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">rebase-abort</span></tt> を実行できます。 リプレイされるコミットの一覧を表示するために <tt class="docutils literal"><span class="pre">rebase-todo</span></tt> を利用することもできます。</p> <p>注: マージトラッキング機能が貧弱なVCSツールから来たユーザーの中にはリベースを好む人がいます。 古いツールでの作業方法に似ている、もしくは”完璧にきれいな” 履歴が重要だからです。 Bazaarでリベースする前に、通常のマージがベターな選択肢ではないのか考えてください。 とりわけ、始める前にプライベートなブランチをリベースするのは大丈夫ですが、 他の誰かとブランチを共有した後のリベースは <strong>強く非推奨</strong> です。</p> </div> </div> </div> </div> </div> <div class="sphinxsidebar"> <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> <h3>このページ</h3> <ul class="this-page-menu"> <li><a href="../_sources/user-guide/adv_merging.txt" rel="nofollow">ソースコードを表示</a></li> </ul> <div id="searchbox" style="display: none"> <h3>クイック検索</h3> <form class="search" action="../search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="検索" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> モジュール、クラス、または関数名を入力してください </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <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><a href="../index.html">目次 (2.6.0)</a> »</li> <li><a href="index.html" >Bazaarユーザーガイド</a> »</li> </ul> </div> <div class="footer"> © Copyright 2009-2011 Canonical Ltd. このドキュメントは <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3 で生成しました。 </div> </body> </html>