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

فهم وحل تعارضات الدمج Merge Conflicts خطوة بخطوةResolving Merge Conflicts

افهم متى ولماذا يحدث تعارض الدمج عند تعديل نفس الأسطر في فرعين، واقرأ علامات التعارض الثلاث بدقة، واحسم التعارض أو ألغِه بأمان.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

في أغلب الأحيان، ينجح Git في دمج التعديلات الموزعة على ملفات مختلفة أو حتى فقرات متباعدة داخل نفس الملف تلقائياً. لكن تعارض الدمج (Merge Conflict) يقع في حالتين محددتين:

  • تعديل نفس السطر بطريقتين مختلفتين: عندما يغيّر الفرع الحالي (HEAD) والفرع المراد دمجه نفس الأسطر البرمجية داخل نفس الملف منذ افتراقهما عن الجد المشترك.
  • تعارض الحذف مع التعديل: عندما يحذف أحد الفرعين ملفاً بينما يجري الفرع الآخر تعديلات داخل ذلك الملف.

وبدلاً من التخمين العشوائي وإتلاف الكود، يوقف Git عملية الدمج مؤقتاً ويطلب منك اتخاذ القرار الهندسي بالحسم.

Shell
# Attempt to merge a branch with competing line edits
git switch main
git merge feat-pricing
# Auto-merging index.html
# CONFLICT (content): Merge conflict in index.html

عند فتح الملف المتعارض في محرر الأكواد، ستجد أن Git قد أحاط المقطع المتضارب بثلاث علامات قياسية للتعارض (Conflict Markers):

  • علامة البداية <<<<<<< HEAD (نسخة الفرع الحالي): تمثل الأسطر التي تليها مباشرة وحتى الفاصل الأوسط الكود الموجود حالياً في فرعك النشط المستقبِل.
  • الفاصل الأوسط =======: يفصل بين كود فرعك الحالي في الأعلى وكود الفرع القادم في الأسفل.
  • علامة النهاية >>>>>>> feat-pricing (نسخة الفرع القادم): تمثل الأسطر المحصورة بين الفاصل الأوسط وهذه العلامة الكود القادم من الفرع الذي تحاول دمجه.
Shell
<<<<<<< HEAD
  <h1>CloseTag Pro Plan - $19</h1>
=======
  <h1>CloseTag Team Plan - $25</h1>
>>>>>>> feat-pricing

في المشاريع الكبيرة التي قد يمس فيها الدمج عشرات الملفات بينما يقع التعارض في ملف واحد أو اثنين فقط، نعتمد على أوامر الفحص لتحديد موقع التعارض بدقة:

  • الحالة المفصلة (git status): يفرد قسماً خاصاً بعنوان Unmerged paths يسرد فيه كل ملف شهد تعديلاً متضارباً (both modified).
  • الحالة المختصرة (git status -s): يميز الملفات المتعارضة بالرمز المزدوج UU.
  • فحص الفروق المتبقية (git diff): يعرض المقاطع المتعارضة التي لم تُحسم بعد فقط.
Shell
# List unmerged files with short UU status code
git status -s

# Inspect unresolved conflict lines directly
git diff
مخطط يوضح خطوات اكتشاف الملفات المتعارضة وتحرير علامات التعارض وتجهيز الحل أو إلغاء الدمج

يتم حسم تعارض الدمج وإتمام العملية عبر أربع خطوات عملية مرتبة:

  1. تحرير المحتوى البرمجي: افتح الملف المتعارض وقرر الإبقاء على نسخة الفرع الحالي، أو نسخة الفرع القادم، أو كتابة سطر يدمج الميزتين معاً.
  2. مسح علامات التعارض الثلاث بالكامل: احذف أسطر <<<<<<< و======= و>>>>>>> تماماً حتى يظل الكود البرمجي النظيف فقط.
  3. تجهيز الملف المحسوم (git add <file>): يُعد تشغيل git add الإشارة الرسمية لنظام Git بأن التعارض في هذا الملف قد انتهى.
  4. حفظ التزام الدمج (git commit): سجّل التزام الدمج النهائي لإغلاق العملية بنجاح.
Shell
# After removing <<<<<<<, =======, and >>>>>>> markers:
git add index.html
git status -s
git commit -m "Merge feat-pricing and resolve heading"

أحياناً تبدأ عملية الدمج ثم تكتشف أنك اخترت الفرع الخطأ، أو أن التعارض يتطلب مراجعة زميلك في الفريق قبل حسمه.

في أي لحظة قبل تنفيذ التزام الدمج، يمكنك تشغيل الأمر المنقذ git merge --abort؛ حيث يلغي Git عملية الدمج فوراً، ويمسح علامات التعارض، ويعيد مجلد العمل ومنطقة التجهيز إلى حالتهما الأصلية النظيفة قبل بدء الدمج تماماً.

Shell
# Cancel an in-progress conflicted merge safely
git merge --abort

# Confirm repository returned to clean pre-merge state
git status -s -b

يجمع الجدول المرجعي التالي دلالات علامات التعارض والأوامر الأساسية للتعامل معها باحترافية:

العلامة أو الأمرالدلالة الهندسيةالإجراء المطلوب
<<<<<<< HEADبداية كود الفرع النشط الحالي (المستقبِل)مراجعة الكود وحذف سطر العلامة
=======الفاصل الأوسط بين النسختين المتعارضتينحذف سطر الفاصل بالكامل بعد الحسم
>>>>>>> <branch>نهاية كود الفرع القادم المراد دمجهمراجعة الكود وحذف سطر العلامة
git status -s (UU)ملف متعارض لم يُدمج بعدتحرير الملف ثم تشغيل git add
git add <file>إعلان انتهاء التعارض في الملفإتباعه بالأمر git commit
git merge --abortإلغاء الدمج واستعادة الحالة السابقةيُستخدم للتراجع الفوري الآمن
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

تعرفت في هذا الدرس على أسباب حدوث تعارضات الدمج، وكيفية قراءة علامات التعارض الثلاث وتحديد الملفات المتعارضة بالرمز UU، وخطوات تحرير الملف وتجهيزه بـ git add لإتمام الدمج أو إلغائه بأمان عبر git merge --abort. الخطوة التالية: انتقل الآن إلى الدرس رقم 24 «إعادة تأسيس الفروع وتنظيم السجل عبر الأمر git rebase» لإتقان السجل الخطي والتنظيم التفاعلي للالتزامات.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Merge Conflict تعارض الدمج
توقف مؤقت في عملية الدمج يحدث عندما يعدل فرعان نفس الأسطر البرمجية بطريقتين متضاربتين.
للمراجعة
02 Conflict Markers علامات التعارض
الأسطر الاسترشادية الثلاثة التي يدرجها Git داخل الملف المتعارض لبيان نسخة الفرع الحالي والفرع القادم.
للمراجعة
03 Unmerged Path (UU) المسار غير المدمج (UU)
ملف يشهد تعارضاً حالياً ويظهر بالرمز UU في الحالة المختصرة بانتظار تحريره وتجهيزه.
للمراجعة
04 Merge Abort إلغاء الدمج
تشغيل الأمر git merge --abort لإلغاء عملية الدمج المتعارضة واستعادة حالة المستودع النظيفة قبل الدمج.
للمراجعة

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

حروف قليلة. معنى كامل.

الاختصارات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 UU UU
Unmerged Both Modified
رمز الحالة المختصرة في git status -s الذي يدل على ملف غير مدمج عُدّل في كلا الفرعين.
للمراجعة
02 HEAD HEAD
Current Active Branch Version (Ours)
يمثل في علامة التعارض العلوية كود الفرع النشط الحالي الذي تقف عليه عند تنفيذ الدمج.
للمراجعة
03 ORT ORT
Ostensibly Recursive's Twin
خوارزمية الدمج في Git التي تكتشف تضارب الأسطر وتدرج علامات التعارض.
للمراجعة
04 CLI CLI
Command Line Interface
واجهة سطر الأوامر المستخدمة لفحص التعارضات وتجهيز الحلول أو إلغاء الدمج.
للمراجعة

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

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

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

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

0/2مهام منجزة
  1. احذف علامات التعارض الثلاث من ملف index.html بعد اختيار العنوان الصحيح، ثم جهّز الملف بالأمر git add index.html وأتم الدمج عبر git commit.

  2. نفّذ الأمر git merge --abort أثناء وجود تعارض، ثم تحقق عبر git status -s -b من عودة مجلد العمل نظيفاً بالكامل.

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

مساحة التحدي

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

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

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

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

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

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

ما السبب الرئيسي لحدوث تعارض الدمج (Merge Conflict) في نظام Git؟

يحدث التعارض عندما يعدل الفرعان نفس الأسطر داخل نفس الملف بطريقتين متضاربتين منذ افتراقهما.

02

داخل الملف المتعارض، ماذا يمثل القسم المحصور بين العلامة <<<<<<< HEAD والفاصل =======؟

يمثل نسخة الكود الموجودة في فرعك النشط الحالي (HEAD) الذي تقف عليه.

03

ما الرمز المكون من حرفين الذي يعرضه الأمر git status -s بجوار الملف الذي يعاني تعارض دمج غير محسوم؟

يشير الرمز UU إلى ملف غير مدمج تم تعديله في كلا الفرعين (Unmerged, both modified).

04

يجب الإبقاء على أسطر العلامات <<<<<<< و======= و>>>>>>> داخل الملف عند حفظ التزام حل التعارض.

خطأ؛ يجب مسح جميع أسطر علامات التعارض الثلاثة بالكامل قبل تجهيز الملف وحفظه.

05

بعد تحرير الملف المتعارض وحذف علامات التعارض، أي أمر يبلغ نظام Git رسمياً بأن التعارض قد حُل؟

يُعد تجهيز الملف بالأمر git add <file> الإشارة الرسمية لنظام Git بأن التعارض في ذلك الملف قد حُسم.

06

أي أمر يلغي فوراً عملية الدمج المتعارضة ويعيد مجلد العمل إلى حالته النظيفة قبل بدء الدمج؟

يوقف الأمر git merge --abort عملية الدمج ويعيد كل شيء إلى ما كان عليه قبل الدمج.

07

ماذا يمثل القسم المحصور بين الفاصل ======= والعلامة السفلية >>>>>>> feat-ui داخل الملف المتعارض؟

يمثل التعديلات القادمة من الفرع المراد دمجه (feat-ui).

08

يؤدي وقوع تعارض الدمج إلى تلف قاعدة بيانات الكائنات .git ومسح سجل الالتزامات.

خطأ؛ فتعارض الدمج مجرد توقف آمن وطبيعي لا يمس أي التزام محفوظ في المستودع.

09

أثناء وجود تعارض دمج في ملف، أي أمر يعتمد نسخة فرعك الحالي (HEAD) بالكامل لذلك الملف؟

يستعيد الأمر git restore --ours <file> نسخة الفرع النشط الحالي للملف المتعارض.

10

أي أمر يفحص الملفات المجهزة لاكتشاف أي بقايا منسية من علامات التعارض قبل الحفظ؟

ينبهك الأمر git diff --staged --check فوراً في حال بقاء أي علامة من علامات التعارض داخل الملفات المجهزة.