الـ conflict مش غلط ولا مصيبة. هو Git بيقولك: “إنت وزميلك عدّلتوا نفس السطر بطريقتين، ومش هقدر أختار بدالكم”.
Git بيدمج لوحده أي تعديلات في أماكن مختلفة. الـ conflict بيحصل بس لما الاتنين يعدّلوا نفس المكان.
شكل الـ conflict
<<<<<<< HEADconst MAX_QTY = 5;=======const MAX_QTY = product.stock;>>>>>>> feature/cart
- اللي بين
<<<<<<<و=======هو الموجود عندك (الـ HEAD). - اللي بين
=======و>>>>>>>هو اللي جاي من الـ branch التاني.
إنت بتقرر: تاخد واحد منهم، أو تجمعهم، أو تكتب حاجة جديدة خالص. وتمسح العلامات.
const MAX_QTY = Math.min(5, product.stock);
الخطوات
git status # الملفات اللي فيها conflict مكتوب جنبها "both modified"# افتح كل ملف، وحل، وامسح العلاماتgit add src/cart/limits.ts # كده بتقول لـ Git إن الملف ده اتحل# لو كنت في mergegit commit# لو كنت في rebasegit rebase --continue
ولو حسيت إنك اتلخبطت، ارجع كأن مفيش حاجة حصلت:
git merge --abortgit rebase --abort
ازاي تقلل الـ conflicts
- خلّي الـ feature branch قصير العمر. يوم أو اتنين أحسن من أسبوعين.
- اعمل
git pull --rebaseمنmainكل شوية، فتحل conflicts صغيرة بدل واحدة كبيرة في الآخر. - commits صغيرة، كل واحد في حاجة واحدة.
الـ interactive rebase: نضّف قبل ما ترفع
وإنت شغال، بتعمل commits زي “wip” و “fix typo” و “oops”. قبل ما تفتح pull request، تقدر تنضّفهم:
git rebase -i main
هيفتحلك قايمة بالـ commits بتاعتك اللي مش في main:
pick 1a2b3c Add cart pagepick 4d5e6f wippick 7a8b9c fix typo in cartpick 0c1d2e Add quantity limit
وتغيّر الكلمة اللي في الأول:
- pick: سيبه زي ما هو.
- reword: سيبه بس غيّر الرسالة.
- squash: ادمجه في اللي قبله، واكتب رسالة جديدة للاتنين.
- fixup: ادمجه في اللي قبله، وارمي رسالته.
- drop: امسحه.
وتقدر كمان تغيّر ترتيب السطور عشان تغيّر ترتيب الـ commits.
pick 1a2b3c Add cart pagefixup 4d5e6f wipfixup 7a8b9c fix typo in cartpick 0c1d2e Add quantity limit
كده بقوا 2 commits نضاف.
commit صغير يتصلح بعدين
لو لقيت غلطة في commit قديم، اعمل commit للتصليح وقول لـ Git هو تبع مين:
git commit --fixup 1a2b3cgit rebase -i --autosquash main
الـ --autosquash بيحط الـ fixup تحت الـ commit بتاعه لوحده.
خلّصت الفصل لما
🧠 اختبر نفسك
١) إمتى بيحصل conflict؟
لما الاتنين يعدّلوا نفس السطور. التعديلات في أماكن مختلفة Git بيدمجها لوحده.
٢) حليت الـ conflict وإنت في rebase. الخطوة الجاية؟
git add للملف، وبعدين git rebase —continue.
٣) إيه الفرق بين squash و fixup؟
الاتنين بيدمجوا الـ commit في اللي قبله. squash بيخليك تكتب رسالة جديدة، fixup بيرمي رسالة الـ commit ده.