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>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code></td> <td>بداية نسختك</td> </tr> <tr> <td><code>=======</code></td> <td>فاصل</td> </tr> <tr> <td><code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; 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 تمارين عملية. **تذكر:** التعارضات **طبيعية** — لا تخف منها، بل أتقن حلها.