guide/whitespace-options.md

الفرق بين خيارات تجاهل المسافات — diff -b و-w و-B و-Z وما يقابلها في git

مقارنة بالأمثلة لخيارات GNU diff وgit توضح الفرق الدقيق بين تجاهل المسافات في نهاية السطر، وتجاهل عدد المسافات (-b)، وتجاهل كل المسافات (-w)، وتجاهل الأسطر الفارغة (-B)، وتجاهل حالة الأحرف.

آخر تحديث: 2026-09-23

كثير من الحالات التي يكون فيها «المحتوى واحدًا» بين ملفين ومع ذلك يُظهر diff فروقًا كثيرة سببها المسافات: حذف المحرر المسافات في نهاية الأسطر، أو حوّل علامات الجدولة إلى مسافات، أو غيّر عرض المسافة البادئة. توفّر أدوات diff خيارات لتجاهل هذه الفروق، لكن كل خيار يتجاهل نطاقًا مختلفًا، فيجب أن تعرف بالضبط ما الذي يفعله.

خيارات GNU diff المتعلقة بالمسافات

الخيارالاسم الطويلما يتجاهله
-Z--ignore-trailing-spaceالمسافات في نهاية السطر
-E--ignore-tab-expansionالفرق الناتج عن تحويل علامة الجدولة إلى مسافات
-b--ignore-space-changeتغيّر عدد المسافات، والمسافات في نهاية السطر
-w--ignore-all-spaceكل المسافات
-B--ignore-blank-linesالتغييرات التي أُضيفت أو حُذفت فيها أسطر فارغة فقط
-i--ignore-caseحالة الأحرف
--strip-trailing-crحرف CR في نهاية أسطر المدخلات

ما يقابلها في git diff

تصفها وثائق git على النحو التالي.

الفرق الحاسم بين ‎-b و‎-w

يخلط كثيرون بين هذين الخيارين. الجوهر هو هل يميّز الخيار بين وجود المسافة وعدم وجودها.

اليساراليمين-b (تجاهل عدد المسافات)-w (تجاهل كل المسافات)
a ba bمتطابقانمتطابقان
a babمختلفانمتطابقان
x = 1x=1مختلفانمتطابقان
if (a) + مسافة في نهاية السطرif (a)متطابقانمتطابقان
مسافة بادئة بعلامة جدولة واحدةمسافة بادئة بأربع مسافاتمتطابقانمتطابقان

-b يختصر كل كتلة مسافات إلى مسافة واحدة، أما -w فيحذف المسافات كلها. لذلك يعدّ -w السطرين x = 1 وx=1 متطابقين، بل يعدّ int a وinta متطابقين أيضًا.

الخطر عندما تكون المسافات البادئة ذات معنى

في الملفات التي تكون المسافة البادئة فيها جزءًا من الصياغة مثل بايثون وYAML وMakefile، قد تُخفي خيارات تجاهل المسافات تغييرًا حقيقيًا.

if ready:
    start()
    notify()
if ready:
    start()
notify()

في الثاني خرج notify() من جملة if فتغيّر السلوك، لكن عند المقارنة بـ -w تُحذف المسافات كلها فيختفي الفرق. أما -b فيلتقط الفرق لأن المسافة في بداية السطر تحولت من «موجودة» إلى «غير موجودة». لكن إذا تغيّرت المسافة البادئة من 4 إلى 8 مسافات ودخل الكود كتلة داخلية أعمق، فالذي تغيّر هو عدد المسافات فقط، فلن يظهر الفرق مع -b أيضًا.

الطريقة المضمونة هي مقارنة الملفات ذات المسافات البادئة المهمة دون خيارات المسافات. العادة الآمنة أن تستخدم خيارات المسافات للتحقق من أن «التغيير مجرد ترتيب»، ثم تُجري الفحص النهائي دون خيارات.

نطاق تجاهل الأسطر الفارغة (‎-B)

يُخفي -B و--ignore-blank-lines في git التغييرات المكوّنة من أسطر فارغة فقط. إذا اختلط سطر فارغ مضاف بتغيير حقيقي في الكتلة نفسها فقد يظل ذلك السطر الفارغ ظاهرًا. هذا الخيار مفيد في المستندات التي تغيّر فيها عدد الأسطر الفارغة بين الفقرات، أو عندما يعدّل منسّق الكود الأسطر الفارغة بين الدوال.

خيارات هذا الموقع وما يقابلها

هذا الموقعالأقرب في GNU diffالأقرب في git diff
المسافات: مقارنة كما هي(دون خيار)(دون خيار)
المسافات: تجاهل المسافات في نهاية السطر-Z--ignore-space-at-eol
المسافات: تجاهل عدد المسافات-b-b
المسافات: تجاهل كل المسافات-w-w
تجاهل حالة الأحرف-i(لا يوجد مقابل)
تجاهل الأسطر الفارغةيشبه -B (تُستبعد الأسطر الفارغة من المقارنة)يشبه --ignore-blank-lines
توحيد نهايات الأسطر--strip-trailing-cr + تجاهل السطر الجديد الأخيريشبه --ignore-cr-at-eol

خيار «تجاهل الأسطر الفارغة» في هذا الموقع يستبعد الأسطر الفارغة من المقارنة تمامًا ويعرضها بلون باهت فقط. كما تنطبق خيارات التجاهل على الإبراز داخل السطر أيضًا؛ فإذا فعّلت تجاهل عدد المسافات فلن تُبرز المواضع التي يختلف فيها عدد المسافات فقط.

جرّبها في هذه الأداة

أدخل أمثلة الجدول أعلاه في مقارنة النصوص وغيّر خيارات المسافات واحدًا تلو الآخر، وسترى الفرق فورًا. أما «الفروق غير المرئية» مثل CR في نهاية السطر أو السطر الجديد في نهاية الملف فتجدها في مقال نهايات الأسطر والفروق غير المرئية، وطريقة قراءة النتيجة كـ patch في مقال كيف تقرأ unified diff.

انتقل إلى مقارنة النصوص