في هذا الدرس 6تصفّح المواضيع
في أغلب الأحيان، ينجح Git في دمج التعديلات الموزعة على ملفات مختلفة أو حتى فقرات متباعدة داخل نفس الملف تلقائياً. لكن تعارض الدمج (Merge Conflict) يقع في حالتين محددتين:
- تعديل نفس السطر بطريقتين مختلفتين: عندما يغيّر الفرع الحالي (
HEAD) والفرع المراد دمجه نفس الأسطر البرمجية داخل نفس الملف منذ افتراقهما عن الجد المشترك. - تعارض الحذف مع التعديل: عندما يحذف أحد الفرعين ملفاً بينما يجري الفرع الآخر تعديلات داخل ذلك الملف.
وبدلاً من التخمين العشوائي وإتلاف الكود، يوقف Git عملية الدمج مؤقتاً ويطلب منك اتخاذ القرار الهندسي بالحسم.
# 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(نسخة الفرع القادم): تمثل الأسطر المحصورة بين الفاصل الأوسط وهذه العلامة الكود القادم من الفرع الذي تحاول دمجه.
<<<<<<< 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): يعرض المقاطع المتعارضة التي لم تُحسم بعد فقط.
# List unmerged files with short UU status code
git status -s
# Inspect unresolved conflict lines directly
git diff
يتم حسم تعارض الدمج وإتمام العملية عبر أربع خطوات عملية مرتبة:
- تحرير المحتوى البرمجي: افتح الملف المتعارض وقرر الإبقاء على نسخة الفرع الحالي، أو نسخة الفرع القادم، أو كتابة سطر يدمج الميزتين معاً.
- مسح علامات التعارض الثلاث بالكامل: احذف أسطر
<<<<<<<و=======و>>>>>>>تماماً حتى يظل الكود البرمجي النظيف فقط. - تجهيز الملف المحسوم (
git add <file>): يُعد تشغيلgit addالإشارة الرسمية لنظام Git بأن التعارض في هذا الملف قد انتهى. - حفظ التزام الدمج (
git commit): سجّل التزام الدمج النهائي لإغلاق العملية بنجاح.
# After removing <<<<<<<, =======, and >>>>>>> markers:
git add index.html
git status -s
git commit -m "Merge feat-pricing and resolve heading"
أحياناً تبدأ عملية الدمج ثم تكتشف أنك اخترت الفرع الخطأ، أو أن التعارض يتطلب مراجعة زميلك في الفريق قبل حسمه.
في أي لحظة قبل تنفيذ التزام الدمج، يمكنك تشغيل الأمر المنقذ git merge --abort؛ حيث يلغي Git عملية الدمج فوراً، ويمسح علامات التعارض، ويعيد مجلد العمل ومنطقة التجهيز إلى حالتهما الأصلية النظيفة قبل بدء الدمج تماماً.
# 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Merge Conflict تعارض الدمج
- توقف مؤقت في عملية الدمج يحدث عندما يعدل فرعان نفس الأسطر البرمجية بطريقتين متضاربتين.
- للمراجعة
- 02 Conflict Markers علامات التعارض
- الأسطر الاسترشادية الثلاثة التي يدرجها Git داخل الملف المتعارض لبيان نسخة الفرع الحالي والفرع القادم.
- للمراجعة
- 03 Unmerged Path (UU) المسار غير المدمج (UU)
- ملف يشهد تعارضاً حالياً ويظهر بالرمز UU في الحالة المختصرة بانتظار تحريره وتجهيزه.
- للمراجعة
- 04 Merge Abort إلغاء الدمج
- تشغيل الأمر git merge --abort لإلغاء عملية الدمج المتعارضة واستعادة حالة المستودع النظيفة قبل الدمج.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات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
- واجهة سطر الأوامر المستخدمة لفحص التعارضات وتجهيز الحلول أو إلغاء الدمج.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
احذف علامات التعارض الثلاث من ملف index.html بعد اختيار العنوان الصحيح، ثم جهّز الملف بالأمر git add index.html وأتم الدمج عبر git commit.
-
نفّذ الأمر git merge --abort أثناء وجود تعارض، ثم تحقق عبر git status -s -b من عودة مجلد العمل نظيفاً بالكامل.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي10 أسئلة تنتظرك +
ما السبب الرئيسي لحدوث تعارض الدمج (Merge Conflict) في نظام Git؟
يحدث التعارض عندما يعدل الفرعان نفس الأسطر داخل نفس الملف بطريقتين متضاربتين منذ افتراقهما.
داخل الملف المتعارض، ماذا يمثل القسم المحصور بين العلامة <<<<<<< HEAD والفاصل =======؟
يمثل نسخة الكود الموجودة في فرعك النشط الحالي (HEAD) الذي تقف عليه.
ما الرمز المكون من حرفين الذي يعرضه الأمر git status -s بجوار الملف الذي يعاني تعارض دمج غير محسوم؟
يشير الرمز UU إلى ملف غير مدمج تم تعديله في كلا الفرعين (Unmerged, both modified).
يجب الإبقاء على أسطر العلامات <<<<<<< و======= و>>>>>>> داخل الملف عند حفظ التزام حل التعارض.
خطأ؛ يجب مسح جميع أسطر علامات التعارض الثلاثة بالكامل قبل تجهيز الملف وحفظه.
بعد تحرير الملف المتعارض وحذف علامات التعارض، أي أمر يبلغ نظام Git رسمياً بأن التعارض قد حُل؟
يُعد تجهيز الملف بالأمر git add <file> الإشارة الرسمية لنظام Git بأن التعارض في ذلك الملف قد حُسم.
أي أمر يلغي فوراً عملية الدمج المتعارضة ويعيد مجلد العمل إلى حالته النظيفة قبل بدء الدمج؟
يوقف الأمر git merge --abort عملية الدمج ويعيد كل شيء إلى ما كان عليه قبل الدمج.
ماذا يمثل القسم المحصور بين الفاصل ======= والعلامة السفلية >>>>>>> feat-ui داخل الملف المتعارض؟
يمثل التعديلات القادمة من الفرع المراد دمجه (feat-ui).
يؤدي وقوع تعارض الدمج إلى تلف قاعدة بيانات الكائنات .git ومسح سجل الالتزامات.
خطأ؛ فتعارض الدمج مجرد توقف آمن وطبيعي لا يمس أي التزام محفوظ في المستودع.
أثناء وجود تعارض دمج في ملف، أي أمر يعتمد نسخة فرعك الحالي (HEAD) بالكامل لذلك الملف؟
يستعيد الأمر git restore --ours <file> نسخة الفرع النشط الحالي للملف المتعارض.
أي أمر يفحص الملفات المجهزة لاكتشاف أي بقايا منسية من علامات التعارض قبل الحفظ؟
ينبهك الأمر git diff --staged --check فوراً في حال بقاء أي علامة من علامات التعارض داخل الملفات المجهزة.