البرمجة متوسط 9 دقيقة

كيفية حل تعارض الدمج في Git دون فقدان عملك

تحدث تعارضات الدمج عندما يُعدِّل فرعان السطور نفسها في الملف نفسه. لا يستطيع Git تحديد أي نسخة يحتفظ بها، لذا يتوقف ويطلب منك الاختيار. علامات التعارض التي يتركها في ملفاتك تبدو مقلقة في البداية، لكن عملية الحل تصبح آلية بمجرد أن تفهم النمط.

الخطوات

  1. 1

    ابدأ الدمج واقرأ رسالة الخطأ

    عندما يكتشف Git تعارضًا أثناء git merge أو git pull، يتوقف في منتصف الدمج ويطبع الملفات المتعارضة. لم يُنجز أي commit بعد.

    bash
    git merge feature/user-auth
    # CONFLICT (content): Merge conflict in src/auth.js
    # Automatic merge failed; fix conflicts and then commit the result.
  2. 2

    حدد كل الملفات المتعارضة

    تُدرج git status جميع الملفات المتعارضة تحت Unmerged paths. هذه هي الملفات الوحيدة التي تحتاج لتعديلها — كل شيء آخر تم دمجه بنجاح.

    bash
    git status
    # both modified:   src/auth.js
    # both modified:   config/app.js
  3. 3

    افهم علامات التعارض

    افتح كل ملف متعارض. يُغلف Git النسختين المتنافستين بعلامات: كل شيء بين <<<<<<< HEAD و======= هو ما يحتويه فرعك الحالي؛ وكل شيء بين ======= و>>>>>>> feature/user-auth هو ما يأتي به الفرع الوارد.

    bash
    <<<<<<< HEAD
    const timeout = 3000;
    =======
    const timeout = 5000;
    >>>>>>> feature/user-auth
  4. 4

    عدّل الملف إلى حالته النهائية الصحيحة

    احذف علامات التعارض والأسطر الفاصلة الثلاثة. اكتب ما يجب أن يحتويه الملف بالضبط — قد يكون من أحد الجانبين أو مزيجًا منهما. احفظ الملف.

    bash
    // تم الحل: نحتفظ بالـ timeout الأطول من فرع الميزة
    const timeout = 5000;
  5. 5

    ضع كل ملف في الـ staging وأتمم الـ commit

    بعد الحفظ، أضف الملف المُحلَّ بـ git add. حين تُضاف جميع الملفات المتعارضة إلى الـ staging، أتمم commit الدمج. الإصدارات الحديثة من Git تستخدم git merge --continue؛ الإصدارات الأقدم تستخدم git commit.

    bash
    git add src/auth.js
    git add config/app.js
    
    # Git الحديث (2.12+)
    git merge --continue
    
    # أو ببساطة:
    git commit
  6. 6

    استخدم VS Code أداةً بصرية للدمج

    الأدوات البصرية تُقلل خطر ترك علامة تعارض بالخطأ في الملف. اضبط VS Code كأداة دمج افتراضية، وسيفتحها مع أزرار Accept Current / Accept Incoming / Accept Both.

    bash
    git config --global merge.tool vscode
    git config --global mergetool.vscode.cmd 'code --wait $MERGED'
    
    # ثم أثناء وجود تعارض:
    git mergetool
  7. 7

    ألغِ الدمج كليًا عند الحاجة

    إذا كان التعارض معقدًا للغاية لحله الآن، تراجع تمامًا. يُعيد هذا الأمر الملفات والـ index إلى حالتهما قبل تشغيل git merge.

    bash
    git merge --abort
    # المستودع عاد إلى حالته قبل الدمج
  8. 8

    فعّل rerere لتذكر طريقة الحل

    rerere (إعادة استخدام الحل المسجّل) يحفظ طريقة حل التعارض ليُعيد تطبيقها تلقائيًا إذا ظهر نفس التعارض مجددًا — وهو شائع في الفروع طويلة الأمد التي تُعاد ترتيبها (rebase) بشكل متكرر.

    bash
    git config --global rerere.enabled true
    # من الآن فصاعدًا، تُسجَّل التعارضات المحلولة في .git/rr-cache/
    # وتُطبَّق تلقائيًا على التعارضات المماثلة في المستقبل.

نصائح ومحاذير

  • اسحب من الفرع الأساسي بشكل متكرر (<code>git pull origin main</code>) لإبقاء فرعك قريبًا من main — كلما كان الـ diff أصغر كانت التعارضات أقل.
  • احتفظ بالفروع قصيرة الأمد. الفرع المفتوح لأسبوعين هو تعارض قادم لا محالة.
  • إذا كان التعارض يمتد لمئات الأسطر، شغّل <code>git merge --abort</code> وتحدث مع مؤلف التعديل المتعارض قبل المتابعة.
  • ابحث عن علامات التعارض المتبقية قبل الـ commit: <code>grep -r "&lt;&lt;&lt;&lt;&lt;&lt;&lt;" .</code>

خاتمة

تعارضات الدمج جزء طبيعي من التطوير التعاوني — وليست حالة طوارئ. الخطوات دائمًا واحدة: اقرأ git status، صحح العلامات، git add، ثم git merge --continue. أفضل استراتيجية على المدى الطويل هي الوقاية: فروع قصيرة، وسحب متكرر، وتفعيل rerere حتى تحل التعارضات المتكررة نفسها تلقائيًا.

#Git #Merge
العودة إلى جميع الأدلة

هل تحتاج مساعدة في مشروعك؟

احجز استشارة مجانية لمدة 30 دقيقة لمناقشة تحدياتك التقنية واستكشاف الحلول معًا.