تخطَّ إلى المحتوى

٨ يوليو ٢٠٢٦

حل Merge Conflict في Git خطوة بخطوة بالعربي

شارك المقال:

تشغّل git merge أو git pull فتظهر الرسالة المخيفة:

Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.

اهدأ — لم يضِع شيء ولم ينكسر شيء. Git فقط يقول: "شخصان عدّلا نفس الأسطر، ولن أخمّن أيّهما الصحيح — قرّر أنت".

لماذا يحدث التعارض؟

Git يدمج الفروع تلقائيًّا ببراعة ما دام كل تعديل في أسطر مختلفة. التعارض يحدث فقط عندما:

  • عدّل فرعان نفس الأسطر في نفس الملف، أو
  • حذف أحدهما ملفًّا عدّله الآخر.

شكل التعارض داخل الملف

افتح الملف المذكور في الرسالة وسترى:

<<<<<<< HEAD
const tax = 0.15;        // نسختك (الفرع الحالي)
=======
const tax = 0.16;        // نسخة الفرع الآخر
>>>>>>> feature/new-tax

اقرأها هكذا:

العلامةمعناها
<<<<<<< HEADبداية نسختك الحالية
=======الفاصل بين النسختين
>>>>>>> اسم-الفرعنهاية نسخة الفرع الآخر

الحل خطوة بخطوة

1) اعرف أي الملفات متعارضة

git status
# Unmerged paths:
#   both modified:   app.js

2) افتح الملف وقرّر

احذف العلامات الثلاث واترك الكود النهائي. أمامك ثلاثة خيارات:

// الخيار أ: تُبقي نسختك
const tax = 0.15;

// الخيار ب: تأخذ نسختهم
const tax = 0.16;

// الخيار ج: تدمج بنفسك (الأفضل غالبًا)
const tax = getTaxRate(country);

⚠️ تأكد من حذف أسطر <<<<<<< و ======= و >>>>>>> كلها — نسيان واحدة منها يكسر تشغيل الكود، وهي أشهر هفوة بعد أول تعارض.

3) أعلِم Git أنك انتهيت

git add app.js          # "حللت التعارض في هذا الملف"
git commit              # يُنهي الدمج برسالة جاهزة تلقائيًا

مع git pull الحديث قد تحتاج git merge --continue بدل git commit — كلاهما يؤدي نفس الغرض.

طريق الهروب: التراجع الكامل

غير جاهز للتعامل مع التعارض الآن؟ أعد كل شيء كما كان قبل الدمج:

git merge --abort

الحل من VS Code (أسهل للمبتدئين)

عند فتح ملف متعارض في VS Code يظهر فوق كل تعارض أزرار جاهزة:

  • Accept Current Change — يُبقي نسختك.
  • Accept Incoming Change — يأخذ نسخة الفرع الآخر.
  • Accept Both Changes — يضع النسختين معًا.

وزر Resolve in Merge Editor يفتح عرضًا ثلاثيًّا (نسختك | النتيجة | نسختهم) يجعل التعارضات الكبيرة أوضح بكثير. بعد الانتهاء: git add ثم git commit كالمعتاد.

كيف تقلّل التعارضات مستقبلًا؟

  • اسحب باستمرار: git pull قبل بدء العمل وقبل أي دمج.
  • فروع صغيرة قصيرة العمر — فرع يعيش أسبوعين يتعارض حتمًا.
  • قسّم الملفات الضخمة — ملف واحد يلمسه الجميع = مصنع تعارضات.
  • نسّق مع فريقك من يعمل على أي ملف.

الخلاصة

تعارض الدمج ليس خطأً بل سؤال: "أي نسخة تريد؟". الإجابة دائمًا ثلاث خطوات: افتح الملف واحذف العلامات واترك الكود الصحيح ← git addgit commit. وإذا ضاق صدرك: git merge --abort يعيدك لنقطة البداية بأمان.

أتقن الفروع والدمج في مسار Git بالعربي، واقرأ الفرق بين Git و GitHub و حل خطأ fatal: not a git repository.

📚 مصادر رسمية للتعمّق: التوثيق الرسمي لـ Git

الأسئلة الشائعة

هل التعارض يعني أنني أفسدت المشروع؟

إطلاقًا — التعارض سلوك طبيعي ومتوقع في العمل الجماعي. Git يتوقف ويطلب رأيك فقط لأنه لا يستطيع أن يقرر بالنيابة عنك أي نسخة من السطر هي الصحيحة. لا شيء ضاع، وكل شيء قابل للتراجع بـ git merge --abort.

ماذا تعني علامات <<<<<<< HEAD و ======= و >>>>>>>؟

ما بين <<<<<<< HEAD و ======= هو نسختك الحالية (الفرع الذي تدمج إليه)، وما بين ======= و >>>>>>> هو نسخة الفرع الآخر القادمة. مهمتك حذف العلامات الثلاث وإبقاء الكود النهائي — نسختك أو نسختهم أو مزيجًا منهما.

كيف أقلل تعارضات الدمج مستقبلًا؟

اسحب التحديثات باستمرار (git pull) قبل بدء العمل وقبل الدمج، واجعل الفروع صغيرة وقصيرة العمر، وقسّم الملفات الضخمة — فالتعارض لا يحدث إلا عندما يلمس شخصان نفس الأسطر قبل أن يرى أحدهما تعديل الآخر.

اقرأ أيضًا

تصفّح كل المقالات في المدوّنة، أو ابدأ التعلّم من المسارات و خرائط الطريق.