الخطوات
-
1
ابدأ الدمج واقرأ رسالة الخطأ
عندما يكتشف Git تعارضًا أثناء
git mergeأوgit pull، يتوقف في منتصف الدمج ويطبع الملفات المتعارضة. لم يُنجز أي commit بعد.bashgit merge feature/user-auth # CONFLICT (content): Merge conflict in src/auth.js # Automatic merge failed; fix conflicts and then commit the result. -
2
حدد كل الملفات المتعارضة
تُدرج
git statusجميع الملفات المتعارضة تحت Unmerged paths. هذه هي الملفات الوحيدة التي تحتاج لتعديلها — كل شيء آخر تم دمجه بنجاح.bashgit status # both modified: src/auth.js # both modified: config/app.js -
3
افهم علامات التعارض
افتح كل ملف متعارض. يُغلف Git النسختين المتنافستين بعلامات: كل شيء بين
<<<<<<< HEADو=======هو ما يحتويه فرعك الحالي؛ وكل شيء بين=======و>>>>>>> feature/user-authهو ما يأتي به الفرع الوارد.bash<<<<<<< HEAD const timeout = 3000; ======= const timeout = 5000; >>>>>>> feature/user-auth -
4
عدّل الملف إلى حالته النهائية الصحيحة
احذف علامات التعارض والأسطر الفاصلة الثلاثة. اكتب ما يجب أن يحتويه الملف بالضبط — قد يكون من أحد الجانبين أو مزيجًا منهما. احفظ الملف.
bash// تم الحل: نحتفظ بالـ timeout الأطول من فرع الميزة const timeout = 5000; -
5
ضع كل ملف في الـ staging وأتمم الـ commit
بعد الحفظ، أضف الملف المُحلَّ بـ
git add. حين تُضاف جميع الملفات المتعارضة إلى الـ staging، أتمم commit الدمج. الإصدارات الحديثة من Git تستخدمgit merge --continue؛ الإصدارات الأقدم تستخدمgit commit.bashgit add src/auth.js git add config/app.js # Git الحديث (2.12+) git merge --continue # أو ببساطة: git commit -
6
استخدم VS Code أداةً بصرية للدمج
الأدوات البصرية تُقلل خطر ترك علامة تعارض بالخطأ في الملف. اضبط VS Code كأداة دمج افتراضية، وسيفتحها مع أزرار Accept Current / Accept Incoming / Accept Both.
bashgit config --global merge.tool vscode git config --global mergetool.vscode.cmd 'code --wait $MERGED' # ثم أثناء وجود تعارض: git mergetool -
7
ألغِ الدمج كليًا عند الحاجة
إذا كان التعارض معقدًا للغاية لحله الآن، تراجع تمامًا. يُعيد هذا الأمر الملفات والـ index إلى حالتهما قبل تشغيل
git merge.bashgit merge --abort # المستودع عاد إلى حالته قبل الدمج -
8
فعّل rerere لتذكر طريقة الحل
rerere(إعادة استخدام الحل المسجّل) يحفظ طريقة حل التعارض ليُعيد تطبيقها تلقائيًا إذا ظهر نفس التعارض مجددًا — وهو شائع في الفروع طويلة الأمد التي تُعاد ترتيبها (rebase) بشكل متكرر.bashgit 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 "<<<<<<<" .</code>
خاتمة
تعارضات الدمج جزء طبيعي من التطوير التعاوني — وليست حالة طوارئ. الخطوات دائمًا واحدة: اقرأ git status، صحح العلامات، git add، ثم git merge --continue. أفضل استراتيجية على المدى الطويل هي الوقاية: فروع قصيرة، وسحب متكرر، وتفعيل rerere حتى تحل التعارضات المتكررة نفسها تلقائيًا.