الفروع في Git: branch و switch و merge
موقعك يعمل جيداً على الفرع main، وتريد إضافة صفحة جديدة. لكن ماذا لو كسرت شيئاً أثناء العمل؟ أو احتجت إصلاح خطأ عاجل في منتصف عملك على الصفحة؟ الحل: الفروع (Branches). كل فرع خط عمل مستقل، تجرّب فيه بحرية، ثم تدمجه في الخط الأساسي عندما يجهز. وهذه أكثر ميزة يحبها المبرمجون في Git.
ما هو الفرع؟
Section titled “ما هو الفرع؟”تخيّل أنك تكتب رواية. النسخة الأساسية في دفتر، وتريد تجربة نهاية مختلفة. بدلاً من الكتابة فوق الأصل، تصوّر نسخة وتجرب عليها. إذا أعجبتك النهاية الجديدة، تنقلها للأصل. وإذا لم تعجبك، ترمي النسخة دون أن يتأثر الأصل.
الفرع في Git مثل هذه النسخة، لكنه ذكي جداً: لا ينسخ الملفات فعلياً، بل يتذكر فقط من أين تفرّع. لذلك إنشاء فرع فوري ولا يستهلك مساحة.
عرض الفروع وإنشاؤها
Section titled “عرض الفروع وإنشاؤها”نكمل على مستودع my-site من الدرس السابق:
git branch* mainالنجمة * تشير للفرع الحالي. لننشئ فرعاً لصفحة «اتصل بنا»:
git branch contact-pagegit branch contact-page* mainالفرع أُنشئ، لكننا ما زلنا على main.
التنقل بين الفروع: git switch
Section titled “التنقل بين الفروع: git switch”git switch contact-pageSwitched to branch 'contact-page'الآن ننشئ contact.html ونحفظه:
git add contact.htmlgit commit -m "إضافة صفحة اتصل بنا"ثم نعود لـ main:
git switch mainlsREADME.mdindex.htmlأين ذهب contact.html؟! إنه موجود بأمان في فرع contact-page. عند التنقل بين الفروع، يغيّر Git الملفات في مجلدك لتطابق الفرع الذي انتقلت إليه. هذا هو الاستقلال الحقيقي بين الفروع.
اختصار مفيد: git switch -c dark-mode تنشئ الفرع وتنتقل إليه في خطوة واحدة.
الدمج: git merge
Section titled “الدمج: git merge”صفحة «اتصل بنا» جاهزة، فلندمجها في main. انتقل أولاً للفرع الذي تريد الدمج فيه، ثم ادمج:
git switch maingit merge contact-pageUpdating 1af0b70..2d680edFast-forward contact.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 contact.htmlFast-forward (تقديم سريع): بما أن main لم يتغير منذ التفرّع، اكتفى Git بتحريك مؤشر main للأمام ليشمل النقاط الجديدة. أبسط أنواع الدمج.
لكن ماذا لو تغيّر الفرعان معاً؟ في فرع dark-mode أضفنا ملف style.css، وفي نفس الوقت تقدّم main بدمج صفحة الاتصل. الآن:
git merge dark-mode -m "دمج الوضع الليلي"git log --oneline --graph* beb7ec5 دمج الوضع الليلي|\| * a9d945f إضافة الوضع الليلي* | 2d680ed إضافة صفحة اتصل بنا|/* 1af0b70 تجاهل الملفات السرية* 4abe678 إضافة فقرة ترحيب* c8ef559 إضافة الصفحة الرئيسية وملف READMEهنا أنشأ Git نقطة دمج (Merge Commit) جديدة تجمع الخطين. و --graph يرسم التاريخ: ترى الخطين يفترقان ثم يلتقيان. جمال Git: كل فرع عدّل ملفات مختلفة، فدمجهما آلياً دون أي مشكلة.
حذف الفرع بعد الدمج
Section titled “حذف الفرع بعد الدمج”git branch -d contact-pageDeleted branch contact-page (was 2d680ed).الفرع أدى مهمته، وتعديلاته أصبحت في main، فلا داعي لبقائه. والخيار -d آمن: يرفض حذف فرع لم يُدمج بعد.
التعارض (Conflict)
Section titled “التعارض (Conflict)”ماذا لو عدّل فرعان نفس السطر في نفس الملف بطريقتين مختلفتين؟ في فرع title-a غيّرنا العنوان إلى «موقعي الجديد»، وفي main غيّرناه إلى «موقع سارة»:
git merge title-aAuto-merging index.htmlCONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result.Git لا يستطيع أن يقرر بدلاً منك أي عنوان هو الصحيح! فيضع العلامات في الملف ويطلب منك القرار:
<<<<<<< HEAD<h1>موقع سارة</h1>=======<h1>موقعي الجديد</h1>>>>>>>> title-a<p>أهلاً بك</p>- بين
<<<<<<< HEADو=======: نسخة الفرع الحالي (main). - بين
=======و>>>>>>> title-a: نسخة الفرع القادم.
لحل التعارض:
- افتح الملف، واحذف العلامات الثلاث، واترك النص الصحيح. يمكنك اختيار إحدى النسختين، أو كتابة نسخة جديدة تجمع الاثنتين، مثل «موقع سارة الجديد».
- احفظ الملف، ثم
git add index.html. - أنهِ الدمج بـ
git commit -m "حل التعارض في العنوان".
تخيّل التعارض مثل محررَين عدّلا نفس الجملة في كتاب بطريقتين مختلفتين: لا بد أن يقرر رئيس التحرير الصيغة النهائية. و VS Code يعرض التعارض بألوان وأزرار مثل «Accept Current» و«Accept Incoming» تسهّل عليك الاختيار.
جرّب بنفسك
Section titled “جرّب بنفسك”- في مستودعك، أنشئ فرعاً اسمه
about-pageوانتقل إليه بأمر واحد. - أضف صفحة
about.htmlواحفظها، ثم عد إلىmainولاحظ اختفاءها. - ادمج الفرع في
main، واحذفه. - اصنع تعارضاً عن قصد: أنشئ فرعين يعدّلان نفس السطر بطريقتين، وادمجهما، ثم حل التعارض.
- اعرض التاريخ بـ
git log --oneline --graph.
أخطاء شائعة
Section titled “أخطاء شائعة”- الدمج وأنت على الفرع الخطأ:
git mergeتدمج في الفرع الحالي. انتقل لـmainأولاً. - نسيان العلامات في الملف بعد حل التعارض: تبقى
<<<<<<<في الكود فيتعطل. ابحث عنها قبل الحفظ. - التنقل بين الفروع مع تعديلات غير محفوظة: قد يرفض Git أو تنتقل التعديلات معك. احفظها بـ commit قبل التنقل.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي أمر ينشئ فرعاً جديداً اسمه feature وينتقل إليه مباشرة؟
git switch -c ينشئ الفرع وينتقل إليه، أما git branch فتنشئه فقط دون انتقال.
سؤال
متى يحدث التعارض (Conflict) عند الدمج؟
إذا عدّل كل فرع أجزاء أو ملفات مختلفة يدمجها Git آلياً، أما تعديل نفس السطر بطريقتين فيحتاج قرارك.
الخلاصة
Section titled “الخلاصة”- الفرع خط عمل مستقل وخفيف، تجرّب فيه دون التأثير على
main. git branchيعرض وينشئ، وgit switchينقلك، وgit switch -cينشئ وينقل.git mergeيدمج فرعاً في الفرع الحالي: تقديم سريع، أو نقطة دمج جديدة.git branch -dيحذف الفرع المدمج بأمان.- التعارض: Git يضع العلامات، وأنت تختار النتيجة، ثم
addوcommit.