الدمج · فصل ٥

الـ conflicts والـ interactive rebase

conflict markers · --abort · --continue · rebase -i · squash · fixup
🎯 الهدف: تحل أي conflict من غير خوف، وتنضّف الـ commits بتاعتك قبل الـ pull request.

الـ 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 ده.