في هذا الدرس 6تصفّح المواضيع
بينما يخبرك الأمر git status بأسماء الملفات التي تغيرت فقط، يعرض الأمر git diff الأسطر المضافة والمحذوفة بدقة داخل تلك الملفات وفق صيغة الفروق الموحدة (Unified Diff):
- رموز طرفي المقارنة (
--- a/و+++ b/): يرمز الطرفa/إلى النسخة الأقدم وتُسبق أسطرها المحذوفة بعلامة الناقص-، ويرمز الطرفb/إلى النسخة الأحدث وتُسبق أسطرها المضافة بعلامة الزائد+. - رأس مقطع التعديل (
@@ -4,5 +4,6 @@): يوضح أن المقطع المعروض يبدأ من السطر رقم4ويمتد5أسطر في النسخة القديمة، مقابل6أسطر في النسخة الجديدة.
# Inspect exact line-by-line changes in modified files
git diff
# Context lines (unchanged) have a leading space
# Removed lines start with (-) and added lines start with (+)
من أشهر المواقف التي تحير المبتدئين تشغيل الأمر git add index.html ثم تنفيذ git diff وملاحظة أن المخرجات فارغة تماماً! يزول هذا اللبس فوراً عندما نفهم أي منطقتين يقارنهما كل خيار:
- فروق العمل غير المجهزة (
git diff): يقارن بين مجلد العمل ومنطقة التجهيز فقط؛ لذا عندما تجهز الملف تتطابق المنطقتان فلا يظهر فرق. - فروق منطقة التجهيز (
git diff --stagedأو المرادف--cached): يقارن بين منطقة التجهيز وآخر التزامHEADليعرض لك ما سيُحفظ في اللقطة القادمة.
# 1. Compare Working Tree vs Staging Index (unstaged edits)
git diff
# 2. Compare Staging Index vs HEAD (staged for next commit)
git diff --staged
لا يقتصر عمل git diff على التعديلات الحالية، بل يمكنك مقارنة أي التزامين سابقين بتمرير بصمتيهما المختصرتين بالترتيب من الأقدم إلى الأحدث عبر الصيغة git diff <old> <new>، أو مقارنة جميع تعديلاتك الحالية المجهزة وغير المجهزة بآخر لقطة عبر git diff HEAD.
وإذا شملت التعديلات ملفات عديدة وأردت حصر المقارنة في ملف واحد أو مجلد بعينه، أضف الفاصل -- متبوعاً بمسار الملف في نهاية الأمر.
# Compare all uncommitted edits (staged + unstaged) with HEAD
git diff HEAD
# Compare two commits restricted to a single file path
git diff a1c0f9e 9f4c2a1 -- index.html
في المقارنة السطرية المعتادة، يؤدي تعديل كلمة واحدة داخل فقرة طويلة في ملف HTML إلى إظهار السطر بأكمله كسطر محذوف وسطراً جديداً بالكامل. ولتسهيل المراجعة الدقيقة يوفر Git خيارين ذكيين:
- المقارنة على مستوى الكلمات (
--word-diff): يبرز الكلمة المحذوفة بين القوسين[-...-]والكلمة المضافة بين{+...+}داخل نفس السطر. - تجاهل المسافات البادئة (
-w): يتجاهل تغييرات المسافات البيضاء والمحاذاة ليركز الفحص على التغييرات البرمجية الفعلية فقط.
# Highlight inline word changes inside long text lines
git diff --word-diff
# Ignore all whitespace and indentation changes
git diff -w
عندما تتعامل مع تعديلات واسعة تشمل عشرات الملفات، يُفضل البدء باستعراض ملخص الملفات المتأثرة قبل قراءة الشفرة التفصيلية عبر ثلاثة خيارات سريعة:
- الملخص الإحصائي (
git diff --stat): يعرض عدد الأسطر المعدلة وشريط الإضافة والحذف لكل ملف. - أسماء الملفات فقط (
git diff --name-only): يطبع قائمة صافية بمسارات الملفات المتأثرة. - الأسماء مع رمز الحالة (
git diff --name-status): يوضح حالة كل ملف بالحرفMللمعدل، أوAللمضاف، أوDللمحذوف.
# Show file change histogram for staged changes
git diff --staged --stat
# List modified file paths with status letters (M, A, D)
git diff --staged --name-status
يوضح الجدول المقارن التالي جميع أوضاع وحالات الأمر git diff والمنطقتين اللتين يقارن بينهما في كل صيغة:
| صيغة الأمر | الطرف الأول الأقدم (a/) | الطرف الثاني الأحدث (b/) | الغرض العملي الأساسي |
|---|---|---|---|
git diff | منطقة التجهيز Index | مجلد العمل Working Tree | فحص التعديلات غير المجهزة حالياً |
git diff --staged | آخر التزام HEAD | منطقة التجهيز Index | مراجعة ما سيدخل في الالتزام القادم |
git diff HEAD | آخر التزام HEAD | مجلد العمل Working Tree | عرض كافة التعديلات المجهزة وغير المجهزة |
git diff <c1> <c2> | الالتزام الأول <c1> | الالتزام الثاني <c2> | مقارنة الفروق بين لقطتين تاريخيتين |
git diff --word-diff | كلمات السطر القديم | كلمات السطر الجديد | كشف تعديلات الكلمات داخل الفقرات الطويلة |
git diff --name-status | الشجرة الأساسية | الشجرة المقابلة | سرد أسماء الملفات المتغيرة مع رموز حالتها |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس قراءة صيغة الفروق الموحدة ورؤوس المقاطع @@، والتمييز الدقيق بين الفروق غير المجهزة بـ git diff والفروق المجهزة بـ git diff --staged، ومقارنة الالتزامات والملفات، وإبراز الكلمات المعدلة عبر --word-diff، واستخراج ملخصات الحالة بـ --name-status. الخطوة التالية: انتقل الآن إلى الدرس 14 «فحص تفاصيل الالتزام وتتبع الأسطر عبر git show وgit blame» لفحص كائنات الالتزام وتتبع مؤلف كل سطر برمجي.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Unified Diff Format صيغة الفروق الموحدة (Unified Diff)
- الصيغة القياسية التي يعرض بها git diff تعديلات الملفات باستخدام علامات --- و+++ ورؤوس المقاطع @@ والأسطر المسبوقة بـ + و-.
- للمراجعة
- 02 Hunk Header (@@) رأس مقطع التعديل (@@)
- السطر المحاط بعلامات @@ الذي يحدد رقم سطر البداية وعدد الأسطر في النسخة القديمة والنسخة الجديدة لكل مقطع معدل.
- للمراجعة
- 03 Unstaged Diff فروق التعديلات غير المجهزة
- نتيجة تشغيل الأمر git diff بدون خيارات، وتقارن بين تعديلات مجلد العمل الحالية وما هو مسجل في منطقة التجهيز.
- للمراجعة
- 04 Staged Diff (--staged) فروق التعديلات المجهزة (--staged)
- نتيجة تشغيل الأمر git diff --staged (أو --cached)، وتقارن بين منطقة التجهيز وآخر التزام محفوظ في HEAD.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 DIFF DIFF
- Differential File Comparison
- المقارنة التفاضلية بين نسختين من الملفات سطراً بسطر أو كلمة بكلمة.
- للمراجعة
- 02 HEAD HEAD
- Current Commit Snapshot Pointer
- لقطة الالتزام الأخير التي يقارن بها الأمر git diff --staged أو git diff HEAD.
- للمراجعة
- 03 SHA-1 SHA-1
- Secure Hash Algorithm 1
- بصمات الالتزامات التي تُمرر للأمر git diff لمقارنة نقطتين زمنيتين في السجل.
- للمراجعة
- 04 ASCII ASCII
- American Standard Code for Information Interchange
- رموز الجمع والطرح النصية المستخدمة في تمثيل الأسطر المضافة والمحذوفة.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
عدّل ملفاً متتبعاً ونفّذ git diff لرؤية التعديلات غير المجهزة، ثم جهّزه بـ git add وشغّل git diff --staged لمراجعة الرقعة المجهزة.
-
شغّل الأمر git diff --word-diff لملاحظة الفروق على مستوى الكلمات، ثم نفّذ git diff HEAD --name-status لعرض رموز حالة الملفات.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
ما المنطقتان اللتان يقارن بينهما الأمر git diff عند تشغيله بدون أي خيارات إضافية؟
يقارن الأمر git diff العادي بين مجلد العمل (Working Tree) ومنطقة التجهيز (Staging Index).
بعد تجهيز جميع الملفات المعدلة بالأمر git add .، لماذا يعطي الأمر git diff العادي مخرجات فارغة؟
لأن مجلد العمل أصبح مطابقاً لمنطقة التجهيز؛ ولرؤية التعديلات المجهزة يجب استخدام git diff --staged.
الأمران git diff --staged وgit diff --cached مترادفان تماماً ويعطيان نفس النتيجة بنسبة 100%.
صواب؛ فالخيار --staged مرادف مطابق للخيار --cached وكلاهما يقارن منطقة التجهيز بآخر التزام HEAD.
في مخرجات الأمر git diff الموحدة، إلى ماذا يرمز السطران البادئان بـ --- a/ و+++ b/؟
يرمز --- a/ إلى النسخة الأقدم من الملف، بينما يرمز +++ b/ إلى النسخة الأحدث المقابلة لها.
أي خيار في الأمر git diff يبرز الكلمات المعدلة فقط داخل نفس السطر بدلاً من إظهار السطر بأكمله كمحذوف ومضاف؟
يعرض الخيار --word-diff الفروق على مستوى الكلمات داخل السطر الواحد بوضوح.
أي خيار يخبر الأمر git diff بتجاهل تغييرات المسافات البيضاء والمحاذاة عند مقارنة الملفات؟
يتجاهل الخيار -w جميع فروق المسافات البيضاء للتركيز على التغييرات البرمجية الفعلية.
أي أمر يطبع قائمة بمسارات الملفات المتغيرة فقط مسبوقة بحرف يوضح نوع التغيير (M أو A أو D)؟
يعرض الأمر git diff --name-status مسار كل ملف متأثر مسبوقاً بحرف حالته.
يقارن الأمر git diff HEAD بين مجلد العمل الحالي (شاملاً التعديلات المجهزة وغير المجهزة) وآخر التزام مسجل.
صواب؛ يعرض الأمر git diff HEAD مجموع الفروق المجهزة وغير المجهزة مقارنة بلقطة HEAD الأخيرة.