<?xml version="1.0" encoding="UTF-8"?>
<article id="Intro_diffs">
  <title>ファイル比較とマージの概観</title>

  <para>ここでの主題は、WinMergeがどのようにして、テキストファイル中の
    差分を見つけ、また、表示するのかということ。
    そして、単純なファイルの比較とマージ操作のデモを行います。
    バイナリファイルに関する情報は、<xref linkend="Compare_bin" />を参照してください。</para>

  <section id="Intro_diffs_comparing">
    <title>ファイルの比較<indexterm>
        <primary>ファイルの比較</primary>

        <secondary>overview</secondary>
      </indexterm></title>

    <para>私たちは、ある方法で関連付られる二つのファイルを、いつも比較します。
      たとえば、別々の時間、または、別々の人によって編集された二つのバージョンのファイルなどです。
      そのような二つのファイルを検査すれば、いくつかの同じような領域と
      同様に、異なる文字と単語、異なる行、連続したテキストブロックの差分など、くつかの違いを見つけることができます。
      しかし、二つのファイル間のすべての差異を、お気に入りのエディタで調べることは、
      退屈で間違いを起こしやすいでしょう。
      WinMergeの様な、比較／マージに特化したツールは、
      この作業を体系的かつ効率的に
      行えるように設計されています。</para>

    <para>多くの人が使っている、スペルチェッカのような、シンプルな差分ユーティリティは、
    体系的な手段で文書の最後まで、辞書と異なる単語をハイライトし、
    スペル間違いを解決するのを助けます。
    しかしながら、文字と単語のみで見ることは、複数ファイル間の差異を理解するために
    効率的な方法ではありません。
    この理由で、多くの差分ユーティリティは比較の基本単位として、
    行を代わりに使用します。</para>

    <para>WinMergeも、比較の基本単位として、行を使用します。
    単語と文字は、比較とマージ操作の中では、個別には扱われません。
    例証するために、一行を除いて同一の二つのファイルを考えてください。
    一行が、異なる4単語を含む二つのバージョンで、一方のバージョンには、
    余分なスペースがある時、ファイルには5つではなく、
    1つの差異があると判断します。</para>

    <para>単語よりも、行比較の方が速い場合、
      一度に一行を比較する代わりに、単一の違いとして行全体を扱うことは、さらに有効です。
      あとで見るように、複数行の差分を見つけることは、
      マージにも効率的です。</para>

    <section>
      <title>単純なファイル操作</title>

      <para>このセクションは、二つのファイル間の差分を、
        WinMergeで行比較する方法の単純な例を述べています。</para>

      <orderedlist>
        <listitem>
          <para>テキストエディタを使って、ここに示す内容と名前の二つのファイルを、
            単語と改行に注意して正確に作成してください。
          </para>

          <formalpara>
            <title>File1:</title>

            <para><screen>It's slow comparing words 
and characters. Instead,  
WinMerge compares lines.
Believe it or else.</screen></para>
          </formalpara>

          <formalpara>
            <title>File2:</title>

            <para><screen>It's slow comparing words.
WinMerge compares lines.
Believe it or not.</screen></para>
          </formalpara>
        </listitem>

        <listitem>
          <para>WinMergeを起動してください。例えば、デスクトップの<inlinemediaobject>
              <imageobject>
                <imagedata contentwidth="32" fileref="screenshots/wm_icon.png" />
              </imageobject>

              <textobject>
                <phrase>WinMerge desktop shortcut</phrase>
              </textobject>
            </inlinemediaobject>WinMergeへのショートカットをダブルクリックしてください。</para>
        </listitem>

        <listitem>
          <para>ファイルとフォルダの選択ダイアログで、
            <filename>File1</filename>を<guilabel>1番目</guilabel>に、
          <filename>File2</filename>を<guilabel>2番目</guilabel>のファイルに指定し、
          <guibutton>比較</guibutton>をクリックしてください。このように、左と右のファイルペインに二つのファイルが開かれ、
          ファイル比較ウィンドウが表示されます。</para>

          <mediaobject>
            <imageobject>
              <imagedata contentwidth="600"
                         fileref="screenshots/missing_lines.png" />
            </imageobject>

            <textobject>
              <phrase>Compare Files screen shot</phrase>
            </textobject>
          </mediaobject>

          <para>この要素は、<xref linkend="Compare_files" />で、
            さらに詳細に説明されています。
            以下はこの例で注意すべきいくつかの点です。</para>

          <variablelist>
            <varlistentry>
              <term>差分の個数</term>

              <listitem>
                <para>このメッセージは、
                  WinMergeウィンドウ下部のステータスバーにあり、
                  2つの差分が見つかったことを説明しています。</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>異なった色</term>

              <listitem>
                <para>差分ブロックは異なる背景色でマークされます。
                  (デフォルトは、ゴールド)</para>

                <para>行差分は、単語背景色を使用して、
                  差分ブロック中の変更されたテキストをマークすることができます。
                  (デフォルトは、ライトイエロー)</para>

                <para>同じ行はマークされません。
                  これらは、例の3行目のような、白の背景色です。</para>
              </listitem>
            </varlistentry>

            <varlistentry>
              <term>空白行</term>

              <listitem>
                <para>左の比較ペインに注目してください。
                  2行目にはテキストがあります。
                  他方のペインは、同じ場所が灰色の空行になっています。
                  この空行は、<filename>File2</filename>ソースファイルには、存在しません。
                  WinMergeが何をしたのでしょう？</para>

                <para>WinMergeは、他方のバージョンにより多くの行が存在すると、
                  1行、または、それより多くの灰色の空行を、一方のバージョンに挿入します。
                これらの灰色の空行は、ソースファイル中の空行を表しているわけではありません。
                これらは、表示上のプレースホルダに過ぎません。
                プレースホルダ行の目的は、左と右のバージョンの差分を垂直に整列させることです。
                例で述べたように、
                <computeroutput>WinMerge compares lines</computeroutput>のテキストは、
                たとえソースファイル中では異なる行にあっても、
                比較ウィンドウには並んで表示されます。
                このことが、WinMergeでの差分比較を、
                従来のエディタより容易にさせています。</para>

                <tip>
                  <para>空行の一つの重要性は、たとえ、ソースファイルではそうでなくても、
                    ファイル比較ウィンドウの両方のペインには、
                    いつも同じ総行数が表示されていることです。</para>
                </tip>
              </listitem>
            </varlistentry>
          </variablelist>

          <para>WinMergeが、どのように差異を検出して、表示するかということを
            理解しているので、次のステップで示されるように、
            効率的な比較機能を使用できます。</para>
        </listitem>

        <listitem>
          <para>ツールバーにある、<inlinemediaobject>
              <imageobject>
                <imagedata contentdepth="15"
                           fileref="screenshots/currentdiff_btn.png" />
              </imageobject>

              <textobject>
                <phrase>現在の差異ボタン</phrase>
              </textobject>
            </inlinemediaobject> <guibutton>現在の差異</guibutton>をクリック
            (または、<keycombo>
              <keycap>Alt</keycap>

              <keycap>Enter</keycap>
            </keycombo>キーを押下)してください。このボタンが使えない(例えば、カーソルが違う行にある)時は、
            代わりに、<inlinemediaobject>
              <imageobject>
                <imagedata contentdepth="15"
                           fileref="screenshots/firstdiff_btn.png" />
              </imageobject>

              <textobject>
                <phrase>最初の差異ボタン</phrase>
              </textobject>
            </inlinemediaobject>最初の差異をクリック(または、<keycombo>
              <keycap>Alt</keycap>

              <keycap>Home</keycap>
            </keycombo>キーを押下)してください。</para>

          <para>差異を選択したら、Diffペインに二つのバージョンがロードされます。
            <!-- FIXME: こっから最後まで、何がいいたいのかわからん -->Diffペインで、どの行に差異が含まれているか確認し、残りのファイルから独立して、それらを調べることができます。
            この例では、違いの一つは明確で、二つの行を持っています。</para>

          <mediaobject>
            <imageobject>
              <imagedata contentwidth="588"
                         fileref="screenshots/filecomp_diffpane1.png" />
            </imageobject>

            <textobject>
              <phrase>Compare Files Diff Pane</phrase>
            </textobject>
          </mediaobject>
          <para></para>
        </listitem>

        <listitem>
          <para>ツールバーの、<inlinemediaobject>
              <imageobject>
                <imagedata contentdepth="15"
                           fileref="screenshots/nextdiff_btn.png" />
              </imageobject>

              <textobject>
                <phrase><!-- XXX: 訳注 原文では、Current Difference buttonとなっている -->次の差異ボタン</phrase>
              </textobject>
            </inlinemediaobject><guibutton>次の差異</guibutton>をクリック
            (または、<keycombo>
              <keycap>Alt</keycap>

              <keycap>Enter</keycap>
            </keycombo>キーを押下)してください。
            これは、同じ行(差異ではない)を飛び越し、
            最後の行を選択します。</para>

          <para><!-- FIXME: 全部イマイチ。意味不 -->ファイルの最後に到達し、すべての差異を検査するチャンスを得ることができました。
            これは、つまらない例です。ここに、ただ二つの差異があります。
            そして、WinMergeで、これらの差異を比較する方法が二つあります。
            しかしそれは、
            WinMergeナビゲーション・コントロールを使用することの有効性を証明しています。</para>
        </listitem>
      </orderedlist>
    </section>
  </section>

  <section id="Intro_diffs_merging">
    <title>ファイルのマージ<indexterm>
        <primary>差異のマージ</primary>

        <secondary>overview and example</secondary>
      </indexterm></title>

    <para>マージの目的は、二つのファイルの変更を一つのファイルへ結合することです。
    マージは、比較操作で使われる、概念と機能を拡張します。
    このセクションを始める前に、これまでのセクションを読んでください。
    さらに、二つのファイルバージョン間の差異を見つけ、差異を解決し、結果を一つの
    <glossterm>target</glossterm>バージョンに保存します。</para>

    <para>ファイルのマージは、同時開発を可能にし、それは、チーム環境の中でありふれたタスクです。
      例えば、あなたともう一人の人が、
      同時期に同じプログラムファイルにコードを追加したいとします。
    あなたは、両方ともファイルの同一のコピーからはじめます。
    しかし、開発中に、同一でない個別のバージョンを作成します。
    ある時点で、二つのバージョンは、
    それぞれの貢献者による変更を保ったまま、
    一つにマージされなければなりません。</para>

  <para>SubversionやGitのようなバージョン管理システムは、マージを
    促すことができます(または、開始させられます)。
    例えば、お使いのバージョン管理システムが、マージ・コンフリクトにより、リポジトリへのサブミットを妨害するかもしれません。
    あなたが自分のバージョンで作業中に、他の誰かが、同じファイルの異なるバージョンをチェックインして、
    バージョン管理システムが差分を自動マージできなかった場合、競合が発生します。
    競合が発生した場合、あなたのバージョンを提出する前に、
    競合しているバージョンをマージする必要があるかもしれません。
    多くのシステムには、差分とマージツールが統合されています。
    しかし、あなたは、代わりにWinMergeを使いたいかもしれません。
  </para>

  <para><!-- FIXME わからない -->Just as with comparing, you use WinMerge's toolbar controls (or
    keyboard shortcuts) to systematically step through the differences. Resolve
    each difference by copying either its left or right
    <glossterm>candidate</glossterm> to the other side. すべての差異を解決した時、
    WinMergeは、すべての差異が解決されたことを知らせ、
    マージ作業を完了します。</para>

    <section>
      <title>単純なマージ操作</title>

      <para><!-- TODO: イマイチ -->このちょっとした課題は、
        ファイル比較ウィンドウのコントロールを、
        先に示したシンプルなファイルを体系的にマージするために、どのように使用するかを示しています。</para>

      <orderedlist>
        <listitem>
          <para>ツールバーの、<inlinemediaobject>
              <imageobject>
                <imagedata contentdepth="15"
                           fileref="screenshots/currentdiff_btn.png" />
              </imageobject>

              <textobject>
                <phrase>Current Difference button</phrase>
              </textobject>
            </inlinemediaobject> <guibutton>現在の差異</guibutton>ボタンをクリックして、
            最初の差異を選択してください。このボタンが使えない場合、
            代わりに、<inlinemediaobject>
              <imageobject>
                <imagedata contentdepth="15"
                           fileref="screenshots/firstdiff_btn.png" />
              </imageobject>

              <textobject>
                <phrase>First Difference button</phrase>
              </textobject>
            </inlinemediaobject> <guibutton>最初の差異</guibutton>ボタンを
            クリックしてください。</para>
        </listitem>

        <listitem>
          <para><inlinemediaobject>
              <imageobject>
                <imagedata contentwidth="17"
                           fileref="screenshots/copyr_button.png" />
              </imageobject>

              <textobject>
                <phrase>Copy Right button</phrase>
              </textobject>
            </inlinemediaobject> <guibutton>右へコピー</guibutton>をクリックすると、
            <filename>File1</filename>から、<filename>File2</filename>へ、
            一つの差異がマージされます。
            <filename>File2</filename>の中の差分1行が、
            <filename>File1</filename>の2行で置き換えられ、
            灰色の空行が無くなっていることに注意してください。</para>
        </listitem>

        <listitem>
          <para><inlinemediaobject>
              <imageobject>
                <imagedata contentdepth="15"
                           fileref="screenshots/nextdiff_btn.png" />
              </imageobject>

              <textobject>
                <phrase>Next Difference button</phrase>
              </textobject>
            </inlinemediaobject> <guibutton>次の差異</guibutton>をクリックすると、
          2番目の差異を選択します。これは、差異を自分で発見して選択するより簡単です。
          そして、すべての差異を端から端まで難なく調べたいなら、特に便利です。</para>
        </listitem>

        <listitem>
          <para><inlinemediaobject>
              <imageobject>
                <imagedata contentwidth="17"
                           fileref="screenshots/copyl_button.png" />
              </imageobject>

              <textobject>
                <phrase>Copy Left button</phrase>
              </textobject>
            </inlinemediaobject> <guibutton>左へコピー</guibutton>
            をクリックすると、
            2番目の差異を、<filename>File2</filename>から、
          <filename>File1</filename>へマージします。</para>

          <para>マージが完了してファイルが同一になると、メッセージが表示されます。
          </para>

          <mediaobject>
            <imageobject>
              <imagedata contentwidth="600"
                         fileref="screenshots/filemerged1.png" format="PNG" />
            </imageobject>
          </mediaobject>
          <para></para>
        </listitem>

        <listitem>
          <para><guibutton>OK</guibutton>をクリックし、メッセージを閉じてください。
            差異のステータスが、
            <computeroutput>差異 1/1</computeroutput>から、
            <computeroutput>同一</computeroutput>に変わります</para>
        </listitem>

        <listitem>
          <para><keycombo>
              <keycap>Ctrl</keycap>

              <keycap>S</keycap>
            </keycombo>を押下して変更を保存してください。</para>
        </listitem>
      </orderedlist>

      <para>非常にシンプルであると同時に、
        この例のデモは、
        ある程度の比較をしたり差異をマージしたりする基本的な手順です。</para>
    </section>

    <section>
      <title>マージしたファイルの保存先を選択<indexterm>
          <primary>差異のマージ</primary>

          <secondary>result file</secondary>
        </indexterm><indexterm>
          <primary>result file, in merge</primary>
        </indexterm></title>

        <para>マージ結果が保たれるようにコントロールしてください。
          WinMergeのファイル比較ウィンドウには、幾つかのマージツールがそうであるように、
          分割された結果ペインがありません。 最も単純な方策は、片方、または、両方のソースファイルの変更を保存することです。
          <keycombo>
          <keycap>Ctrl</keycap>

          <keycap>S</keycap>
        </keycombo>を押下して、両方のファイルの変更を何度か保存してください。
      代わりに、<menuchoice>
          <guimenu>ファイル</guimenu>

          <!-- TODO: 「保存」->「左側を保存」とネストしているため
               オリジナルのXMLファイルと構成が違うが大丈夫か？
          -->
          <guimenuitem>保存</guimenuitem>
          <guimenuitem>左側のファイルを保存</guimenuitem>
        </menuchoice>、または、<menuchoice>
          <guimenu>ファイル</guimenu>

          <guimenuitem>保存</guimenuitem>
          <guimenuitem>右側のファイルを保存</guimenuitem>
        </menuchoice>をクリックして、片方のファイルを保存してください。</para>

      <para>どちらか一方のソースファイルの代わりに、別のファイルに書き込むには、
      <menuchoice>
          <guimenu>ファイル</guimenu>

          <guimenuitem>名前を付けて保存</guimenuitem>
        </menuchoice>を使用してください。例えば、ターゲットファイルが、バージョン管理システムによって作成された、
        差分ファイル、または、競合ファイルなどの場合です。</para>

      <para>同様に、WinMergeのコマンドラインで、<xref linkend="Command_line" />で説明されている、
        任意の<option>outputfile</option>引数を使用して、
        両方のソースファイルが変更されていない状態のままにしておくことができます。</para>
    </section>
  </section>
</article>
