A دمج الصراع يحدث عندما يتعذر على Git دمج التغييرات تلقائيًا لأن فرعين قاما بتعديل نفس الأسطر بشكل مختلف. إنه جزء طبيعي من التعاون – وليس خطأ، فقط Git يطلب منك اتخاذ القرار. وإليك كيفية حل النزاعات بثقة.
📋 Table of Contents
ما الذي يسبب تعارض الدمج
عندما تقوم بالدمج (أو إعادة الأساس، أو السحب) ويقوم كلا الفرعين بتغيير نفس الجزء من الملف بشكل مختلف، لا يستطيع Git تحديد التغيير الذي يجب الاحتفاظ به – لذلك يتوقف ويسألك. سترى:
$ git merge feature-branch
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.
فهم علامات الصراع
<<<<<<< HEAD
const greeting = "Hello from main branch";
=======
const greeting = "Hi from feature branch";
>>>>>>> feature-branch
// The markers mean:
// <<<<<<< HEAD → your current branch's version (above =======)
// ======= → divider
// >>>>>>> feature-branch → the incoming branch's version (below =======)
حل خطوة بخطوة
# 1. See which files have conflicts
git status
# Unmerged paths:
# both modified: app.js
# 2. Open each conflicted file and find the conflict markers
# 3. Edit the file to the desired final state - choose one version,
# combine both, or write something new. REMOVE the markers.
# Before (with markers):
<<<<<<< HEAD
const greeting = "Hello from main branch";
=======
const greeting = "Hi from feature branch";
>>>>>>> feature-branch
# After (resolved - you decided):
const greeting = "Hi from feature branch";
# 4. Stage the resolved file
git add app.js
# 5. Complete the merge
git commit # opens editor with a default merge message, or:
git commit -m "Merge feature-branch, resolve greeting conflict"
حل النزاعات المتعددة
# A file (or several) may have multiple conflict sections.
# Find them all:
grep -n "<<<<<<<" app.js # find conflict markers
# Resolve each section, then verify none remain:
grep -rn "<<<<<<<\|=======\|>>>>>>>" .
# Should return nothing when all conflicts are resolved
# Then stage all resolved files and commit
git add .
git commit
باستخدام أداة الدمج
# Configure and use a visual merge tool (easier for complex conflicts)
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# Launch the tool for conflicts
git mergetool
# VS Code (or your tool) shows current/incoming/result panes for easy resolution
# VS Code also has built-in conflict resolution - it shows
# "Accept Current / Accept Incoming / Accept Both" buttons inline
إحباط الدمج
# If you want to cancel the merge and start over
git merge --abort
# Returns your branch to the state before the merge - nothing changed
# For a conflicted rebase:
git rebase --abort
# For a conflicted pull:
git merge --abort # (a pull is a fetch + merge)
حل النزاعات أثناء إعادة البناء
# Rebase conflicts are resolved similarly, but per-commit:
git rebase main
# CONFLICT in app.js
# 1. Resolve the conflict in the file
# 2. Stage it
git add app.js
# 3. Continue the rebase (NOT commit)
git rebase --continue
# Repeat if more commits have conflicts
منع الصراعات
- اسحب بشكل متكرر: البقاء على اطلاع بالفرع الرئيسي يقلل من التباعد والصراعات
- قم بتنفيذ التزامات أصغر ومركزة: أسهل في الدمج من التغييرات الشاملة الكبيرة
- التواصل مع فريقك: قم بتنسيق من يعمل على ما لتجنب تداخل التغييرات
- الدمج/إعادة الأساس بشكل متكرر: قم بدمج التغييرات بانتظام بدلاً من ترك الفروع تتباعد لأسابيع
- إبقاء الفروع قصيرة العمر: الفروع طويلة الأمد تتراكم الصراعات
الأسئلة المتداولة
س: ماذا تعني علامات الصراع؟
A: <<<<<<< HEAD يبدأ إصدار فرعك الحالي،======= يقسمه من النسخة الواردة، و>>>>>>> branch-name ينهي النسخة الواردة. قم بتحرير الملف إلى الحالة النهائية التي تريدها وقم بإزالة العلامات الثلاثة جميعها، ثم قم بالمرحلة والالتزام.
س: كيف أختار الإصدار الذي سأحتفظ به؟
ج: افهم ما يفعله كل تغيير، ثم قرر: احتفظ بتغييرك، أو احتفظ بتغييره، أو اجمع بين الاثنين، أو اكتب شيئًا جديدًا. لا توجد إجابة تلقائية “صحيحة” – يعتمد الأمر على ما يجب أن يفعله الكود. عندما لا تكون متأكدًا، اسأل الشخص الذي أجرى التغيير الآخر. تحرير إلى الحالة النهائية الصحيحة.
س: لقد أخطأت في الحل. كيف أبدأ من جديد؟
ج: إذا لم تكن قد التزمت بعد، قم بتشغيلgit merge --abort (أوgit rebase --abort) للإلغاء والعودة إلى حالة ما قبل الدمج. ثم ابدأ الدمج مرة أخرى. إذا قمت بالفعل بتنفيذ دقة سيئة، فيمكنك التراجع عن التزام الدمج أو إعادة تعيينه.
س: كيف أعرف أن جميع التعارضات قد تم حلها؟
ج: تشغيلgit status (لا توجد مسارات غير مدمجة متبقية) وابحث عن العلامات المتبقية:grep -rn "<<<<<<<" . يجب أن يعود شيئا. تتسبب علامات التعارض المتبقية في الملفات في حدوث أخطاء، لذا تأكد دائمًا من عدم بقاء أي منها قبل الالتزام.
س: لماذا أستمر في الحصول على نفس التعارض أثناء إعادة الأساس؟
ج: يطبق Rebase التزاماتك واحدًا تلو الآخر، لذلك يمكن أن يتكرر التعارض عبر التزامات متعددة تلامس نفس الرمز. حل كل،git addوgit rebase --continue. إذا كان الأمر متكررًا حقًا، فكر فيgit rerere (إعادة استخدام الدقة المسجلة) أو الدمج بدلاً من إعادة التأسيس.
الخلاصة
تعد تعارضات الدمج جزءًا طبيعيًا من التعاون، وليست أخطاء – يطلب منك Git أن تقرر متى قام فرعان بتغيير نفس الكود بشكل مختلف. عملية الحل:البحث عن الملفات المتعارضة معgit status، افتحها وحدد موقع علامات التعارض (<<<<<<< HEAD / ======= / >>>>>>>)، وقم بالتحرير إلى الحالة النهائية المطلوبة بإزالة العلامات، ثمgit add وgit commit. استخدم أداة الدمج المرئي (VS Code) للتعارضات المعقدة وgit merge --abort للبدء من جديد إذا لزم الأمر. أثناء إعادة الأساس، قم بحل كل التزام واستخدمgit rebase --continue. منع الصراعات عن طريق السحب بشكل متكرر، والقيام بالتزامات صغيرة، والحفاظ على الفروع قصيرة الأجل. بمجرد فهم العلامات والعملية، تصبح الصراعات روتينية – فقط يطلب Git اتخاذ القرار الذي أنت مستعد لاتخاذه.
🔗 Share this article
✍️ Leave a Comment