We are still cooking the magic in the way!
Git و GitHub
العمل مع الفروع
العمل مع الفروع
الفروع هي واحدة من أقوى ميزات Git، مما يتيح التطوير الموازي والتجريب وسير العمل المنظم. في هذا الدرس، ستتقن إنشاء الفروع والتنقل والإدارة وأفضل الممارسات.
ما هي الفروع؟
الفرع هو مؤشر خفيف الوزن قابل للحركة إلى التزام. فكر فيه كخط منفصل للتطوير:
فرع Main/Master: الفرع الأساسي (كود جاهز للإنتاج)
فروع الميزات: تطوير معزول للميزات الجديدة
فروع إصلاح الأخطاء: إصلاح أخطاء محددة
فروع الإصلاحات العاجلة: إصلاحات الإنتاج العاجلة
فروع تجريبية: اختبار الأفكار بدون مخاطر
حقيقة مهمة: الفروع في Git خفيفة الوزن بشكل لا يصدق - إنها مجرد ملفات بحجم 41 بايت تحتوي على hash SHA-1. إنشاء والتبديل بين الفروع شبه فوري، حتى في المستودعات الكبيرة!
لماذا نستخدم الفروع؟
الفوائد:
✓ عزل العمل - تطوير الميزات دون التأثير على الكود الرئيسي
✓ تطوير موازي - عدة أعضاء في الفريق يعملون في وقت واحد
✓ التجريب - تجربة الأفكار بدون مخاطر
✓ تبديل السياق - العمل على مهام متعددة بسهولة
✓ مراجعة الكود - مراجعة التغييرات قبل الدمج في main
✓ سير عمل منظم - فصل واضح للاهتمامات
إنشاء الفروع
طرق متعددة لإنشاء الفروع:
# إنشاء فرع جديد (لا ينتقل إليه)
git branch feature-login
# إنشاء والانتقال إلى فرع جديد
git checkout -b feature-login
# الطريقة الحديثة (Git 2.23+)
git switch -c feature-login
# إنشاء فرع من التزام محدد
git branch bugfix-header abc123
# إنشاء فرع من فرع آخر
git branch feature-payment feature-login
# إنشاء فرع وتتبع البعيد
git checkout -b local-name origin/remote-branch
نصيحة: استخدم
git switch (Git 2.23+) للوضوح: git switch يبدل الفروع، git checkout يفعل أشياء كثيرة. الأمر الجديد يجعل نواياك أوضح.
التبديل بين الفروع
التنقل بين الفروع:
# الانتقال إلى فرع موجود (الطريقة القديمة)
git checkout main
# الانتقال إلى فرع (الطريقة الحديثة)
git switch main
# الانتقال إلى الفرع السابق
git switch -
# إنشاء والانتقال إلى فرع جديد
git switch -c new-feature
# التبديل مع تغييرات غير ملتزمة (Git يخزن تلقائياً)
git switch other-branch # قد يفشل إذا كانت هناك تعارضات
تحذير: يجب أن تكون التغييرات غير الملتزمة في دليل عملك متوافقة مع الفرع المستهدف. إذا كانت هناك تعارضات، ستمنع Git التبديل. إما التزم أو خزن أو تجاهل التغييرات أولاً.
سرد الفروع
عرض جميع الفروع وحالتها:
# سرد الفروع المحلية (* تحدد الحالي)
git branch
# سرد جميع الفروع (محلي + بعيد)
git branch -a
# سرد الفروع البعيدة فقط
git branch -r
# سرد مع آخر التزام على كل فرع
git branch -v
# سرد الفروع المدمجة
git branch --merged
# سرد الفروع غير المدمجة
git branch --no-merged
# سرد الفروع مع مزيد من التفاصيل
git branch -vv # يعرض معلومات التتبع
اصطلاحات تسمية الفروع
استخدم أسماء واضحة ووصفية تتبع اصطلاحات فريقك:
الأنماط الشائعة:
feature/user-authentication
feature/payment-integration
bugfix/header-alignment
bugfix/login-error
hotfix/security-patch
release/v1.2.0
experimental/new-design
أفضل الممارسات:
✓ استخدم الأحرف الصغيرة والشرطات
✓ ضمّن بادئة النوع (feature/, bugfix/)
✓ كن وصفياً ولكن موجزاً
✓ استخدم أرقام المشاكل: feature/123-user-profile
✓ تجنب الأحرف الخاصة والمسافات
أمثلة:
✓ feature/add-shopping-cart
✓ bugfix/fix-checkout-error
✓ hotfix/patch-security-issue
✗ my-branch (غامض جداً)
✗ FEATURE (أحرف كبيرة)
✗ new feature (مسافات)
اصطلاح الفريق: اتبع دائماً اصطلاحات التسمية لفريقك. الاتساق أهم من التفضيل الشخصي!
حذف الفروع
إزالة الفروع التي لم تعد بحاجة إليها:
# حذف فرع مدمج بالكامل
git branch -d feature-login
# حذف قسري (حتى لو لم يتم الدمج)
git branch -D experimental-feature
# حذف فرع بعيد
git push origin --delete feature-login
git push origin :feature-login # بناء جملة قديم
# حذف فروع متعددة
git branch -d feature-1 feature-2 feature-3
# حذف جميع الفروع المدمجة باستثناء main
git branch --merged | grep -v "\*\|main\|master" | xargs git branch -d
تحذير:
git branch -D يحذف قسرياً الفروع حتى لو كانت تحتوي على عمل غير مدمج. تأكد من أنك لا تحتاج إلى هذا العمل قبل استخدام علامة القوة!
إعادة تسمية الفروع
تغيير أسماء الفروع:
# إعادة تسمية الفرع الحالي
git branch -m new-name
# إعادة تسمية فرع آخر
git branch -m old-name new-name
# إعادة التسمية وتحديث البعيد
git branch -m old-name new-name
git push origin --delete old-name
git push origin new-name
git push origin -u new-name # تعيين upstream
تتبع الفروع
ربط الفروع المحلية بالفروع البعيدة:
# إنشاء فرع يتتبع البعيد
git checkout -b local-branch origin/remote-branch
# تعيين upstream للفرع الحالي
git branch -u origin/main
# الدفع وتعيين تتبع upstream
git push -u origin feature-branch
# عرض معلومات التتبع
git branch -vv
# إزالة تتبع upstream
git branch --unset-upstream
نصيحة احترافية: استخدم دائماً
git push -u origin branch-name عند دفع فرع جديد لأول مرة. هذا يعين التتبع ويسمح لك ببساطة باستخدام git push و git pull دون تحديد البعيد والفرع.
حالة HEAD المنفصلة
فهم والعمل مع HEAD المنفصلة:
# الانتقال إلى التزام محدد (HEAD منفصلة)
git checkout abc123
# تحذير HEAD منفصلة:
# أنت في حالة 'HEAD منفصلة'. يمكنك النظر حولك،
# وإجراء تغييرات تجريبية والتزامها، ويمكنك
# تجاهل أي التزامات تقوم بها في هذه الحالة.
# العمل في HEAD منفصلة
git checkout abc123
# إجراء تغييرات والالتزام
git add .
git commit -m "تغيير تجريبي"
# حفظ العمل من HEAD منفصلة
git branch save-experiment
git switch main
# أو إرفاق HEAD بفرع جديد
git checkout -b new-branch
الفهم: HEAD المنفصلة تعني أنك لست على أي فرع - أنت مباشرة على التزام. أي التزامات تقوم بها لن تنتمي إلى فرع إلا إذا أنشأت واحداً. إنه مفيد لعرض الكود القديم أو التجارب السريعة.
استراتيجيات إدارة الفروع
فروع قصيرة العمر:
- فروع الميزات المحذوفة بعد الدمج
- تعيش عادة لأيام أو أسابيع
- حافظ على فرع main نظيفاً ومستقراً
فروع طويلة العمر:
- main/master - كود الإنتاج
- develop - فرع التكامل
- staging - اختبار ما قبل الإنتاج
- قد تعيش لأشهر أو سنوات
فروع شخصية:
- بادئة باسمك: john/feature-x
- تجربة حرة
- احذف أو ادمج عند الانتهاء
سير عمل الفروع العملي
مثال سير عمل كامل:
# 1. ابدأ من main
git switch main
git pull origin main
# 2. أنشئ فرع ميزة
git switch -c feature/user-profile
# 3. اعمل على الميزة (التزامات متعددة)
git add profile.js
git commit -m "Add user profile component"
git add profile.css
git commit -m "Style user profile page"
# 4. حافظ على تحديث الفرع مع main
git switch main
git pull origin main
git switch feature/user-profile
git merge main # أو rebase
# 5. ادفع فرع الميزة
git push -u origin feature/user-profile
# 6. بعد دمج PR، نظف
git switch main
git pull origin main
git branch -d feature/user-profile
git push origin --delete feature/user-profile
عرض اختلافات الفروع
قارن الفروع لفهم الاختلافات:
# إظهار الالتزامات في feature وليست في main
git log main..feature-branch
# إظهار الالتزامات في main وليست في feature
git log feature-branch..main
# إظهار اختلافات الملفات بين الفروع
git diff main..feature-branch
# إظهار أسماء الملفات المتغيرة فقط
git diff --name-only main..feature-branch
# إظهار إحصائيات التغييرات
git diff --stat main..feature-branch
# مقارنة ملف محدد عبر الفروع
git diff main..feature-branch -- path/to/file.js
تمرين تطبيقي:
السيناريو: أنشئ سير عمل فروع كامل:
- أنشئ فرع ميزة جديد يسمى
feature/add-footer - قم بالتزامين على هذا الفرع
- اسرد جميع الفروع وتأكد من أنك على فرع الميزة
- عد إلى main
- عرض الاختلافات بين main وفرع الميزة الخاص بك
- احذف فرع الميزة
الأوامر:
# 1. أنشئ وانتقل إلى فرع الميزة
git switch -c feature/add-footer
# 2. قم بإجراء تغييرات والتزم
echo "<footer>Copyright 2024</footer>" > footer.html
git add footer.html
git commit -m "Add footer HTML structure"
echo "footer { background: #333; }" > footer.css
git add footer.css
git commit -m "Add footer CSS styling"
# 3. اسرد الفروع
git branch -v
# 4. انتقل إلى main
git switch main
# 5. عرض الاختلافات
git log main..feature/add-footer --oneline
git diff main..feature/add-footer --stat
# 6. احذف الفرع (فقط إذا تم الدمج أو استخدم -D للقسر)
git branch -d feature/add-footer
أفضل ممارسات الفروع
✓ افعل:
- أنشئ فروعاً لكل ميزة/إصلاح
- استخدم أسماء فروع وصفية
- احتفظ بالفروع قصيرة العمر
- احذف الفروع المدمجة
- حدّث فروع الميزات بانتظام مع main
- عيّن تتبع upstream للفروع البعيدة
- راجع التغييرات قبل التبديل بين الفروع
✗ لا تفعل:
- اعمل مباشرة على main/master
- اترك الفروع تصبح قديمة (متأخرة)
- استخدم أسماء غامضة مثل "test" أو "branch1"
- قسر التبديل مع تغييرات غير ملتزمة
- احتفظ بالفروع المدمجة القديمة
- شارك فروع التجارب الشخصية
- انسَ سحب main قبل إنشاء فرع
الملخص
في هذا الدرس، تعلمت:
- ما هي الفروع ولماذا هي أساسية للتطوير
- إنشاء الفروع باستخدام
git branchوgit switch -c - التبديل بين الفروع بأمان
- سرد الفروع مع مرشحات متنوعة
- اصطلاحات تسمية الفروع وأفضل الممارسات
- حذف وإعادة تسمية الفروع
- إعداد علاقات التتبع مع الفروع البعيدة
- فهم حالة HEAD المنفصلة
- سير عمل فروع كامل للميزات وإصلاحات الأخطاء
التالي: في الدرس التالي، سنستكشف دمج الفروع - الجمع بين خطوط التطوير المختلفة والتعامل مع تعارضات الدمج!