回答:
差分は、あるファイルと別のファイルを比較するよりも複雑になる場合があります。ディレクトリ階層全体を比較できます。GCCのバグを修正したい例を考えてみましょう。私の変更では、4つまたは5つのファイルに1行または2行を追加し、それらのファイルおよび他のファイルの少数の行を削除します。これらの変更を誰かに伝えたい場合、潜在的にGCCに含めるためのオプションは
ソースツリー全体をコピーするのは意味がありませんが、質問の核心となる他の2つのオプションについてはどうでしょう。ここで、他の誰かが私と同じファイルで作業しており、両方が誰かに変更を加えていると考えてください。この人は、私たちが何をしたか、そして変更が互換性がある(ファイルの異なる部分)か、競合する(ファイルの同じ行)かをどのように知るのでしょうか?彼はそれらを比較します!diffは、ファイルが互いに、また変更されていないソースファイルとどのように異なるかを彼に伝えることができます。diffが必要な場合は、最初にdiffを送信するだけの方が理にかなっています。diffには複数のファイルからの変更を含めることもできるため、合計9個のファイルを編集している間、それらの変更を説明する単一のdiffファイルを提供できます。
差分を使用して履歴を提供することもできます。3か月前の変更が原因でバグが発生した場合は、今日だけ発見しました。バグが導入されたときに絞り込み、特定の変更に切り分けることができる場合、差分を使用して変更を「元に戻す」または元に戻すことができます。これは、ファイルをコピーするだけなら簡単にできることではありません。
これはすべて、プログラムがファイルの履歴を作成時から今日までの一連の差分として記録するソースバージョン管理に関連しています。差分は履歴を提供し(特定の日にファイルを再作成できます)、何かを壊したことの責任者を確認できます(差分には所有者がいます)。多分彼らは私が多くのことをしたとき、ただ一つの変化に興味があるだけだろう。
要約すると、はい、cp
は、diff
およびよりも簡単ですが、およびpatch
のユーティリティはdiff
、ファイルの変更方法を追跡することが重要な状況patch
よりも優れcp
ています。
パッチを取得すると、頻繁に(まったく同じ行に変更を加えていない限り)自分で変更した一連のファイルにもパッチを適用できます。
パッチは古いの情報があると、ファイルの新しい状態を。コピーされたファイルを取得する場合、元のファイル(古い状態)がわからないため、変更したファイル(またはファイルのセット)に変更を適用することはできません。そのため、ソースファイルのセットでは、スペースの保存が主な関心事ではなく、前後の情報です。
(context / unified)diffの前は、これは多くの場合、エディタの指示(Xの後に行を挿入、Yの行を削除)で行われましたが、これらの指示が開始された状態を知っている場合にのみ機能します。したがって、コピーするだけで「ソリューション」と同じ問題が発生します。
diff -u
)は人間向けに設計された改良であり、通常のコンテキストdiff(diff -c
)よりも競合に対する堅牢性を高めるのに役立ちません。単純なdiff(diff
)でさえ、「これらの命令が開始された状態」を正確に知らなくても動作する場合が多い。それにもかかわらず、パッチファイルが複数のソースファイルに同時にパッチを適用する方法について話すことは、本当に赤いニシンだからです。
diffを使用している場合は、変更内容を正確に確認できます。そのため、diff / patchを使用することで、ファイル内の不要な変更をスリップさせないようにすることができます。
通常、ファイルに加えられる変更は、変更されるファイルよりもはるかに小さくなります。
つまり、差分を保存すると、多くのスペースを節約できます。diff
作成されたとき、ディスク容量は高価でした。
ただし、ファイルが他の方法で変更された場合でも、ファイルに差分を再適用できることも意味します。パッチユーティリティはあなたのためにそれを行うと問題がある場合を教えてくれます。
これは実際、ソフトウェア開発で差分を使用する最も重要な理由です。変更が行われた場合(通常は複数のファイルに対して)、差分として保存できます。結果は変更セットまたはパッチと呼ばれます。すべてが順調であれば、パッチは単なるarbitrary意的な変更ではなく、何らかの機能変更(バグ修正や新機能など)を実装します。
一方、異なる場所でも、異なる開発者によって異なる変更を加えることができます。同じファイルの同じ部分に変更が加えられていない場合は、個別に適用できます。したがって、開発者はテスト用にパッチを互いに送信できます。考えられる変更を表すパッチのセット全体を構築できます。これらの一部は最終的に拒否される可能性があり、残りはシステムに統合されます。
したがって、diffを使用すると、並行開発が可能になります。一度に1つの変更を行う必要はありません。
最新の分散バージョン管理システムは、この作業方法の継続です。
要するにできます。YouTubeでThinkg Big Larry Wallのビデオを視聴する場合、彼はdiff / patchがどのように開始され、どのような問題を解決したかについて話します。 。
ローカルシステムを使用していて、これらのことを気にしないcp
場合rsync
は、または大丈夫です。