ตัวอย่างบทเรียน

نزاعات الدمج: لا داعي للذعر — افهمها وحُلّها

تخيف نزاعات الدمج المبتدئين، لكن بعد هذا القسم ستواجهونها بهدوء. سنشرح لماذا تنشأ النزاعات (Git لا يقرأ الأفكار — لا يعرف أي تغيير أهم)، وكيفية قراءة علامات النزاع، وكيفية اختيار الحل المناسب. وسنعرض نهجين: الحل اليدوي واستخدام أدوات الدمج.

نزاع الدمج علامات النزاع حل النزاع
คุณจะเรียนรู้อะไรในบทเรียนนี้
  • ستفهم طبيعة نزاعات الدمج وتتوقف عن الخوف منها — ستصبح قابلة للتوقع.
  • ستتمكن من حل النزاع يدويًا بنفسك بعد قراءة علامات Git بشكل صحيح.
  • ستتعلم كيفية إعداد أداة الدمج في محررك لحل النزاعات بصريًا.

จุดเริ่มต้นของบทเรียน

أنواع تعارضات الدمج الثلاثة

  • تعارضات المحتوى: تغييرات في الأسطر نفسها
  • تعارضات إعادة التسمية: تغيّر الملف وأُعيدت تسميته
  • تعارضات الحذف: حُذف الملف في فرع، وتغيّر في فرع آخر
  • إعادة التسمية هي الأكثر خداعاً بالنسبة إلى Git
  • افحصوا سجل الملف عند ظهور تعارضات غير مألوفة

تخيّلوا أنكم تعملون على مشروع تقني مهم، وفجأة ينبهكم Git إلى وجود تعارض. أول خطوة للحل هي معرفة نوعه. تحدث تعارضات المحتوى عندما تؤثر التغييرات في الأسطر نفسها عبر فرعين مختلفين. أما إعادة التسمية فتكون أصعب: أحد المطوّرين يغيّر اسم الملف، بينما يحرّر مطوّر آخر محتواه في الوقت نفسه. النوع الثالث هو الحذف، عندما يختفي الملف في فرع ويبقى موجوداً في فرع آخر. وغالباً ما تكون إعادة التسمية أكثر الأنواع إرباكاً لـ Git، لأنه لا يتبع تاريخ الملف بعد تغيير الاسم دائماً بدقة. لذلك، عند أي تعارض يبدو غريباً، افحصوا سجل تغييرات الملف.

تشريح تعارض معقّد

  • علامات <<<<<<< تُظهر تغييراتكم
  • ======= تفصل بين نسختكم ونسخة الآخرين
  • >>>>>>> تشير إلى نهاية كتلة التعارض
  • git status سيُظهر كل الملفات المتأثرة بالمشكلة
  • git diff يعطي مقارنة تفصيلية للتغييرات

لنفترض أنكم تدمجون فرع feature في main وظهرت رسالة تعارض. افتحوا الملفات المتأثرة؛ ستلاحظون علامات خاصة. كل ما يقع بين <<<<<<< HEAD و ======= هو تغييراتكم. وما يقع بين ======= و >>>>>>> feature هو التغييرات القادمة من الفرع الذي تدمجونه. استخدموا git status لمعرفة كل الملفات التي فيها تعارضات، واستخدموا git diff لاستعراض الفروقات بتفصيل أكبر. وتذكروا: العلامات ليست خطأً بحد ذاتها، بل إرشاد يوضح أين يجب اتخاذ القرار.

#!/bin/bash
# conflict_analysis.sh

echo "ننشئ مستودعاً اختبارياً"
mkdir conflict-demo && cd conflict-demo
git init

echo "ننشئ ملفاً وننشئ الالتزام الأول في main"
echo 'Line 1' > file.txt
echo 'Line 2' >> file.txt
git add . && git commit -m 'الالتزام الأول'

echo "ننشئ فرع feature ونعدّل السطر الأول"
git checkout -b feature
sed -i 's/Line 1/Line 1 modified in feature/' file.txt
git commit -am 'تعديل السطر 1 في feature'

echo "نعود إلى main ونعدّل السطر نفسه"
git checkout main
sed -i 's/Line 1/Line 1 modified in main/' file.txt
git commit -am 'تعديل السطر 1 في main'

echo "نحاول دمج الفرعين"
git merge feature || echo 'تعارض!'

echo "\nنراجع الحالة:"
git status --short

echo "\nنعرض الملف المتعارض:"
cat file.txt

استراتيجيات حل التعارضات

  • التعديل اليدوي: إزالة العلامات والاحتفاظ باللازم
  • أدوات الواجهة الرسومية: مثل meld و kdiff3 للمقارنة المرئية
  • --ours/--theirs: قبول نسختكم أو نسخة الآخرين
  • في rebase تُحل التعارضات لكل التزام على حدة
  • بعد الحل — لا تنسوا git add و git commit

عند اكتشاف التعارض، أمامكم عدة خيارات. يمكنكم فتح الملف وتعديله يدوياً بحذف علامات التعارض والاحتفاظ بالكود المناسب. ولمن يفضلون العرض المرئي، توجد أدوات مثل meld أو kdiff3 تعرض نسخ الملف الثلاث في وقت واحد. وإذا كنتم متأكدين من تغييراتكم، استخدموا git checkout --ours لإبقاء نسختكم، أو --theirs لقبول نسخة الفرع الآخر. وانتبهوا جيداً عند استخدام rebase، إذ قد تظهر التعارضات في كل التزام يتم إعادة بنائه. بعد اختيار الحل المناسب، أضيفوا الملف وأكملوا الالتزام.

#!/bin/bash
# resolve_strategies.sh

echo "الطريقة 1: الحل اليدوي"
echo 'عدّل الملف بحذف علامات التعارض'
echo 'ثم نفّذ: git add file.txt'

echo "\nالطريقة 2: قبول نسختنا"
git checkout --ours file.txt

echo "\nالطريقة 3: قبول نسختهم"
git checkout --theirs file.txt

echo "\nالطريقة 4: استخدام أداة دمج"
echo 'git mergetool --tool=meld'

echo "\nبعد اختيار الطريقة، أكمل الدمج:"
echo 'git commit -m "حل تعارض الدمج"'

บทเรียนฉบับเต็มใช้ได้เมื่อสมัครสมาชิก

ฉบับเต็มมีสไลด์เพิ่มอีก 34 สไลด์

วิดีโอ สไลด์ทั้งหมด โน้ต แบบทดสอบ AI ติวเตอร์ และการสัมภาษณ์จะเปิดหลังเข้าสู่ระบบและสมัครสมาชิก

เข้าสู่ระบบหรือลงทะเบียน สมัครสมาชิก

เนื้อหาบทเรียน

  1. أنواع تعارضات الدمج الثلاثة
  2. تشريح تعارض معقّد
  3. استراتيجيات حل التعارضات
  4. الوقاية وأفضل الممارسات
  5. كيف تقرؤون تعارضات Git متعددة الأسطر
  6. فك رموز العلامات السياقية
  7. التعارضات المتداخلة: استراتيجيات الحل
  8. الأتمتة والأدوات المتقدمة
  9. استراتيجية الاختيار: HEAD أم الفرع؟
  10. مبدأ «أقل مفاجأة»
  11. الصراعات الدلالية: أعداء غير مرئيين
  12. الأدوات والأتمتة
  13. اختيار الأداة: متى نستخدم كل أداة؟
  14. VS Code: الإعدادات والميزات المتقدمة
  15. Beyond Compare: سيناريوهات للصراعات المعقدة
  16. التكامل مع Git Flow والأتمتة
  17. أتمتة الدمج عبر .gitattributes
  18. كتابة merge driver خاص
  19. Git rerere — مساعدك الشخصي
  20. استراتيجيات متقدمة للأتمتة
  21. تصميم سير العمل للفرق الكبيرة
  22. مراجعة الكود كأداة لمنع التعارضات
  23. استراتيجيات العمل مع فروع feature طويلة العمر
  24. أدوات وأتمتة حل تعارضات الدمج
  25. مخاطر قبول التغييرات بلا تمحيص
  26. استراتيجيات آمنة لحل التعارضات
  27. اختبار ما بعد الدمج: ماذا نتحقق؟
  28. التكامل مع CI/CD والإجراءات الوقائية
  29. كيف تختلف تعارضات rebase عن merge
  30. العمل مع --rebase-merges
  31. استراتيجيات حل التعارضات المتتالية
  32. تقنيات متقدمة واستكشاف أخطاء rebase
  33. CI/CD كنظام لضمان الجودة
  34. GitHub Actions: فحص التعارضات
  35. Danger-JS: أتمتة ذكية للفحوصات
  36. الحل الآلي للتعارضات في CI/CD
  37. التعارضات: من الذعر إلى الثقة

บทความเกี่ยวกับบทเรียนนี้

บทเรียนทั้งหมดในคอร์สนี้

  1. مقدمة: Git من الصفر إلى مُطوّر محترف
  2. لماذا نحتاج إلى Git على الإطلاق — ولماذا لا يُقدّم عليك العمل دونه
  3. تثبيت وإعداد Git لأول استخدام
  4. المستودع الأول: init وadd وcommit وسحر الفهرس
  5. قراءة سجل المشروع: أوامر log و diff و show والتنقل في السجل
  6. الفروع: الواقع الموازي لرمزك البرمجي
  7. إلغاء الأخطاء: الأوامر restore، reset، revert — الاستخدام الصحيح والخطير
  8. GitHub والمستودعات البعيدة: كودك في السحابة
  9. العمل الجماعي: النسخ المتفرعة، الفروع المميزة وطلبات السحب
  10. نزاعات الدمج: لا داعي للذعر — افهمها وحُلّها
  11. سير عمل Git في الفرق الحقيقية: أي سير عمل تختار
  12. الأدوات المتقدمة: rebase، stash، cherry-pick والعلامات (tags)
  13. المشروع النهائي: محاكاة التطوير الجماعي الفعلي