انتقل إلى محتوى الدرس
الدرس 13
دورة Version Control

مقارنة التعديلات والفروق عبر الأمر git diffGit Diff

قارن التعديلات غير المجهزة والتعديلات المجهزة (--staged) والالتزامات السابقة عبر الأمر git diff، واقرأ رؤوس مقاطع الفروق بدقة.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

بينما يخبرك الأمر git status بأسماء الملفات التي تغيرت فقط، يعرض الأمر git diff الأسطر المضافة والمحذوفة بدقة داخل تلك الملفات وفق صيغة الفروق الموحدة (Unified Diff):

  • رموز طرفي المقارنة (--- a/ و+++ b/): يرمز الطرف a/ إلى النسخة الأقدم وتُسبق أسطرها المحذوفة بعلامة الناقص -، ويرمز الطرف b/ إلى النسخة الأحدث وتُسبق أسطرها المضافة بعلامة الزائد +.
  • رأس مقطع التعديل (@@ -4,5 +4,6 @@): يوضح أن المقطع المعروض يبدأ من السطر رقم 4 ويمتد 5 أسطر في النسخة القديمة، مقابل 6 أسطر في النسخة الجديدة.
مخطط يوضح مقارنة الفروق غير المجهزة بـ git diff والفروق المجهزة بـ git diff --staged ومقارنة الالتزامات
Shell
# 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 ليعرض لك ما سيُحفظ في اللقطة القادمة.
Shell
# 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.

وإذا شملت التعديلات ملفات عديدة وأردت حصر المقارنة في ملف واحد أو مجلد بعينه، أضف الفاصل -- متبوعاً بمسار الملف في نهاية الأمر.

Shell
# 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): يتجاهل تغييرات المسافات البيضاء والمحاذاة ليركز الفحص على التغييرات البرمجية الفعلية فقط.
Shell
# 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 للمحذوف.
Shell
# 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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
رموز الجمع والطرح النصية المستخدمة في تمثيل الأسطر المضافة والمحذوفة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. عدّل ملفاً متتبعاً ونفّذ git diff لرؤية التعديلات غير المجهزة، ثم جهّزه بـ git add وشغّل git diff --staged لمراجعة الرقعة المجهزة.

  2. شغّل الأمر git diff --word-diff لملاحظة الفروق على مستوى الكلمات، ثم نفّذ git diff HEAD --name-status لعرض رموز حالة الملفات.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ما المنطقتان اللتان يقارن بينهما الأمر git diff عند تشغيله بدون أي خيارات إضافية؟

يقارن الأمر git diff العادي بين مجلد العمل (Working Tree) ومنطقة التجهيز (Staging Index).

02

بعد تجهيز جميع الملفات المعدلة بالأمر git add .، لماذا يعطي الأمر git diff العادي مخرجات فارغة؟

لأن مجلد العمل أصبح مطابقاً لمنطقة التجهيز؛ ولرؤية التعديلات المجهزة يجب استخدام git diff --staged.

03

الأمران git diff --staged وgit diff --cached مترادفان تماماً ويعطيان نفس النتيجة بنسبة 100%.

صواب؛ فالخيار --staged مرادف مطابق للخيار --cached وكلاهما يقارن منطقة التجهيز بآخر التزام HEAD.

04

في مخرجات الأمر git diff الموحدة، إلى ماذا يرمز السطران البادئان بـ --- a/ و+++ b/؟

يرمز --- a/ إلى النسخة الأقدم من الملف، بينما يرمز +++ b/ إلى النسخة الأحدث المقابلة لها.

05

أي خيار في الأمر git diff يبرز الكلمات المعدلة فقط داخل نفس السطر بدلاً من إظهار السطر بأكمله كمحذوف ومضاف؟

يعرض الخيار --word-diff الفروق على مستوى الكلمات داخل السطر الواحد بوضوح.

06

أي خيار يخبر الأمر git diff بتجاهل تغييرات المسافات البيضاء والمحاذاة عند مقارنة الملفات؟

يتجاهل الخيار -w جميع فروق المسافات البيضاء للتركيز على التغييرات البرمجية الفعلية.

07

أي أمر يطبع قائمة بمسارات الملفات المتغيرة فقط مسبوقة بحرف يوضح نوع التغيير (M أو A أو D)؟

يعرض الأمر git diff --name-status مسار كل ملف متأثر مسبوقاً بحرف حالته.

08

يقارن الأمر git diff HEAD بين مجلد العمل الحالي (شاملاً التعديلات المجهزة وغير المجهزة) وآخر التزام مسجل.

صواب؛ يعرض الأمر git diff HEAD مجموع الفروق المجهزة وغير المجهزة مقارنة بلقطة HEAD الأخيرة.