ابزار رایگان · بدون ثبت‌نام

فقط در مرورگر شما؛ چیزی ارسال نمی‌شود

مقایسهٔ متن آنلاین (Diff) خط‌به‌خط و کلمه‌به‌کلمه

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

دقت مقایسه
نحوهٔ نمایش

کلید Esc کادر فعال را پاک می‌کند. متن‌ها از مرورگر شما خارج نمی‌شوند.

نتیجهٔ مقایسه

در حال مقایسه…

دو متن یکسان‌اند؛ هیچ تفاوتی پیدا نشد.

دو متن را در کادرهای بالا بچسبانید؛ نتیجه همزمان با تایپ همین‌جا ظاهر می‌شود.

راهنمای کامل

راهنمای کامل مقایسهٔ متن و فایل با Diff

هر مدیر سرور دست‌کم یک بار با این سؤال روبه‌رو شده که «از دیروز تا امروز در این فایل چه چیزی عوض شد؟». سرویسی که بعد از به‌روزرسانی بالا نمی‌آید، تنظیماتی که روی سرور دوم رفتار متفاوتی دارد یا فایلی که همکار ویرایش کرده و یادش نیست کجا را. Diff جواب همهٔ این‌هاست. این راهنما توضیح می‌دهد خروجی Diff را چطور بخوانید، این ابزار چه کارهایی انجام می‌دهد و چه کارهایی نه، و معادل‌های قدرتمندتر آن در خط فرمان لینوکس و Git کدام‌اند.

۱۰ بخش حدود ۹ دقیقه مطالعه

فهرست مطالب

Diff چیست و چطور تفاوت دو متن را پیدا می‌کند؟

Diff روشی برای پیدا کردن کوتاه‌ترین فهرست تغییرات است که یک متن را به متن دیگر تبدیل می‌کند. پایهٔ آن «طولانی‌ترین زیردنبالهٔ مشترک» یا LCS است: بیشترین تعداد خطوطی که در هر دو نسخه با همان ترتیب وجود دارند پیدا می‌شود و هر چیزی بیرون از این اسکلت مشترک، حذف یا اضافه علامت می‌خورد. این ابزار از الگوریتم مایرز استفاده می‌کند؛ همان الگوریتمی که git diff به‌طور پیش‌فرض به کار می‌برد و برای متن‌هایی با چند ده هزار خط و تغییرات معمولی در کسری از ثانیه نتیجه می‌دهد.

نتیجه به شکل «diff یکپارچه» نمایش داده می‌شود؛ همان قالبی که در Git و دستور diff -u می‌بینید. خطوطی که فقط در نسخهٔ قدیمی بوده‌اند با علامت منفی و پس‌زمینهٔ قرمز، خطوطی که فقط در نسخهٔ جدید آمده‌اند با علامت مثبت و پس‌زمینهٔ سبز، و خطوط مشترک بدون علامت نشان داده می‌شوند. یک خط ویرایش‌شده در Diff خطی به شکل یک حذف و یک اضافه دیده می‌شود؛ این ابزار علاوه بر آن، کلمه‌هایی را که داخل همان خط عوض شده‌اند پررنگ‌تر نشان می‌دهد تا لازم نباشد دو خط بلند را با چشم مقایسه کنید.

کار با ابزار مقایسهٔ متن در چهار قدم

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

بالای کادرها دو انتخاب دارید: «خط‌به‌خط» برای فایل تنظیمات و کد، و «کلمه‌به‌کلمه» برای متن فارسی، قرارداد یا مستندات که در آن پاراگراف‌ها طولانی‌اند. نمایش خط‌به‌خط می‌تواند یکپارچه یا دوستونه باشد. سه گزینهٔ دیگر هم هست: نادیده گرفتن فاصله‌ها، یکسان دانستن حروف بزرگ و کوچک، و جمع کردن خطوط بدون تغییر تا فقط تغییرات و سه خط اطرافشان دیده شود؛ با کلیک روی ردیف جمع‌شده، خطوط پنهان دویست‌تا دویست‌تا باز می‌شوند.

هر طرف تا حدود دو میلیون نویسه، یعنی ده‌ها هزار خط، پذیرفته می‌شود و برای متن‌های بزرگ مقایسه چند صدم ثانیه پس از توقف تایپ اجرا می‌شود. اگر دو متن آن‌قدر متفاوت باشند که مقایسهٔ دقیق زمان زیادی بگیرد، ابزار به‌جای قفل کردن مرورگر، بخش تغییرکرده را یکجا حذف و اضافه نشان می‌دهد و هشدار می‌دهد. با دکمهٔ «کپی به‌صورت patch» خروجی را در قالب diff -u بردارید.

  • نسخهٔ قدیمی فایل را در کادر «نسخهٔ قدیمی» بچسبانید.
  • نسخهٔ جدید را در کادر «نسخهٔ جدید» بچسبانید.
  • حالت خط‌به‌خط یا کلمه‌به‌کلمه و در صورت نیاز نادیده گرفتن فاصله‌ها را انتخاب کنید.
  • شمارنده‌های اضافه، حذف و بدون تغییر را بررسی کنید.
  • خطوط سبز و قرمز و کلمه‌های پررنگ را مرور کنید و در صورت نیاز patch را کپی کنید.

بازگشت به فهرست مطالب

خواندن خروجی Diff و تفسیر درست تغییرات

نمونهٔ پیش‌فرض ابزار را در نظر بگیرید: دو نسخه از بلوک server یک سایت در Nginx. در نسخهٔ جدید پورت ۸۰ به ۴۴۳ با ssl تغییر کرده، دامنهٔ www اضافه شده، سقف حجم آپلود از 10m به 64m رسیده و try_files حالا درخواست‌ها را به index.php می‌فرستد. خروجی چهار خط حذف، چهار خط اضافه و پنج خط بدون تغییر نشان می‌دهد و داخل هر خط دقیقاً همان بخش تغییرکرده رنگی است. از این خروجی بلافاصله می‌فهمید که سایت پس از اعمال تغییر دیگر روی پورت ۸۰ پاسخ نمی‌دهد و اگر بلوک جداگانه‌ای برای انتقال HTTP به HTTPS نداشته باشید، بازدیدکننده‌های قدیمی خطا می‌بینند.

دو نکته در تفسیر مهم است. اول، جابه‌جا شدن یک بلوک متن در Diff خطی به شکل حذف از یک جا و اضافه در جای دیگر دیده می‌شود، نه به شکل «انتقال». دوم، وقتی چند خط مشابه وجود دارد، ممکن است چند Diff کمینهٔ متفاوت معتبر باشد و ابزارهای مختلف یکی از آن‌ها را انتخاب کنند؛ پس اگر خروجی این ابزار با Git کمی متفاوت است، لزوماً یکی اشتباه نیست.

بازگشت به فهرست مطالب

کاربردهای مقایسهٔ متن برای مدیران سرور و توسعه‌دهندگان

پرتکرارترین کاربرد، مقایسهٔ فایل تنظیمات پیش و پس از تغییر است: nginx.conf، فایل docker-compose یا تنظیمات PHP. نسخهٔ پشتیبان را با نسخهٔ فعلی مقایسه کنید تا دقیقاً بدانید چه چیزی عوض شده است. کاربرد دیگر، مقایسهٔ دو سرور است؛ خروجی دستورهایی مثل dpkg -l یا pip freeze را از دو سرور بگیرید و ببینید کدام بسته روی کدام سرور نسخهٔ دیگری دارد.

هنگام مهاجرت هم Diff نجات‌دهنده است. اگر از سرویس دیگری به ایران‌کلاد مهاجرت می‌کنید، خروجی رکوردهای DNS دامنه را پیش و پس از انتقال به DNS ایران‌کلاد مقایسه کنید تا هیچ رکورد MX یا TXT جا نماند. برای مقایسهٔ پاسخ‌های JSON یک API، ابتدا هر دو را با ابزار JSON مرتب و قالب‌بندی کنید؛ JSON فشرده در یک خط، Diff بی‌فایده‌ای تولید می‌کند.

  • مقایسهٔ فایل تنظیمات پیش و پس از ویرایش یا به‌روزرسانی بسته.
  • یافتن تفاوت بسته‌های نصب‌شده روی دو سرور.
  • بررسی رکوردهای DNS پیش و پس از انتقال دامنه.
  • مقایسهٔ دو پاسخ API یا دو خروجی دستور.
  • مرور تغییرات crontab یا فهرست کاربران پیش از اعمال.
  • بررسی متن قرارداد یا مستندات پیش از انتشار نسخهٔ جدید.

بازگشت به فهرست مطالب

معادل‌های Diff در لینوکس و Git

روی هر سرور لینوکسی دستور diff از بستهٔ diffutils در دسترس است؛ محدودیت حجم ندارد و برخلاف این ابزار کل پوشه‌ها را هم مقایسه می‌کند. خروجی diff -u را، یا patch کپی‌شده از همین ابزار را، می‌توانید در فایلی با پسوند patch ذخیره کنید و بعداً با دستور patch روی نسخهٔ دیگر اعمال کنید.

ترفند کاربردی دیگر، مقایسهٔ مستقیم فایل روی دو سرور بدون کپی است. با جایگزینی فرایند در bash، خروجی دو اتصال SSH را مستقیم به diff بدهید. برای فایل‌هایی که در مخزن Git نیستند هم git diff --no-index کار می‌کند و با گزینهٔ --word-diff تفاوت را در سطح کلمه نشان می‌دهد؛ معادل حالت «کلمه‌به‌کلمه» همین ابزار.

کاردستور
diff یکپارچه مثل این ابزارdiff -u old.conf new.conf
نادیده گرفتن تفاوت فاصله‌هاdiff -u -w old.conf new.conf
نمایش کنار همdiff -y --width=160 old.conf new.conf
مقایسهٔ کل دو پوشهdiff -ru /etc/nginx /root/nginx-backup
مقایسهٔ فایل روی دو سرورdiff <(ssh web1 cat /etc/nginx/nginx.conf) <(ssh web2 cat /etc/nginx/nginx.conf)
تفاوت در سطح کلمهgit diff --no-index --word-diff a.txt b.txt
ساخت و اعمال patchdiff -u a b > fix.patch && patch a < fix.patch

بازگشت به فهرست مطالب

اشتباهات رایج و نتایج گمراه‌کننده در مقایسهٔ متن

این ابزار به‌طور پیش‌فرض خطوط را دقیقاً نویسه‌به‌نویسه مقایسه می‌کند. یک فاصلهٔ اضافه در انتهای خط، تب به‌جای فاصله یا تفاوت حروف بزرگ و کوچک کافی است تا دو خط ظاهراً یکسان، متفاوت حساب شوند. اگر نتیجه پر از خطوط قرمز و سبزی است که با چشم یکسان به نظر می‌رسند، احتمالاً یکی از ویرایشگرها فاصله‌ها را تغییر داده است؛ گزینهٔ «نادیده گرفتن فاصله‌ها» را بزنید، معادل diff -w در لینوکس. تفاوت پایان خط ویندوز (CRLF) و لینوکس (LF) و نبودن خط جدید در انتهای فایل هم جداگانه گزارش می‌شود و تفاوت حساب نمی‌شود.

مشکل دیگر ترتیب است. خروجی دستورهایی مثل ls یا فهرست بسته‌ها روی دو سرور ممکن است ترتیب متفاوتی داشته باشد؛ پیش از مقایسه هر دو را با sort مرتب کنید. فایل‌های دودویی مثل تصویر یا آرشیو را هم با Diff متنی مقایسه نکنید؛ برای آن‌ها دستور cmp یا مقایسهٔ هش کافی است.

  • فاصله و تب انتهای خط تفاوت ساختگی ایجاد می‌کند.
  • خروجی‌های نامرتب را پیش از مقایسه با sort مرتب کنید.
  • JSON یک‌خطی را قبل از مقایسه قالب‌بندی کنید.
  • نسخهٔ قدیمی و جدید را جابه‌جا نچسبانید؛ رنگ‌ها برعکس می‌شوند.

بازگشت به فهرست مطالب

حریم خصوصی و امنیت: متن شما کجا مقایسه می‌شود؟

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

با این حال فایل‌های تنظیمات معمولاً رمز پایگاه داده، کلید API یا توکن دارند. پیش از چسباندن فایل .env یا تنظیمات واقعی، مقادیر حساس را با یک متن ثابت جایگزین کنید، یا مقایسه را روی خود سرور با diff انجام دهید. افزونه‌های مرورگر و تاریخچهٔ کلیپ‌بورد می‌توانند محتوای کپی‌شده را ببینند، حتی وقتی ابزار هیچ چیزی ارسال نمی‌کند.

بازگشت به فهرست مطالب

از Diff دستی تا کنترل نسخه: کی وقت Git است؟

اگر مدام نسخه‌های یک فایل را دستی مقایسه می‌کنید، وقت آن است که آن را در Git بگذارید. حتی پوشهٔ ⁦/etc⁩ را می‌شود با ابزارهایی مثل etckeeper زیر کنترل نسخه برد تا هر تغییر تنظیمات با تاریخ و توضیح ثبت شود. برای تیم‌ها، یک سرور Git خصوصی با Gitea روی سرور ابری راه می‌افتد و رابط وب آن Diff هر تغییر را رنگی نشان می‌دهد.

اگر ترجیح می‌دهید کد را مستقیم روی سرور در مرورگر ویرایش کنید، code-server یک محیط ویرایش کامل با نمای مقایسهٔ کنار هم در اختیارتان می‌گذارد. و پیش از هر تغییر بزرگ، یک بکاپ از سرور بگیرید تا اگر Diff چیزی را نشان داد که انتظارش را نداشتید، راه برگشت داشته باشید.

بازگشت به فهرست مطالب

مقایسه پیش از اعمال تغییر روی سرور تولید

یک عادت ساده بسیاری از قطعی‌ها را پیشگیری می‌کند: پیش از جایگزین کردن هر فایل تنظیمات روی سرور اصلی، نسخهٔ جدید را با نسخهٔ در حال اجرا مقایسه کنید. اگر در Diff خطی می‌بینید که انتظارش را نداشتید، مثلاً یک ماژول غیرفعال‌شده یا مسیر گواهی SSL تغییرکرده، همان‌جا متوقف شوید. پس از تأیید Diff، صحت نحوی فایل را هم با ابزار خود سرویس بسنجید؛ برای Nginx دستور nginx -t و برای Docker Compose دستور docker compose config این کار را می‌کنند.

در تیم‌هایی که استقرار خودکار دارند، همین منطق را در خط لولهٔ CI قرار دهید. برای مثال در Jenkins مرحله‌ای بگذارید که Diff تنظیمات جدید با نسخهٔ فعلی را در خروجی بیلد چاپ کند تا بازبین پیش از تأیید ببیند چه چیزی روی سرور می‌رود. ثبت این Diff در تاریخچهٔ بیلد، بعدها برای پیدا کردن علت یک مشکل بسیار ارزشمند است. اگر سرویس‌ها را با Docker اجرا می‌کنید، فایل compose و متغیرهای محیطی بدون مقادیر حساس بهترین نامزدها برای این مقایسه‌اند.

بازگشت به فهرست مطالب

محدودیت‌های این ابزار؛ صادقانه

این ابزار برای مقایسهٔ سریع دو متن ساخته شده و جایگزین ابزارهای کامل نیست. هر طرف حداکثر حدود دو میلیون نویسه می‌پذیرد و در نتیجه حداکثر چهار هزار ردیف نمایش داده می‌شود؛ بقیه در patch کپی‌شده هست. جابه‌جایی یک بلوک به شکل حذف و اضافه دیده می‌شود، نه «انتقال»، و برای متن‌های کاملاً متفاوت مقایسهٔ دقیق به نمایش ساده‌تر حذف و اضافهٔ کامل تبدیل می‌شود. پوشه یا فایل را مستقیم نمی‌خواند؛ محتوا را باید بچسبانید.

برای فایل‌های بزرگ‌تر یا مقایسهٔ پوشه‌ها، دستور diff لینوکس و git diff بهترین انتخاب‌اند. اگر فقط می‌خواهید بدانید دو فایل بزرگ دقیقاً یکسان‌اند یا نه، هش SHA-256 هر دو را با ابزار هش یا دستور sha256sum بگیرید؛ یکسان بودن هش یعنی یکسان بودن فایل.

بازگشت به فهرست مطالب بازگشت به ابتدای راهنما

پرسش و پاسخ،  ۱۲ پرسش

سؤالات متداول

پاسخ پرسش خود را پیدا نکردید؟ با پشتیبانی در تماس باشید.

این ابزار متن را به سرور ارسال می‌کند؟
خیر. مقایسه کاملاً در مرورگر شما انجام می‌شود و متن دو کادر به سرور ایران‌کلاد فرستاده نمی‌شود و جایی ذخیره نمی‌شود.
حداکثر چه حجمی را می‌توان مقایسه کرد؟
از هر طرف حدود دو میلیون نویسه، یعنی ده‌ها هزار خط. نتیجه حداکثر چهار هزار ردیف نمایش می‌دهد و خطوط بدون تغییر جمع می‌شوند؛ همهٔ تغییرات در patch کپی‌شده هست. برای فایل‌های بزرگ‌تر از diff لینوکس استفاده کنید.
چرا دو خط که یکسان به نظر می‌رسند، متفاوت نشان داده می‌شوند؟
ابزار نویسه‌به‌نویسه مقایسه می‌کند. فاصله یا تب انتهای خط، تفاوت حروف بزرگ و کوچک یا نیم‌فاصله در متن فارسی کافی است تا خط متفاوت حساب شود.
آیا ابزار گزینهٔ نادیده گرفتن فاصله‌ها را دارد؟
بله. «نادیده گرفتن فاصله‌ها» فاصله‌های ابتدا و انتهای خط و فاصله‌های تکراری را یکسان در نظر می‌گیرد، مثل diff -w؛ گزینهٔ جداگانه‌ای هم برای یکسان دانستن حروف بزرگ و کوچک هست.
آیا تفاوت درون یک خط را هم نشان می‌دهد؟
بله. در حالت خط‌به‌خط، کلمه‌های تغییرکرده داخل هر خط ویرایش‌شده پررنگ‌تر نشان داده می‌شوند و حالت کلمه‌به‌کلمه کل متن را بدون تقسیم به خط مقایسه می‌کند؛ معادل git diff --word-diff.
چطور دو فایل روی دو سرور مختلف را مقایسه کنم؟
با جایگزینی فرایند در bash خروجی دو اتصال SSH را مستقیم به diff بدهید، یا محتوای هر فایل را با cat بگیرید و در دو کادر این ابزار بچسبانید.
آیا می‌توانم خروجی را به شکل فایل patch ذخیره کنم؟
بله. دکمهٔ «کپی به‌صورت patch» خروجی را در قالب یکپارچهٔ diff -u با سه خط زمینه کپی می‌کند؛ آن را در فایلی مثل fix.patch بگذارید و با دستور patch اعمال کنید.
برای مقایسهٔ فایل‌های دودویی مثل تصویر چه کنم؟
Diff متنی برای فایل دودویی مناسب نیست. با دستور cmp یا مقایسهٔ هش SHA-256 دو فایل بفهمید یکسان‌اند یا نه.
چرا خروجی این ابزار با git diff کمی فرق دارد؟
وقتی خطوط مشابه زیادی وجود دارد، ممکن است چند Diff کمینهٔ معتبر وجود داشته باشد و هر ابزار یکی را انتخاب کند. تعداد کل تغییرات معمولاً یکی است.
آیا مقایسهٔ متن فارسی هم درست کار می‌کند؟
بله، مقایسه روی نویسه‌ها انجام می‌شود و زبان متن اهمیتی ندارد. فقط دقت کنید که نیم‌فاصله و فاصلهٔ معمولی دو نویسهٔ متفاوت‌اند و اگر یکی از نسخه‌ها با ویرایشگر دیگری نوشته شده باشد، خطوط ظاهراً یکسان متفاوت دیده می‌شوند.
چطور فقط بفهمم دو فایل بزرگ کاملاً یکسان‌اند یا نه؟
لازم نیست کل محتوا را مقایسه کنید. دستور sha256sum را روی هر دو فایل اجرا کنید؛ اگر هش‌ها یکسان باشند، فایل‌ها بایت‌به‌بایت یکسان‌اند. دستور cmp هم همین کار را بدون محاسبهٔ هش انجام می‌دهد.
آیا چسباندن فایل .env در این ابزار امن است؟
ابزار چیزی ارسال نمی‌کند، اما بهتر است پیش از چسباندن، رمزها و کلیدها را با متن ثابت جایگزین کنید یا مقایسه را روی خود سرور انجام دهید؛ افزونه‌های مرورگر می‌توانند محتوای صفحه را بخوانند.

پاسخ پرسش خود را پیدا نکردید؟ با پشتیبانی در تماس باشید.

سرور ابری

سرور ابری ایران‌کلاد در کمتر از ۶۰ ثانیه آماده می‌شود؛ با دیسک NVMe SSD، پورت اختصاصی ۱۰ گیگابیت و صورت‌حساب ساعتی تومانی، از ۱٬۱۰۰ تومان در ساعت.