cpを使用する方が簡単な場合にdiff / patchを使用する理由


19
diff -u file1.txt file2.txt > patchfile

patchfile1.txtをfile2.txtとまったく同じように変換するための命令で構成されるパッチファイルを作成します

cp代わりにコマンドを使用してこれを行うことはできませんか?これは、ファイルが大きすぎて、この方法で帯域幅を節約できるネットワーク経由で転送する必要がある場合に役立つと想像できます。他のシナリオで有利になるdiff / patchを使用する他の方法はありますか?

回答:


31

差分は、あるファイルと別のファイルを比較するよりも複雑になる場合があります。ディレクトリ階層全体を比較できます。GCCのバグを修正したい例を考えてみましょう。私の変更では、4つまたは5つのファイルに1行または2行を追加し、それらのファイルおよび他のファイルの少数の行を削除します。これらの変更を誰かに伝えたい場合、潜在的にGCCに含めるためのオプションは

  • ソースツリー全体をコピーする
  • 変更されたファイルのみをコピーします
  • 行った変更のみを提供する

ソースツリー全体をコピーするのは意味がありませんが、質問の核心となる他の2つのオプションについてはどうでしょう。ここで、他の誰かが私と同じファイルで作業しており、両方が誰かに変更を加えていると考えてください。この人は、私たちが何をしたか、そして変更が互換性がある(ファイルの異なる部分)か、競合する(ファイルの同じ行)かをどのように知るのでしょうか?彼はそれらを比較します!diffは、ファイルが互いに、また変更されていないソースファイルとどのように異なるかを彼に伝えることができます。diffが必要な場合は、最初にdiffを送信するだけの方が理にかなっています。diffには複数のファイルからの変更を含めることもできるため、合計9個のファイルを編集している間、それらの変更を説明する単一のdiffファイルを提供できます。

差分を使用して履歴を提供することもできます。3か月前の変更が原因でバグが発生した場合は、今日だけ発見しました。バグが導入されたときに絞り込み、特定の変更に切り分けることができる場合、差分を使用して変更を「元に戻す」または元に戻すことができます。これは、ファイルをコピーするだけなら簡単にできることではありません。

これはすべて、プログラムがファイルの履歴を作成時から今日までの一連の差分として記録するソースバージョン管理に関連しています。差分は履歴を提供し(特定の日にファイルを再作成できます)、何かを壊したことの責任者を確認できます(差分には所有者がいます)。多分彼らは私が多くのことをしたとき、ただ一つの変化に興味があるだけだろう。

要約すると、はい、cpは、diffおよびよりも簡単ですが、およびpatchのユーティリティはdiff、ファイルの変更方法を追跡することが重要な状況patchよりも優れcpています。


実際、gitは実際にファイル履歴を後続のコミットの差分として保存しません。各コミットがストアである場合、各ファイルのコンテンツ(「git show -s --pretty = raw」および「git ls-tree HEAD」を参照)。次に、このレイヤーの上で、さまざまなコミットで多くのファイルが類似するため、デルタ圧縮を使用してファイル間のデータを共有します(ただし、これは履歴に関連付けられていません)。
ysdx

ただし、差分はこの履歴にとって便利な視覚化ツールです。
ysdx

20

パッチを取得すると、頻繁に(まったく同じ行に変更を加えていない限り)自分で変更した一連のファイルにもパッチを適用できます。

パッチは古いの情報があると、ファイルの新しい状態を。コピーされたファイルを取得する場合、元のファイル(古い状態)がわからないため、変更したファイル(またはファイルのセット)に変更を適用することはできません。そのため、ソースファイルのセットでは、スペースの保存が主な関心事ではなく、前後の情報です。

(context / unified)diffの前は、これは多くの場合、エディタの指示(Xの後に行を挿入、Yの行を削除)で行われましたが、これらの指示が開始された状態を知っている場合にのみ機能します。したがって、コピーするだけで「ソリューション」と同じ問題が発生します。


2
パッチファイルを使用すると、元に戻したり、複数のファイルに一度に適用したりできます
-Gilsham

実際、統合されたdiff(diff -u)は人間向けに設計された改良であり、通常のコンテキストdiff(diff -c)よりも競合に対する堅牢性を高めるのに役立ちません。単純なdiff(diff)でさえ、「これらの命令が開始された状態」を正確に知らなくても動作する場合が多い。それにもかかわらず、パッチファイルが複数のソースファイルに同時にパッチを適用する方法について話すことは、本当に赤いニシンだからです。
セラダ

@celedaコンテキストdiffについては正しいです。それと通常のdiffの間には、主な違いがあります。コンテキストなしでは、パッチを逆に適用することは非常に困難です。
アントン

12

diffを使用している場合は、変更内容を正確に確認できます。そのため、diff / patchを使用することで、ファイル内の不要な変更をスリップさせないようにすることができます。


11

通常、ファイルに加えられる変更は、変更されるファイルよりもはるかに小さくなります。

つまり、差分を保存すると、多くのスペースを節約できます。diff作成されたとき、ディスク容量は高価でした。

ただし、ファイルが他の方法で変更された場合でも、ファイルに差分を再適用できることも意味します。パッチユーティリティはあなたのためにそれを行うと問題がある場合を教えてくれます。

これは実際、ソフトウェア開発で差分を使用する最も重要な理由です。変更が行われた場合(通常は複数のファイルに対して)、差分として保存できます。結果は変更セットまたはパッチと呼ばれます。すべてが順調であれば、パッチは単なるarbitrary意的な変更ではなく、何らかの機能変更(バグ修正や新機能など)を実装します。

一方、異なる場所でも、異なる開発者によって異なる変更を加えることができます。同じファイルの同じ部分に変更が加えられていない場合は、個別に適用できます。したがって、開発者はテスト用にパッチを互いに送信できます。考えられる変更を表すパッチのセット全体を構築できます。これらの一部は最終的に拒否される可能性があり、残りはシステムに統合されます。

したがって、diffを使用すると、並行開発が可能になります。一度に1つの変更を行う必要はありません。

最新の分散バージョン管理システムは、この作業方法の継続です。


1

要するにできます。YouTubeでThinkg Big Larry Wallのビデオを視聴する場合、彼はdiff / patchがどのように開始され、どのような問題を解決したかについて話します。 。

ローカルシステムを使用していて、これらのことを気にしないcp場合rsyncは、または大丈夫です。


PSKocikに感謝します。そのビデオへのリンクを共有してもらえますか?
toddlermenot

私は最後の声明に同意しません。最近の規模ではなく、開発プロセスを追跡して管理しやすくすることです。
reinierpost

@reinierpostはgitを使用して開発プロセスを追跡します。直接diff-patchしません。
PSkocik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.