パッチ用のテキスト ファイルの比較

パッチ ファイルは、1 つまたは複数のファイルに対して提案された一連の変更点を共有するための、コンパクトで便利な方法を提供します。Merge には標準の 2 者間テキスト比較の変形が用意されており、パッチ ファイルで記述された変更点を確認し、それらの変更点を選択的にテキスト ファイルへ適用するための柔軟なツールキットを提供しています。

Merge は、一般的に使用される git diffgit format-patchhg diffdiff -u などのツールで作成された、テキスト ベースのパッチ ファイルをサポートしています。また、ユニファイド形式の diff ファイルでも動作します。この diff ファイルは、Merge 自体で作成されたものでも、他のツールで作成されたものでも対象となります。Merge は現在のところ、バイナリ アプリケーションのパッチ、ファイルの名前変更、ファイル属性(アクセス制御)の変更をサポートしていません。

パッチを適用するファイルは、パッチの作成元となった元のファイルと同じである必要はありません。Merge はさまざまな技術を駆使して、パッチ ファイル内の各ハンクにとって最適と考えられる位置を決定します。

Merge で提供されるパッチ ツールの典型的な使い方は、パッチを元の(パッチが当てられていない)ファイルに適用することです。しかしながら、このツールは、パッチが適用されたテキスト ファイルから開始し、パッチで記述された変更点を選択的に削除して遡って作業できる、十分に包括的なツールです。

パッチ用のテキスト比較を開く

パッチ用の新しいテキスト比較を開くには:

  • リボンの左端の項目のドロップダウン メニューにある パッチ用の新規テキスト比較 項目を選択します。
  • Ctrl+Shift+Alt+T キーを押します。

次のスクリーンショットは空のパッチ用の新規テキスト比較タブを示します。

パッチ用の新規テキスト比較タブ

表示の上部は通常の 2 者間テキスト比較のように見えますが、左右の比較パネルのラベルはそれぞれ、提案になっています。

2 者間テキスト比較と同様に、パッチを適用するファイルを(左)パネルに通常の方法で読み込みます。通常のテキスト比較と異なるのは、下のスクリーンショットに示されるように、提案(右)ペインにもファイルが自動的に読み込まれることです。

パッチを適用するファイルが左右両方のパネルで開かれる

Information ファイルが 2 番目のペインに自動読み込みされるのは、空のパッチ用テキスト比較ビューでファイルを最初に開いたときのみです。その後、必要に応じて、提案ペインで別のファイルを開くことができます。

Merge のパッチ ツールは、主に提案ファイルについて作業するという想定で設計されています。当該ファイルにパッチ(およびファイルに加えたいその他の編集内容)を適用し、その作業の一部始終を(パッチを適用中のファイルの、修正されていないバージョン)と比較できます。ただし、Merge には、変更点を元のファイルに適用するためのツールも用意されており、両方のファイルが完全に編集可能であることに留意してください。したがって、自分に合った方法で作業できます。

Information テキスト比較の前後関係を示す n 行だけを表示するオプションは、ファイルおよび提案ファイルには適用されません。これは、通常、両方のファイルは同じ内容から始まり、パッチ ハンクを適用する位置(下記参照)が表示される必要があるためです。また、元ファイルと提案ファイルは通常、同じファイルから開かれているため、これらのファイルに対する外部の変更を監視する機能は無効になります。

パッチ ファイルを開く

パッチを適用するテキスト ファイルを開いたら、次のステップはパッチ ファイルを開くことです。これを行うには 3 つの方法があります。

  • パッチ用テキスト比較タブの下部にある 3 つのペインのうちの左端ペインに、パッチ ファイルをドラッグ アンド ドロップします。
  • 下部の左端ペインのすぐ上にあるツールバーのパッチ ファイルを開く… 項目を使用して、パッチ ファイルを参照します。
  • パッチ ファイルの内容をクリップボードにコピーし(パッチが電子メールで送信されてきた場合など)、次にツールバーのパッチ ファイルを開く… 項目のドロップダウン メニューからクリップボードからパッチ ファイルを開く(貼り付ける)項目を選択します。

単一のパッチ ファイルに、さまざまなファイルのパッチが含まれている可能性があります。このようなパッチ ファイルを開いた場合は、使用するパッチを選択するように求められます。可能であれば、Merge により、パネルと提案パネルに読み込まれたファイルの名前を基に、最も可能性の高いパッチが事前に選択されます。一般に、パッチ ファイル自体を開く前に、パッチを適用するファイルを開く方が望ましいため、この自動の事前選択が行われます。しかし、最初にパッチ ファイルを開きたいのであれば、開いてもかまいません。

複数のパッチを含むファイルから 1 つのパッチを開くには、 パッチ ファイルを開く… ツールバー メニューの パッチを選択… 項目を使用すれば、パッチ ファイルを開き直すことなく、個別にパッチを選択することができます。

ハンク

ハンクについて

パッチ ファイルで記述された個々の変更点は、それぞれハンクと呼ばれます。下のスクリーンショットに示されるように、パッチ ファイルを開くと、そのパッチ ファイルに含まれる各ハンクのリストが下部の左端ペインに表示されます。

パッチ ファイルを開いた後に表示されるパッチ ハンクのリスト

各ハンクのラベルは、2 つの数字のペアで構成されています。これらの数字は、パッチの作成元となったベース(元のパッチ)ファイルと修正された(提案されたパッチ)ファイル内の行を参照引用しています。

上のスクリーンショットで、選択されているパッチ ハンクのラベルは -829,9 +533,11 となっています。つまり、このハンクは、パッチの作成元となったベース ファイルの 829 行目から 9 行(コンテキストの行を含む)と修正されたファイルの 533 行目から 11 行を表しているということです。

パッチを適用しようとしているファイルは、パッチの作成に使用されたベース ファイルと異なることがあります。ハンク ラベルの行番号は単なる指標にすぎません。これらは、ファイルや提案ファイルにおけるハンクの実際の位置を必ずしも示しているとは限りません。

ハンクのプレビュー

ハンク リストから単一のパッチ ハンクが選択された場合、そのリストの右にある 2 つの(下部)ペインは、選択されたハンクの元の内容と提案内容の間の相違を示す、テキスト比較を表示します。つまり、この比較は、パッチの作成元となった元のファイルと提案ファイルの関連する内容を示しています。ハンク比較の 2 つのパネルはそれぞれ、元のパッチ ハンク提案されたパッチ ハンクとしてラベル付けされています。

Information ハンクが最初に選択されたとき、当初はパッチ ファイルによって提供される比較データから、リンク線を位置決めし、そのハンクのテキスト比較表示に対する強調表示を決定します。また、Merge はハンク内容のバックグラウンド テキスト比較を開始します。その結果は利用可能になれば、表示を更新したり、(テキスト比較のオプション設定に応じて)単語ベースまたは文字ベースで変更を強調表示したりするために使用されます。ハンクが再度表示される場合に備えて、テキスト比較の結果はキャッシュされます。

各ハンクの元の内容は、通常、パッチを適用するファイル内のどこかに少なくともある程度は存在します。単一のハンクが選択された場合、ファイルと提案ファイルは、ハンクに一致する場所が見えるようにスクロールされ、その該当場所は淡い青のオーバーレイで強調表示されます。オーバーレイは、選択されたハンクがいずれかのファイルに適用された場合に、どの行が置き換えられるかを示します。

ハンク リストで複数のハンクが選択されている、またはオンになっている場合、それらのハンクに一致するファイルおよび提案ファイル内の位置は、薄いグレーの背景色で強調表示されます。複数のハンクが選択されている場合、ハンク内容のテキスト比較は表示されません。

まれに、自動的に決定されたハンクの位置が他のハンクと重なっている場合もあります。ハンクの位置を手動で調整する(下記参照)ことにより、重なりを引き起こす可能性もあります。このような場合、ファイルおよび提案ファイル内の重なっているハンクのオーバーレイは、ピンク色に変わります。

適切なハンクの位置を自動的に検出する方法

ハンクで記述された変更点が、パッチを適用するファイル内の正しい位置に適用されるよう、そのファイルにおける各ハンクの内容の正しい位置を決定することは不可欠です。

そのため、パッチ ファイルが最初に読み込まれたときに Merge はバックグラウンドで作業して、各ハンクの元の内容がファイルおよび提案ファイル内にあるのであれば、その最も可能性の高い位置を決定します。通常、この処理は迅速です。ただし、パッチを適用するファイルが、パッチの作成に使用されたファイルと異なる場合には、時間がかかることがあります。

Information ハンクの位置を探している間、ステータス バーに進捗状況のインジケーターが表示されます。この位置決めの処理をキャンセルする(たとえば、時間がかかりすぎている場合)には、ファイルまたは提案ファイルのいずれかのパネルをクリックし、その後リボンにある比較の中止 ボタンをクリックします。

パッチ ファイル内に含まれる行番号は、パッチを適用するファイルと一致していない可能性があるため、Merge はこの行番号を、変更点の位置を検索する場合の開始地点としてのみ使用します。検索は、パッチ ファイルによって示される関連する行番号から始め、一致が見つかるまで上下方向へ同時に働きます。

Merge はいくつかの戦略を用いて、ファイル内のハンクの位置の検出を試みます。

  1. 最初に、提案ファイル内でハンクの内容の完全一致を探します。この検索は迅速に行われます。
  2. 完全一致が見つからない場合、Merge は大文字小文字の違いや空白の数の違いを無視して、不正確な一致を探します。この検索もまた、迅速に行われます。
  3. 一致がまだ見つからない場合、Merge は最後に、入手できる最適な一致を探します。可能性として、パッチ ハンクの内容とファイルならびに提案ファイルの内容との間における、かなりの違い(最大 50%)を許容します。Merge は、使用可能な CPU コアを最大限活用しようと努めますが、この処理は比較的遅くなる可能性があります。

ハンクの位置の一致が見つかると、ハンク リスト内の該当ハンクの隣に信頼度インジケーター アイコンが表示されます。このアイコンは、ハンクの内容と検索対象のファイルの内容との対応度に基づいて、位置の一致の品質を表します。信頼度 0% は一致が見つからなかったことを示すのに対し、信頼度 100% は完全一致が見つかったことを示します。間の値(10% 90% )は、近似の程度が異なる適切な一致を示します。自身と Merge のどちらもまだハンクを検索しようとしていない場合は、信頼度インジケーターの代わりに が表示されます。

Information パッチの位置決め処理は多段式であるため、はじめは信頼度が低くても、その後、別の戦略を使用して追加の作業が実行されるにつれて、信頼度が高まる可能性があります。

手動によるハンクの位置の検出と調整

場合によっては、特定のハンクで使用される検索戦略を選択したいと思われるかもしれません。たとえば、適用する変更点について確実性を必要とし、そのために完全一致のみを検索したい場合があります。

または、Merge にハンクの元の内容ではなく提案された内容を検索させたいと思われるかもしれません。これは、既にパッチが適用されたファイルから、1 つまたは複数のパッチ ハンクの変更点を削除しようとしている場合などに起こることがあります。

上記のシナリオ、およびその他のシナリオには、提案ファイルでパッチの位置の手動検索を開始することにより応じられます。

  1. 最初に、位置を検索したいハンクを選択します。(標準の Windows リスト コントロールと同様に、選択範囲を項目の範囲に拡張するには、Shift キーを押しながらクリックします。複数の項目を選択するには、Ctrl キーを押しながらクリックします。すべての項目を選択するには、リストをクリックしてから Ctrl+A キーを押します。)
  2. 次に、ハンク リストの上にあるツールバーの ドロップダウン メニューから目的の検索コマンドを選択します。

Merge は要求された方法でハンクの検索を試み、作業が進むにつれて、選択されたハンクの信頼度アイコンを更新します。

ハンクの位置を決定できなかった場合(たとえば、要求された完全一致を見つけられなかった場合)、そのハンクには信頼度インジケーターの代わりに アイコンが表示されます。そのハンクの位置は、後で調整しない限り、パッチ ファイルで指定された位置(つまり、ハンクのラベルに示されている行の範囲)であると判断されます。

上記のように、ハンク リストで選択されている、またはオンになっているハンクの一致した位置は、ファイルおよび提案ファイルでは、関連する行をおおう灰色または青色のオーバーレイで示されます。必要に応じて、オーバーレイの上端と下端にある矢印を上または下へドラッグすることにより、この位置を手動で調整することができます。Shift キーを押しながらドラッグすると、オーバーレイが上下にスライドします。下のスクリーンショットは、右パネルの位置オーバーレイの下端が移動される様子を示しています。

位置オーバーレイの下端の移動

ハンクの適用および編集

1 つまたは複数のハンクの適用

通常は、各ハンクで記述された変更点を提案ファイルに適用したいと思われるでしょう。しかしながら、Merge はファイルにハンクを適用する機能も提供しています。

Merge は、ハンクをさまざまな方法で確認して適用できるよう、また、目的を果たそうとしているどんな要求にも適合できるように柔軟性を備えています。たとえば、次のことが行えます。

  • 各ハンクを 1 つずつ順番に確認し、適用する。
  • ハンク リストで適用したいハンクのチェック ボックスをオンにして、複数のハンクを確認する。確認が終わったら、オンにしたハンクを 1 回で提案ファイルまたはファイルに適用する。
  • ハンク リストで複数のハンクを選択(選択範囲を項目の範囲に拡張するには Shift キーを押しながらクリック、複数の項目を選択するには Ctrl キーを押しながらクリック)し、選択したハンクを 1 回で適用する。
  • パッチ ハンクをオンにします。 ツールバー メニューの項目を使用して、ハンク リストの中で特定の条件を満たすハンクのチェックをオンにし、該当するハンクを 1 回で適用する。
  • 上記のいくつかを組み合わせて使用する。

個々のハンクを提案ファイルに適用するには、まず、ハンク リストでハンクを選択します。次に、提案されたパッチ ハンク ペインの上にある選択されたハンクを適用ボタンをクリックして、そのペインの内容を適用します。または、元のパッチ ハンク ペインの上にあるツール バーの選択されたハンクを適用ボタンをクリックすれば、そのペインの内容を提案ファイルに適用できます。

ハンクの元の内容または提案内容をファイルに適用する場合は、対応する選択されたハンクを適用ツールバー ボタンのドロップダウン メニューを使用して、選択されたハンクの元の内容を元のファイルに適用または選択されたハンクの提案内容を元のファイルに適用項目を選択します。

ハンクを適用すると、提案(または、選択した操作に応じて)ファイルが更新されます。それに応じて、提案ファイルとファイルの比較も更新されます。その後、このハンクはハンク リスト内で解決済みとしてマークされます(取り消し線が引かれ、灰色で表示されます)。

選択されたパッチ ハンクを解決済みとしてマークします。 ツールバー ボタンを使用して、選択されているハンクの解決済み状態を切り替えることができます。ハンクを解決済みとしてマークすることは、ハンクの確認の進捗状況を記録するのに役立ちます。

選択されたハンクを適用したら、ツールバー ボタンの次のパッチ ハンク または前のパッチ ハンク を使用して、ハンク リスト内の次のハンクまたは前のハンクにすばやく移動できます。

一度に複数の選択されたハンクを適用するには、ハンク リストでハンクを選択してから、単一の選択されたハンクを適用するときとまったく同じように作業を進めます。チェックがオンになっている複数のハンクを適用するには、オンにしたハンクを適用ツールバー ボタンまたはそのドロップダウン メニュー項目を使用します。または、ハンク リストの上にあるツールバーのオンにしたパッチ ハンクを適用します。 ドロップダウン メニューを使用します。

適用を元に戻す

ハンクの適用を解除するのは、適用するのと同じくらい簡単です。そのため、ハンクの最初の適用をプレビューとして扱い、パッチを適用するファイルの内容の中にハンクの変更点がどのように現れるかを見ることができます。

ハンクを適用した結果が気に入らない場合は、適用解除 ツールバー ボタンを使用して、変更点を元に戻すことができます。また、修正されたファイルをクリックし、Ctrl+Z キーを押して変更点を元に戻したり、メイン リボンの元に戻す コマンドとやり直し コマンドを使用して、変更点を元に戻したりやり直したりすることもできます。

Information 適用解除 ボタンは、ハンクの適用後にファイルまたは提案ファイルを編集すると、無効になります。それらの編集が最初に取り消された場合、ボタンは再度有効になります。

行終端文字

行終端文字は、ハンクが適用されるときに自動的に変換されます。修正されたファイル内の主要な行終端文字が使用されます。

編集

パッチ用テキスト比較タブ内のすべてのファイル比較ペインでは、編集が可能です。そのため、たとえば、ハンクを適用する前に、軽微な修正をハンクに加えることができます。または、特定のハンクを適用する前に提案ファイルを編集したり、ハンクを適用した後にインデントやその他の書式を調整したりすることができます。

ハンクの一部分のみを適用した方が好ましい場合があります。これは、コピー Ctrl+C)を使用して、ハンクのプレビューの比較から選択されているハンクの内容をコピーし、貼り付け Ctrl+V)を使用して、それを提案(または)ファイルに貼り付けることにより実現できます。

提案ファイルの中で、ハンクの位置を正しく確定できなかった場合には、ハンクのオーバーレイの位置を手動で調整するよりも、コピー 貼り付け を使用する方が、そのハンクを適用する早道かもしれません。

パッチが適用されたファイルの保存

目的のハンクが提案(または)ファイルに適用されたら、修正されたファイルを通常の方法で保存することができます。また、ときおり途中経過を保存することをお勧めします。

複数のパッチの適用

1 つのパッチ ファイルのハンクが正常に適用されたら、さらにパッチ ファイルを次々と開き、確認して適用することができます。(パッチ ファイルを開くためのさまざまな方法については、パッチ ファイルを開くを参照してください。)