Git & GitHub
حل التعارضات في Git — دليل شامل 2026
📅 2026-11-28⏱ 8 دقائق قراءة
في المقال السابق، تعلمت Pull Requests. الآن سنتعلم **حل التعارضات (Conflicts)** — وهي **المهارة الأهم** للعمل الجماعي الناجح.
في هذا الدليل العملي، سنأخذك خطوة بخطوة لفهم التعارضات وحلها، مع تمارين وحلول.
## ما هو التعارض (Conflict)؟
**التعارض** يحدث عندما **يعدّل شخصان نفس السطر** في نفس الملف، ولا يستطيع Git الدمج تلقائياً.
**مثال بسيط:**
**`main`:**
```html
<h1>الرئيسية</h1>
```
**`feature`:**
```html
<h1>الصفحة الرئيسية</h1>
```
**Git لا يعرف:** أي نسخة يفوز؟
**النتيجة:** `CONFLICT`.
## متى تحدث التعارضات؟
<table>
<thead>
<tr>
<th>السبب</th>
<th>مثال</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>نفس السطر</strong></td>
<td>شخصان عدّلا نفس السطر</td>
</tr>
<tr>
<td><strong>حذف مقابل تعديل</strong></td>
<td>شخص حذف، آخر عدّل</td>
</tr>
<tr>
<td><strong>إضافة متعارضة</strong></td>
<td>شخصان أضافا شيئاً في نفس المكان</td>
</tr>
<tr>
<td><strong>ملفات ثنائية</strong></td>
<td>صور، فيديو، إلخ</td>
</tr>
</tbody>
</table>
## كيف يبدو التعارض؟
عند حدوث تعارض، Git يضيف **علامات** للملف:
```html
<<<<<<< HEAD
<h1>الرئيسية</h1>
=======
<h1>الصفحة الرئيسية</h1>
>>>>>>> feature/branch
```
**التفسير:**
<table>
<thead>
<tr>
<th>العلامة</th>
<th>المعنى</th>
</tr>
</thead>
<tbody>
<tr>
<td><code><<<<<<< HEAD</code></td>
<td>بداية نسختك</td>
</tr>
<tr>
<td><code>=======</code></td>
<td>فاصل</td>
</tr>
<tr>
<td><code>>>>>>>> branch</code></td>
<td>نهاية نسخة الفرع</td>
</tr>
</tbody>
</table>
## السيناريو الكامل
### الخطوة 1: أنشئ تعارضاً
```bash
# 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: اعرض الحالة
```bash
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`:**
```html
<<<<<<< HEAD
<h1>الصفحة الأولى</h1>
=======
<h1>الصفحة الرئيسية</h1>
>>>>>>> feature/update
```
### الخطوة 4: حل التعارض
**اختر أحد الخيارات:**
**خيار 1: احتفظ بنسختك**
```html
<h1>الصفحة الأولى</h1>
```
**خيار 2: احتفظ بنسخة الفرع**
```html
<h1>الصفحة الرئيسية</h1>
```
**خيار 3: ادمج النسختين**
```html
<h1>الصفحة الرئيسية الأولى</h1>
```
**⚠️ مهم:** احذف **كل** علامات التعارض (`<<<<<<<`, `=======`, `>>>>>>>`).
### الخطوة 5: أضف الملف
```bash
git add index.html
```
### الخطوة 6: أكمل الدمج
```bash
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
```bash
git mergetool
```
**يفتح أداة مرئية** (VS Code, Meld, إلخ).
### 3. أداة سطر الأوامر
```bash
git diff # عرض التعارضات
git checkout --ours index.html # نسختك
git checkout --theirs index.html # نسخة الفرع
```
## إلغاء الدمج
**إذا أردت التراجع:**
```bash
git merge --abort
```
**النتيجة:** يعود لحالة **ما قبل الدمج**.
## التعارضات في Rebase
**نفس الطريقة:**
```bash
git rebase main
# CONFLICT
# حل الملفات
git add .
git rebase --continue
```
**للإلغاء:**
```bash
git rebase --abort
```
## استراتيجيات لتقليل التعارضات
### 1. حدّث بانتظام
```bash
git checkout main
git pull
git checkout feature
git merge main # أو rebase
```
### 2. فروع قصيرة الأجل
- ✅ **أيام** معدودة.
- ❌ **أسابيع**.
### 3. فرع = ميزة = PR
**لا تجمع ميزات متعددة.**
### 4. تواصل مع الفريق
**إذا كنت تعمل على نفس الملف، أبلغ الآخرين.**
### 5. استخدم `.gitattributes`
```
*.js text eol=lf
```
**لتوحيد نهايات الأسطر.**
## حل التعارضات المتقدمة
### 1. تعارض في الحذف
**السيناريو:**
- شخص حذف ملفاً.
- آخر عدّله.
**الحل:**
```bash
# احتفظ بالملف
git add file.txt
# أو احذفه
git rm file.txt
```
### 2. تعارض في إعادة التسمية
**السيناريو:**
- شخص أعاد تسمية ملف.
- آخر عدّله.
**الحل:** Git يعرض التعارض، اختر الأفضل.
### 3. تعارض في الملفات الثنائية
**السيناريو:** صور، فيديو.
**الحل:** اختر نسخة:
```bash
git checkout --ours image.png
# أو
git checkout --theirs image.png
```
## مثال عملي: تعارض معقد
### السيناريو: تعديل ملف مشترك
**1. الإعداد**
```bash
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**
```bash
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 بشكل آخر**
```bash
git checkout main
sed -i 's/line 2/line 2 modified by B/' shared.txt
git add . && git commit -m "feat: B"
```
**4. دمج**
```bash
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. أكمل:**
```bash
git add .
git commit -m "merge: حل التعارض"
```
## أفضل الممارسات
### 1. لا تخف من التعارضات
**التعارضات طبيعية** في العمل الجماعي.
### 2. اقرأ بعناية
**افهم** ما يريد كل طرف.
### 3. اختبر بعد الحل
```bash
npm test
npm run build
```
### 4. اطلب المساعدة
**إذا كان التعارض معقداً، استشر زميلاً.**
### 5. استخدم VS Code
**أسرع وأوضح** من سطر الأوامر.
## تمارين عملية
### تمرين 1: تعارض بسيط
أنشئ تعارضاً وحله.
**الحل:**
```bash
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: إلغاء الدمج
ادمج، ألغِ.
**الحل:**
```bash
git merge feature/x
git merge --abort
```
### تمرين 3: استخدام `--ours`
احتفظ بنسختك.
**الحل:**
```bash
git checkout --ours file.txt
git add file.txt
```
### تمرين 4: استخدام `--theirs`
احتفظ بنسخة الفرع.
**الحل:**
```bash
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.
**الحل:**
```bash
git rebase main
# حل
git add .
git rebase --continue
```
### تمرين 8: مشروع كامل
أنشئ 3 فروع متعارضة، وحلها.
**الحل:**
```bash
# فرع 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 ولم تُكمله.
**الحل:**
```bash
git status
# أكمل أو:
git merge --abort
```
### 🔴 المشكلة 3: `error: you need to resolve your current index first`
**الحل:** أكمل merge أو ألغِه.
### 🔴 المشكلة 4: تعارضات كثيرة
**الحل:** استخدم `git mergetool` أو VS Code.
### 🔴 المشكلة 5: لا أستطيع الدفع
**الحل:**
```bash
git pull
# حل التعارضات
git push
```
## جدول أوامر التعارضات
<table>
<thead>
<tr>
<th>الأمر</th>
<th>الوظيفة</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>git status</code></td>
<td>عرض الملفات المتعارضة</td>
</tr>
<tr>
<td><code>git diff</code></td>
<td>عرض الفروق</td>
</tr>
<tr>
<td><code>git add file</code></td>
<td>تأكيد الحل</td>
</tr>
<tr>
<td><code>git commit</code></td>
<td>إنهاء الدمج</td>
</tr>
<tr>
<td><code>git merge --abort</code></td>
<td>إلغاء الدمج</td>
</tr>
<tr>
<td><code>git checkout --ours file</code></td>
<td>نسختك</td>
</tr>
<tr>
<td><code>git checkout --theirs file</code></td>
<td>نسخة الفرع</td>
</tr>
<tr>
<td><code>git mergetool</code></td>
<td>أداة مرئية</td>
</tr>
</tbody>
</table>
## قائمة تحقق نهائية
<table>
<thead>
<tr>
<th>المهمة</th>
<th>الحالة</th>
</tr>
</thead>
<tbody>
<tr>
<td>فهم التعارضات</td>
<td>⬜</td>
</tr>
<tr>
<td>قراءة علامات التعارض</td>
<td>⬜</td>
</tr>
<tr>
<td>حل تعارض بسيط</td>
<td>⬜</td>
</tr>
<tr>
<td>استخدام VS Code</td>
<td>⬜</td>
</tr>
<tr>
<td>إلغاء الدمج</td>
<td>⬜</td>
</tr>
<tr>
<td>حل التعارضات المتقدمة</td>
<td>⬜</td>
</tr>
<tr>
<td>حل التمارين الثمانية</td>
<td>⬜</td>
</tr>
</tbody>
</table>
## ماذا بعد هذا المقال؟
الآن بعد أن أتقنت حل التعارضات، أنت جاهز للمقال التالي:
1. **Workflow احترافي** — Git Flow.
2. **مشروع تعاوني** — تطبيق كامل.
## الخلاصة
في هذا المقال، تعلمت:
- ✅ ما هو التعارض.
- ✅ قراءة علامات التعارض.
- ✅ حل التعارضات.
- ✅ أدوات المساعدة.
- ✅ إلغاء الدمج.
- ✅ استراتيجيات التقليل.
- ✅ حل 8 تمارين عملية.
**تذكر:** التعارضات **طبيعية** — لا تخف منها، بل أتقن حلها.