فهرست

جست‌وجوی ابزارهاگزارش تغییرات

برای جابه‌جایی برای باز کردنمسئله را توضیح دهید، نه نام ابزار را

کوچک‌ترین ویرایش‌های خطی را ببینید، سپس پچ را با خود ببرید

دو متن کوتاه را خط‌به‌خط مقایسه کنید، یک کمینه‌اسکریپت ویرایش قطعی را بررسی کنید و یک پچ یکپارچه با محدوده‌های دقیق، زمینهٔ انتخاب‌شده و نشانگرهای صریح نبودِ خط‌نوی پایانی دانلود کنید.

سمت چپ مقایسه. خط‌نوهای CRLF و CR پیش از مقایسهٔ خطوط به LF یکسان‌سازی می‌شوند.

سمت راست. یک خط تغییریافته به‌صورت یک حذف و یک افزودن نشان داده می‌شود، همان‌طور که دیف یکپارچه ایجاب می‌کند.

خطوط بدون تغییری که پیرامون هر ویرایش نشان داده می‌شوند. ویرایش‌های نزدیک به هم، وقتی زمینه‌شان هم‌پوشانی داشته باشد، ادغام می‌شوند.

خلاصهٔ تغییرات
۲ خط افزوده و ۲ خط حذف شد
خطوط اضافه‌شده
۲
خطوط حذف‌شده
۲
خطوط بدون تغییر
۱۰
قطعه‌های تغییر
۲

پچ دیف یکپارچه

document.txt.patch · ۱۶۷ B

یک پچ استاندارد --- / +++ با محدوده‌های @@، زمینهٔ انتخاب‌شده و نشانگرهای صریح نبودِ خط‌نوی پایانی.

اسکریپت کامل ویرایش خطی

بدون تغییر11alpha
حذف‌شده2beta
اضافه‌شده2beta revised
بدون تغییر33line 03
بدون تغییر44line 04
بدون تغییر55line 05
بدون تغییر66line 06
بدون تغییر77line 07
بدون تغییر88line 08
بدون تغییر99line 09
بدون تغییر1010line 10
بدون تغییر1111line 11
حذف‌شده12delta
اضافه‌شده12epsilon

چگونگی کار

مدل ویرایش

هر سند به دنباله‌ای مرتب از خطوط منطقی تبدیل می‌شود. جداکننده‌های CRLF، CR قدیمی و LF یک مرز واحد در نظر گرفته می‌شوند، اما وجود آخرین خط‌نو حفظ می‌شود. همین تمایز است که اجازه می‌دهد افزودن یک خط‌نوی پایانی نمایش داده شود، حتی وقتی نویسه‌های قابل‌مشاهدهٔ آن خط تغییر نمی‌کنند.

ماتریس طولانی‌ترین زیردنبالهٔ مشترک، بزرگ‌ترین مجموعهٔ مرتب از خطوط کاملی را پیدا می‌کند که بین هر دو طرف مشترک است. هرچه بیرون از آن دنبالهٔ مشترک باشد، یا حذفی از متن اصلی است یا درجی در متن اصلاح‌شده. انتخاب طولانی‌ترین زیردنبالهٔ مشترک، تعداد کل این عملیات ویرایش را به کمینه می‌رساند.

تکرار خطوط یکسان می‌تواند چند پاسخ به یک اندازه کوتاه پدید آورد. این ابزار چنین برابری‌هایی را در یک جهت مستند می‌شکند — حذف پیش از درج — بنابراین ورودی‌های یکسان همیشه همان پچ را تولید می‌کنند.

مقایسهٔ کارشده

متن اصلی:

alpha
beta
gamma
delta

متن اصلاح‌شده:

alpha
beta revised
gamma
epsilon

alpha و gamma دو خط بدون تغییر هستند. دو خط دیگر متن اصلی حذف می‌شوند و نسخهٔ اصلاح‌شدهٔ آن‌ها اضافه می‌شود، که ۲ خط اضافه‌شده، ۲ خط حذف‌شده، ۲ خط بدون تغییر و — با سه خط زمینه — ۱ قطعه به دست می‌دهد:

--- a/document.txt
+++ b/document.txt
@@ -1,4 +1,4 @@
 alpha
-beta
+beta revised
 gamma
-delta
+epsilon

بلوک کد بالا عمداً از همان سرآیند دو خطی و دستور زبان محدوده‌ای استفاده می‌کند که فایل خروجی به کار می‌برد. تعداد یک فقط با نقطهٔ شروعش نوشته می‌شود؛ تعدادهای دیگر به‌صورت start,count می‌آیند. بنابراین درج در یک فایل خالی با محدودهٔ قدیمی 0,0 شروع می‌شود.

زمینه بسته‌بندی را تغییر می‌دهد، نه پاسخ را

با سه خط زمینه، خط بدون تغییر gamma بین هر دو جایگزینی قرار می‌گیرد و آن‌ها در یک قطعه شریک می‌شوند. با زمینهٔ صفر، آن خط بدون تغییر حذف می‌شود و دو ناحیهٔ جایگزینی به دو قطعهٔ فشرده تبدیل می‌شوند. جدول ویرایش در هر دو حالت همچنان دنبالهٔ کامل را فهرست می‌کند.

پیش‌فرض GNU Diffutils سه خط است، چون زمینه به برنامهٔ پچ کمک می‌کند پس از جابه‌جایی خطوط نزدیک، محل ویرایش را پیدا کند. خروجی با زمینهٔ صفر برای یک بازبینی فشرده معتبر و مفید است، اما شواهد کمتری دربارهٔ جایی که مصرف‌کنندهٔ بعدی باید آن را اعمال کند به همراه دارد.

این یک مقایسهٔ متنی دوطرفه است، نه یک ادغام معنایی. از سازندهٔ فهرست مطالب مارک‌داون برای تولید یک سند استفاده کنید، سپس وقتی می‌خواهید هر لنگر و خط ناوبری درج‌شده را بررسی کنید، آن نتیجه را در اینجا مقایسه کنید.

مراحل انجام کار

  1. خط‌نوهای CRLF و CR تنها را به LF یکسان‌سازی کنید و ثبت کنید که آیا آخرین خط منطقی هر سند خط‌نوی پایانی دارد یا نه.
  2. یک ماتریس طولانی‌ترین زیردنبالهٔ مشترک را روی متن کامل هر خط به‌علاوهٔ وضعیت پایان آن بسازید و هرگاه چند اسکریپت کمینه برابر باشند، حذف را بر درج مقدم بدارید.
  3. هر ویرایش را به اندازهٔ تعداد درخواستی خطوط زمینهٔ بدون تغییر گسترش دهید و محدوده‌هایی را که به هم می‌رسند یا هم‌پوشانی دارند در قطعه‌های دیف یکپارچه ادغام کنید.
  4. برچسب‌های پاک‌سازی‌شدهٔ --- و +++، محدوده‌های دقیق @@ به‌صورت شروع,تعداد و پیشوندهای فاصله، منها یا به‌علاوه را در یک پچ قابل دانلود بنویسید.

فرض‌ها

  • مقایسه خطی است و پس از یکسان‌سازی خط‌نو دقیق انجام می‌شود؛ تفاوت‌های فضای خالی، بزرگی و کوچکی حروف و نرمال‌سازی یونیکد نادیده گرفته نمی‌شوند.
  • هر طرف به ۲۰۰۰ نویسه محدود است تا ماتریس درجه‌دوم طولانی‌ترین زیردنبالهٔ مشترک در مرورگر محدود بماند.
  • ممکن است بیش از یک کمینه‌اسکریپت ویرایش وجود داشته باشد. تقدم حذف در برابری‌ها این خروجی را تکرارپذیر می‌کند، اما از نظر ریاضی یگانه و ممتاز نیست.
  • پچی که از نظر نحوی درست است همچنان می‌تواند روی فایل سومی که محتوای پیرامونش تغییر کرده شکست بخورد؛ این ابزار پچ‌ها را اعمال یا ادغام نمی‌کند.

پرسش‌های رایج

چرا یک خط تغییریافته به‌صورت یک حذف و یک افزودن نشان داده می‌شود؟

دیف یکپارچه رکوردهای خط زمینه، خط حذف‌شده و خط اضافه‌شده دارد، نه یک رکورد جایگزینی جداگانه. بنابراین یک جایگزینی، خط کامل قدیمی را حذف و خط جدید را اضافه می‌کند.

خطوط زمینه چه چیزی را تغییر می‌دهند؟

آن‌ها مقدار محتوای بدون تغییر پیرامون یک ویرایش و این را که آیا نواحی نزدیک به هم در یک قطعه ادغام می‌شوند تغییر می‌دهند. افزوده‌ها، حذف‌ها یا کمینه‌اسکریپت ویرایش زیربنایی را تغییر نمی‌دهند.

آیا تفاوت در خط‌نوی پایانی به حساب می‌آید؟

بله. فایل متنی‌ای که به `same` ختم می‌شود از نظر بایتی با فایلی که به `same` به‌علاوهٔ یک خط‌نو ختم می‌شود برابر نیست، بنابراین پچ نشانگر صریح متعارف را برای خط ناقص می‌نویسد.

آیا پچ می‌تواند مسیر یک پوشهٔ محلی را فاش کند؟

برچسب به آخرین جزء مسیرش کاهش می‌یابد و نویسه‌های کنترلی حذف می‌شوند. سرآیندها فقط از `a/label` و `b/label` استفاده می‌کنند، بدون مسیر دستگاه یا مهر زمانی.

منابع

  • Comparing and Merging Files — GNU Diffutils 3.12Free Software Foundationبررسی‌شده در مربوط به سرآیندهای یکپارچه، قطعه‌ها، محدوده‌ها، زمینه و خطوط ناقص
  • diff — compare two filesThe Open Groupبررسی‌شده در مربوط به مقایسهٔ خطی و اصطلاحات قابل‌حمل diff