مقارنة ملفات الكود: الأسطر المضافة والمحذوفة
اعرف بدقة ما الذي تغيّر بين نسختين من الملف: إعادة كتابة return a + b في سطرين جديدين تعطي سطرين مضافين وسطراً محذوفاً و3 أسطر دون تغيير، مع أرقام الأسطر القديمة والجديدة وعرض diff المألوف. مجاناً في متصفحك.
- مجاني
- يعمل في متصفحك
- دون تسجيل
- بياناتك لا تغادر جهازك
شغّل الأداة مجانًا
قارن بين نسختين من ملف مصدر واحصل على بيان حتمي لكل تغيير سطرًا بسطر. تحدد النتيجة جميع الأسطر المضافة والمحذوفة وغير المتغيرة، وتورد أرقام الأسطر القديمة والجديدة حين تنطبق، كما توفر عرضًا مألوفًا بأسلوب الفرق الموحد للسجلات أو شاشات المراجعة. تعمل الأداة مع أي لغة برمجة نصية، ولا تفسر البنية، ولا تنفذ الكود، ولا تتصل بأي مستودع، ولا تعدل أيًا من النسختين. لذلك تصلح مكونًا صغيرًا يمكن توقع سلوكه في أدوات التطوير، وأنظمة التعليم، وفحوص الترحيل، ومسارات المراجعة الآلية.
قدم نسختي الكود المراد مقارنتهما
يجوز أن تكون إحدى النسختين فارغة، وهو ما يمثل بصورة طبيعية ملفًا أنشئ حديثًا أو ملفًا حذف بالكامل، لكن لا يجوز أن تكونا فارغتين معًا لأنه لن يوجد عندئذ محتوى ذو معنى للمقارنة. توحد نهايات الأسطر قبل المقارنة، ولذلك يمكن مقارنة نص يستخدم CRLF في Windows بنص يستخدم LF في Unix من دون اعتبار كل سطر متغيرًا. صممت المقارنة لتكون مستقلة عن اللغة؛ فتخضع JavaScript وPython وGo وRust وملفات الإعداد والقوالب وSQL وغيرها من النصوص القائمة على الأسطر للقواعد نفسها.
تقارن الأسطر بدقة بعد توحيد فواصلها. وتظل المسافات وعلامات الجدولة وحالة الأحرف وعلامات الترقيم والتعليقات ذات دلالة، لأن هذه التفاصيل قد تغير سلوك البرنامج. قدم النص الكامل بدلًا من رقعة تغييرات.
لا تقيم النتيجة الكود ولا تحل عمليات الاستيراد، ولذلك يمكن مقارنة المقاطع غير الموثوقة كنص مجرد. ولضمان استهلاك متوقع للموارد، يقتصر كل إصدار على 2,000 سطر؛ قسم الملفات المولدة الكبيرة بصورة استثنائية قبل إرسالها.
اقرأ التغييرات المنظمة والعرض الموحد
تتضمن الاستجابة مؤشر identical وملخصًا ومصفوفة أسطر منظمة ونصًا بأسلوب موحد. يحصي الملخص الأسطر المضافة والمحذوفة وغير المتغيرة. ويتضمن كل سجل منظم نوعه ونصه الدقيق.
تحذف الحقول غير المنطبقة بدلًا من وضع قيم null، مما يجعل المعالجة اللاحقة أوضح. يمثل السطر المعدل بعملية حذف وعملية إضافة، وفق الدلالة الأساسية التي تستخدمها أدوات فرق الأسطر التقليدية. تغطي النتيجة الملف المقدم بأكمله بدلًا من ضغط المناطق المتباعدة في كتل سياق منفصلة.
يجعل هذا الاختيار التحليل بسيطًا، ويضمن أن تصف القائمة المنظمة والعرض النصي التسلسل نفسه تمامًا.
استخدم نتيجة حتمية في مسارات التطوير
تعثر الخوارزمية على تسلسل جزئي مشترك ومرتب، مما يسمح بالتعرف على عمليات الإدراج والحذف حتى عند تغير أرقام الأسطر. تعالج الأسطر المكررة حسب الموضع والترتيب بدلًا من التعامل مع الملف كمجموعة. وإذا وجد أكثر من محاذاة صحيحة، يطبق التنفيذ قاعدة ترجيح ثابتة، ولذلك تنتج المدخلات نفسها النتيجة نفسها دائمًا.
لهذه الحتمية أهمية في الاختبارات الذهبية، والتخزين المؤقت، وسجلات التدقيق، والملاحظات التعليمية، وأنظمة البناء التي ينبغي ألا تولد ضوضاء بين مرات التشغيل. استخدم المصفوفة المنظمة لإنشاء عرض متجاور، أو إحصاء أنواع التغيير، أو تعليق أرقام الأسطر، أو فرض سياسة. لا تنفذ هذه القدرة مطابقة مدركة للبنية، ولا كشف إعادة التسمية، ولا تمييزًا على مستوى الرموز، ولا حل تعارضات الدمج، ولا وصولًا إلى المستودع.
تتطلب تلك المهام محللات لغوية أو سياقًا من نظام التحكم في الإصدارات. أما نموذج الأسطر الأضيق هنا فيقدم سلوكًا واضحًا بلا اعتماد على الشبكة، ونتيجة يمكن إعادة إنتاجها محليًا من السلسلتين نفسيهما.
حالات الاستخدام
أنشئ شاشة لمراجعة الكود
اعرض سجلات منظمة للأسطر المضافة والمحذوفة وغير المتغيرة مع أرقامها القديمة والجديدة الصحيحة.
تحقق من تغييرات الكود المولد
قارن المخرجات بين عمليتي تشغيل واحفظ سجلًا حتميًا بأسلوب موحد ضمن سجلات البناء.
اشرح تعديل تمرين برمجي
وضح للمتعلمين بدقة أسطر المصدر التي أدرجت أو حذفت من دون تنفيذ الكود المقدم.
الأسئلة الشائعة
ما تكلفة المقارنة الواحدة؟
ويمكن لتجربة المتصفح تشغيل المنطق الحتمي نفسه محليًا.
ما لغات البرمجة المدعومة؟
تدعم أي لغة نصية لأن المقارنة تتم على مستوى الأسطر ولا تعتمد على البنية النحوية.
هل تظهر التغييرات التي تقتصر على المسافات؟
نعم. للمسافات وعلامات الجدولة دلالة، ولذلك يمثل السطر الذي تغير تباعده كسطر محذوف وآخر مضاف.
هل يجوز أن تكون إحدى النسختين فارغة؟
نعم. تمثل النسخة الفارغة ملفًا جديدًا أو محذوفًا. ولا يعاد خطأ إلا عندما تكون النسختان فارغتين معًا.
هل تستخدم النتيجة تنسيق الفرق الموحد؟
توفر علامات الملفات ورأس النطاق وسوابق الأسطر المألوفة إلى جانب السجلات المنظمة. وهي عرض موحد للملف كله، وليست كتل سياق متعددة ومضغوطة.
أدوات ذات صلة
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/dev2/diff-two-code-files \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"original_code":"function greet(name) {\n return `Hello, ${name}`;\n}\n","revised_code":"function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"}'const res = await fetch("https://api.kit.forhosting.com/dev2/diff-two-code-files", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/diff-two-code-files",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/diff-two-code-files", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"original_code":"function greet(name) {\\n return `Hello, ${name}`;\\n}\\n","revised_code":"function greet(name = \\"world\\") {\\n return `Hello, ${name}!`;\\n}\\n"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"original_code":"function greet(name) {\n return `Hello, ${name}`;\n}\n","revised_code":"function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/diff-two-code-files", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.diff_two_code_files",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
ملاحظات تقنية
قدم نسختي الكود المراد مقارنتهما
ضع نص المصدر السابق في original_code والنص اللاحق في revised_code.
اقرأ التغييرات المنظمة والعرض الموحد
تحتوي سجلات الأسطر غير المتغيرة على old_line وnew_line لأن السطر موجود في النسختين. أما السجلات المحذوفة فتحتوي على old_line، والمضافة على new_line. يبدأ حقل unified_diff بعلامتي الملف الأصلي والمنقح، ثم يأتي رأس النطاق والأسطر ذات السوابق؛ فالمسافة تعني أن السطر لم يتغير، وعلامة الطرح تعني الحذف، وعلامة الجمع تعني الإضافة.
استخدم نتيجة حتمية في مسارات التطوير
واستخدم unified_diff لكتابة سجل مقروء، أو إرفاق أثر موجز بمهمة، أو تزويد أداة تفهم السوابق المألوفة.