الوحدة الثالثة: الفروع والدمج بالتفصيل
الفروع (Branches) هي "القوة الخارقة" في Git. فهي تسمح للفرق الاحترافية بالتجربة، وبناء الميزات، وإصلاح الأخطاء بالتوازي دون التأثير أبداً على الكود "الجاهز للنشر".
1. فلسفة التفرع (Branching)
فكر في تاريخ Git كشجرة. فرع main هو الجذع الرئيسي. في كل مرة تبدأ فيها مهمة جديدة، تقوم بإنبات فرع صغير بعيداً عن هذا الجذع.
- لماذا؟ إذا ارتكبت خطأً في فرعك، يظل الجذع (main) آمناً ومستقراً.
- أفضل ممارسة: لا تقم أبداً بكتابة الكود مباشرة على فرع
main. قم دائماً بإنشاء فرع مخصص لميزتك (Feature branch).
التعامل مع الفروع كالمحترفين
إنشاء فرع جديد والانتقال إليه
git switch -c feature/login-systemهذا:
- ينشئ فرعًا جديدًا.
- ينقلك إليه فورًا.
--
عرض الفروع
git branchعرض جميع الفروع المحلية:
git branch -aالانتقال بين الفروع
git switch mainحذف فرع بعد الانتهاء
git branch -d feature/login-systemإذا رفض Git بسبب عدم الدمج:
git branch -D feature/login-systemلا تستخدم -D إلا إذا كنت متأكدًا أنك لا تحتاج التاريخ.
2. دمج الفروع (Merge)
بعد الانتهاء من العمل في فرع feature، يجب دمجه في main.
الطريقة الموصى بها
git switch main
git merge --no-ff feature/login-systemلماذا --no-ff؟
لأنه:
- يمنع الدمج السريع (Fast-forward).
- ينشئ Merge Commit واضح.
- يحافظ على شكل الشجرة مثل Pull Request في GitHub.
بعد الدمج:
git push3. استرجاع التغييرات: الدمج (Merge) مقابل إعادة التأسيس (Rebase)
هذا سؤال شائع في المقابلات الوظيفية وخيار يومي للمطورين.
أ. الدمج (git merge)
- كيف: يأخذ التاريخين المختلفين ويربطهما معاً عن طريق "Commit دمج" (Merge Commit) جديد.
- لماذا: يحافظ على الجدول الزمني التاريخي الدقيق لما حدث ومتى حدث.
- متى: استخدمه عندما تريد دمج ميزة مكتملة في فرع
main.
ب. إعادة التأسيس (git rebase)
- كيف: يقوم بـ "رفع" التزاماتك (commits) ووضعها فوق آخر التزامات موجودة في فرع
main. يعيد كتابة التاريخ ليجعله يبدو كخط مستقيم. - لماذا: ينتج عنه تاريخ مشروع أنظف بكثير وخط سير واضح (Linear history).
- متى: استخدمه لتحديث فرعك الخاص بآخر التغييرات من فرع
mainقبل أن تفتح "طلب سحب" (Pull Request).
WARNING
القاعدة الذهبية لإعادة التأسيس (Rebase): لا تقم أبداً بعمل rebase للفروع التي تم رفعها ومشاركتها مع الآخرين على GitHub. سيؤدي ذلك إلى فوضى عارمة لزملائك!
4. حل التعارضات (بالطريقة الاحترافية)
يحدث التعارض عندما لا يعرف Git أي نسخة من سطر معين يجب أن يعتمدها. يحدث هذا عادة أثناء عملية الدمج (merge) أو إعادة التأسيس (rebase).
الخطوة 1: تحديد مكان المشكلة
سيقوم Git بتحديد الملفات المتعارضة. افتحها في محرر الكود (برنامج VS Code يسهل هذا جداً بتقديم أزرار مثل "Accept Current" أو "Accept Incoming").
الخطوة 2: فهم المنطق
<<<<<<< HEAD (Current Branch - فرعك الحالي)
const color = 'blue';
=======
const color = 'red';
>>>>>>> feature/new-theming (Incoming Branch - الفرع القادم)- HEAD: هو الكود الموجود حالياً في الفرع الذي تقف عليه.
- Incoming: هو الكود القادم من الفرع الآخر الذي تحاول الدمج منه.
الخطوة 3: التنظيف
- اختر الكود الصحيح (أو ادمج بين الاثنين يدوياً).
- قم بإزالة العلامات (
<<<<,====,>>>>). - قم بتحضير الملف:
git add <filename>. - الإنهاء:
git commit(في حال الدمج) أوgit rebase --continue(في حال إعادة التأسيس).
5. الحفظ المؤقت: git stash
أحياناً تكون في منتصف فوضى برمجية ويطلب منك مديرك إصلاح خطأ عاجل في فرع main فوراً.
# 1. احفظ عملك "المكركب" في "جيب سري" مؤقت
git stash
# 2. انتقل لفرع main وأصلح الخطأ
git switch main
# ... إصلاح الخطأ ...
# 3. عد لفرعك واستخرج العمل من الجيب السري
git switch feature/my-work
git stash popماذا بعد؟
لقد أتقنت الآن التعامل مع التعقيدات المحلية. حان الوقت لنرى كيف ينسجم كل هذا في نظام التعاون عبر GitHub في الوحدة الرابعة.