حل التعارضات في 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
الحل:
- افتح الملف.
- حل التعارض.
- احذف العلامات.
git add.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 | ⬜ |
| إلغاء الدمج | ⬜ |
| حل التعارضات المتقدمة | ⬜ |
| حل التمارين الثمانية | ⬜ |
ماذا بعد هذا المقال؟
الآن بعد أن أتقنت حل التعارضات، أنت جاهز للمقال التالي:
- Workflow احترافي — Git Flow.
- مشروع تعاوني — تطبيق كامل.
الخلاصة
في هذا المقال، تعلمت:
- ✅ ما هو التعارض.
- ✅ قراءة علامات التعارض.
- ✅ حل التعارضات.
- ✅ أدوات المساعدة.
- ✅ إلغاء الدمج.
- ✅ استراتيجيات التقليل.
- ✅ حل 8 تمارين عملية.
تذكر: التعارضات طبيعية — لا تخف منها، بل أتقن حلها.
Pull Requests في Git — دليل شامل 2026
Git Workflow احترافي — دليل شامل 2026
📚 مقالات ذات صلة
مشروع Git متكامل — تعاون على مستودع احترافي 2026
مشروع عملي شامل للتعاون على مستودع Git — فروع، PRs، مراجعة، CI/CD، وإصدارات
Git Workflow احترافي — دليل شامل 2026
دليل عملي مفصل لـ Git Workflow الاحترافي — Git Flow، GitHub Flow، Trunk-based، وأفضل الممارسات
Pull Requests في Git — دليل شامل 2026
دليل عملي مفصل لـ Pull Requests — إنشاء، مراجعة، دمج، وأفضل الممارسات