Git & GitHub📅 2026-11-28⏱ 8 دقائق قراءة🔧 مقال 8 من 10

حل التعارضات في Git — دليل شامل 2026

دليل عملي مفصل لحل التعارضات في Git — أنواع التعارضات، الأخطاء الشائعة، وأدوات المساعدة

في المقال السابق، تعلمت Pull Requests. الآن سنتعلم حل التعارضات (Conflicts) — وهي المهارة الأهم للعمل الجماعي الناجح.

في هذا الدليل العملي، سنأخذك خطوة بخطوة لفهم التعارضات وحلها، مع تمارين وحلول.

ما هو التعارض (Conflict)؟

التعارض يحدث عندما يعدّل شخصان نفس السطر في نفس الملف، ولا يستطيع Git الدمج تلقائياً.

مثال بسيط:

main:

<h1>الرئيسية</h1>

feature:

<h1>الصفحة الرئيسية</h1>

Git لا يعرف: أي نسخة يفوز؟

النتيجة: CONFLICT.

متى تحدث التعارضات؟

السببمثال
نفس السطرشخصان عدّلا نفس السطر
حذف مقابل تعديلشخص حذف، آخر عدّل
إضافة متعارضةشخصان أضافا شيئاً في نفس المكان
ملفات ثنائيةصور، فيديو، إلخ

كيف يبدو التعارض؟

عند حدوث تعارض، Git يضيف علامات للملف:

<<<<<<< HEAD
<h1>الرئيسية</h1>
=======
<h1>الصفحة الرئيسية</h1>
>>>>>>> feature/branch

التفسير:

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

السيناريو الكامل

الخطوة 1: أنشئ تعارضاً

# 1. على main
git checkout main
echo "<h1>الرئيسية</h1>" > index.html
git add .
git commit -m "docs: الرئيسية"

# 2. أنشئ فرعاً
git checkout -b feature/update
echo "<h1>الصفحة الرئيسية</h1>" > index.html
git add .
git commit -m "feat: تحديث العنوان"

# 3. ارجع لـ main وعدّل
git checkout main
echo "<h1>الصفحة الأولى</h1>" > index.html
git add .
git commit -m "docs: تعديل آخر"

# 4. ادمج
git merge feature/update

النتيجة:

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

🎯 التعارض حدث!

الخطوة 2: اعرض الحالة

git status

النتيجة:

On branch main
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   index.html

الخطوة 3: افتح الملف

index.html:

<<<<<<< HEAD
<h1>الصفحة الأولى</h1>
=======
<h1>الصفحة الرئيسية</h1>
>>>>>>> feature/update

الخطوة 4: حل التعارض

اختر أحد الخيارات:

خيار 1: احتفظ بنسختك

<h1>الصفحة الأولى</h1>

خيار 2: احتفظ بنسخة الفرع

<h1>الصفحة الرئيسية</h1>

خيار 3: ادمج النسختين

<h1>الصفحة الرئيسية الأولى</h1>

⚠️ مهم: احذف كل علامات التعارض (<<<<<<<, =======, >>>>>>>).

الخطوة 5: أضف الملف

git add index.html

الخطوة 6: أكمل الدمج

git commit -m "merge: حل تعارض في index.html"

🎉 تم حل التعارض!

أدوات حل التعارضات

1. VS Code

VS Code يعرض التعارضات بشكل مرئي:

[Accept Current Change] [Accept Incoming Change]
[Accept Both Changes] [Compare Changes]
  • Accept Current: احتفظ بنسختك.
  • Accept Incoming: احتفظ بنسخة الفرع.
  • Accept Both: ادمج الاثنين.
  • Compare: قارن.

الأفضل: استخدم VS Code — سريع وسهل.

2. Git Mergetool

git mergetool

يفتح أداة مرئية (VS Code, Meld, إلخ).

3. أداة سطر الأوامر

git diff           # عرض التعارضات
git checkout --ours index.html    # نسختك
git checkout --theirs index.html  # نسخة الفرع

إلغاء الدمج

إذا أردت التراجع:

git merge --abort

النتيجة: يعود لحالة ما قبل الدمج.

التعارضات في Rebase

نفس الطريقة:

git rebase main
# CONFLICT
# حل الملفات
git add .
git rebase --continue

للإلغاء:

git rebase --abort

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

1. حدّث بانتظام

git checkout main
git pull
git checkout feature
git merge main  # أو rebase

2. فروع قصيرة الأجل

  • ✅ أيام معدودة.
  • ❌ أسابيع.

3. فرع = ميزة = PR

لا تجمع ميزات متعددة.

4. تواصل مع الفريق

إذا كنت تعمل على نفس الملف، أبلغ الآخرين.

5. استخدم .gitattributes

*.js text eol=lf

لتوحيد نهايات الأسطر.

حل التعارضات المتقدمة

1. تعارض في الحذف

السيناريو:

  • شخص حذف ملفاً.
  • آخر عدّله.

الحل:

# احتفظ بالملف
git add file.txt

# أو احذفه
git rm file.txt

2. تعارض في إعادة التسمية

السيناريو:

  • شخص أعاد تسمية ملف.
  • آخر عدّله.

الحل: Git يعرض التعارض، اختر الأفضل.

3. تعارض في الملفات الثنائية

السيناريو: صور، فيديو.

الحل: اختر نسخة:

git checkout --ours image.png
# أو
git checkout --theirs image.png

مثال عملي: تعارض معقد

السيناريو: تعديل ملف مشترك

1. الإعداد

mkdir conflict-demo
cd conflict-demo
git init

echo "line 1" > shared.txt
echo "line 2" >> shared.txt
echo "line 3" >> shared.txt
git add . && git commit -m "initial"

2. شخص 1: عدّل السطر 2

git checkout -b feature/a
sed -i 's/line 2/line 2 modified by A/' shared.txt
git add . && git commit -m "feat: A"

3. شخص 2: عدّل السطر 2 بشكل آخر

git checkout main
sed -i 's/line 2/line 2 modified by B/' shared.txt
git add . && git commit -m "feat: B"

4. دمج

git merge feature/a
# CONFLICT

5. الملف:

line 1
<<<<<<< HEAD
line 2 modified by B
=======
line 2 modified by A
>>>>>>> feature/a
line 3

6. حل:

line 1
line 2 modified by both A and B
line 3

7. أكمل:

git add .
git commit -m "merge: حل التعارض"

أفضل الممارسات

1. لا تخف من التعارضات

التعارضات طبيعية في العمل الجماعي.

2. اقرأ بعناية

افهم ما يريد كل طرف.

3. اختبر بعد الحل

npm test
npm run build

4. اطلب المساعدة

إذا كان التعارض معقداً، استشر زميلاً.

5. استخدم VS Code

أسرع وأوضح من سطر الأوامر.

تمارين عملية

تمرين 1: تعارض بسيط

أنشئ تعارضاً وحله.

الحل:

git checkout -b feature/x
echo "X" > file.txt
git add . && git commit -m "X"

git checkout main
echo "Y" > file.txt
git add . && git commit -m "Y"

git merge feature/x
# حل التعارض

تمرين 2: إلغاء الدمج

ادمج، ألغِ.

الحل:

git merge feature/x
git merge --abort

تمرين 3: استخدام --ours

احتفظ بنسختك.

الحل:

git checkout --ours file.txt
git add file.txt

تمرين 4: استخدام --theirs

احتفظ بنسخة الفرع.

الحل:

git checkout --theirs file.txt
git add file.txt

تمرين 5: دمج النسختين

ادمج كلا النسختين.

الحل: افتح الملف، اجمع المحتوى، احذف العلامات.

تمرين 6: VS Code

حل تعارضاً بـ VS Code.

الحل:

  • افتح الملف.
  • اختر Accept Both Changes.
  • احفظ.
  • git add ثم git commit.

تمرين 7: Rebase

حل تعارضاً في rebase.

الحل:

git rebase main
# حل
git add .
git rebase --continue

تمرين 8: مشروع كامل

أنشئ 3 فروع متعارضة، وحلها.

الحل:

# فرع 1
git checkout -b f1
# عدّل
# فرع 2
git checkout main
git checkout -b f2
# عدّل نفس المكان
# فرع 3
git checkout main
git checkout -b f3
# عدّل نفس المكان
# دمج
git checkout main
git merge f1
git merge f2  # تعارض
# حل
git merge f3  # تعارض
# حل

حل المشاكل الشائعة

🔴 المشكلة 1: CONFLICT

الحل:

  1. افتح الملف.
  2. حل التعارض.
  3. احذف العلامات.
  4. git add.
  5. git commit.

🔴 المشكلة 2: You have not concluded your merge

السبب: بدأت merge ولم تُكمله.

الحل:

git status
# أكمل أو:
git merge --abort

🔴 المشكلة 3: error: you need to resolve your current index first

الحل: أكمل merge أو ألغِه.

🔴 المشكلة 4: تعارضات كثيرة

الحل: استخدم git mergetool أو VS Code.

🔴 المشكلة 5: لا أستطيع الدفع

الحل:

git pull
# حل التعارضات
git push

جدول أوامر التعارضات

الأمرالوظيفة
git statusعرض الملفات المتعارضة
git diffعرض الفروق
git add fileتأكيد الحل
git commitإنهاء الدمج
git merge --abortإلغاء الدمج
git checkout --ours fileنسختك
git checkout --theirs fileنسخة الفرع
git mergetoolأداة مرئية

قائمة تحقق نهائية

المهمةالحالة
فهم التعارضات⬜
قراءة علامات التعارض⬜
حل تعارض بسيط⬜
استخدام VS Code⬜
إلغاء الدمج⬜
حل التعارضات المتقدمة⬜
حل التمارين الثمانية⬜

ماذا بعد هذا المقال؟

الآن بعد أن أتقنت حل التعارضات، أنت جاهز للمقال التالي:

  1. Workflow احترافي — Git Flow.
  2. مشروع تعاوني — تطبيق كامل.

الخلاصة

في هذا المقال، تعلمت:

  • ✅ ما هو التعارض.
  • ✅ قراءة علامات التعارض.
  • ✅ حل التعارضات.
  • ✅ أدوات المساعدة.
  • ✅ إلغاء الدمج.
  • ✅ استراتيجيات التقليل.
  • ✅ حل 8 تمارين عملية.

تذكر: التعارضات طبيعية — لا تخف منها، بل أتقن حلها.

📚 مقالات ذات صلة

Git & GitHub

مشروع Git متكامل — تعاون على مستودع احترافي 2026

مشروع عملي شامل للتعاون على مستودع Git — فروع، PRs، مراجعة، CI/CD، وإصدارات

Git & GitHub

Git Workflow احترافي — دليل شامل 2026

دليل عملي مفصل لـ Git Workflow الاحترافي — Git Flow، GitHub Flow، Trunk-based، وأفضل الممارسات

Git & GitHub

Pull Requests في Git — دليل شامل 2026

دليل عملي مفصل لـ Pull Requests — إنشاء، مراجعة، دمج، وأفضل الممارسات