0%
الدرس 8 من 10
اكتمل 80%

سير عمل Git المتقدمة

استكشف تدفقات العمل الشائعة مثل Git Flow وGitHub Flow وTrunk-Based Development.

سير عمل Git المتقدمة

تحدد سير عمل Git (workflows) كيفية تنظيم الفرق لعملية التطوير باستخدام Git. يستعرض هذا الدرس أشهر المنهجيات ويساعدك على اختيار الأنسب لفريقك ومشروعك.

مقدمة إلى سير العمل

سير عمل Git هو مجموعة من القواعد والاتفاقيات التي تحدد:

  • كيفية إنشاء الفروع وتسميتها
  • متى وكيف يتم الدمج
  • من يملك صلاحية القيام بماذا
  • كيفية إدارة الإصدارات (releases)
Produit complexeWeb app agileDéploiement continuÉquipe mixteChoix du WorkflowType de projetGit FlowGitHub FlowTrunk-BasedGitLab Flow

Git Flow

المبدأ

Git Flow هو سير عمل منظم يعتمد على فروع متخصصة لأنواع مختلفة من التطوير.

بنية الفروع

maindevelopfeature/loginrelease/1.0InitialDev 1Login 1Login 2Dev 2RC 1v1.0

الفروع الرئيسية

main (أو master)

  • شيفرة الإنتاج
  • مستقرة دائمًا
  • كل commit = إصدار جديد

develop

  • فرع التكامل
  • أحدث الميزات التي تم تطويرها
  • أساس الميزات الجديدة

فروع الدعم

feature/

# إنشاء فرع ميزة
git checkout develop
git checkout -b feature/user-authentication

# تطوير الميزة
# ... commits ...

# الدمج في develop
git checkout develop
git merge --no-ff feature/user-authentication
git branch -d feature/user-authentication

release/

# إنشاء فرع إصدار
git checkout develop
git checkout -b release/1.2.0

# إنهاء الإصدار (إصلاح الأخطاء، رفع رقم الإصدار)
echo "1.2.0" > VERSION
git commit -am "Bump version to 1.2.0"

# الدمج في main وdevelop
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release version 1.2.0"

git checkout develop
git merge --no-ff release/1.2.0
git branch -d release/1.2.0

hotfix/

# إنشاء hotfix انطلاقًا من main
git checkout main
git checkout -b hotfix/critical-security-fix

# إصلاح الخطأ
# ... commits ...

# الدمج في main وdevelop
git checkout main
git merge --no-ff hotfix/critical-security-fix
git tag -a v1.2.1 -m "Hotfix version 1.2.1"

git checkout develop
git merge --no-ff hotfix/critical-security-fix
git branch -d hotfix/critical-security-fix

أدوات Git Flow

# تثبيت git-flow
# macOS
brew install git-flow

# Ubuntu
sudo apt-get install git-flow

# التهيئة
git flow init

# أوامر git-flow
git flow feature start user-auth
git flow feature finish user-auth

git flow release start 1.2.0
git flow release finish 1.2.0

git flow hotfix start critical-fix
git flow hotfix finish critical-fix

المزايا والعيوب

✅ المزايا:

  • بنية واضحة ويمكن التنبؤ بها
  • فصل واضح بين البيئات
  • إدارة متينة للإصدارات
  • مثالي للمنتجات ذات دورات الإصدار

❌ العيوب:

  • تعقيد مرتفع
  • عبء إضافي (overhead) على الفرق الصغيرة
  • غير مناسب للنشر المستمر
  • فروع طويلة الأمد

GitHub Flow

المبدأ

سير عمل مبسّط يتمحور حول الفرع main مع فروع ميزات قصيرة الأمد.

mainfeature/new-uifeature/api-updateInitialFeature AUI 1UI 2API 1Deploy

سير العمل خطوة بخطوة

# 1. إنشاء فرع انطلاقًا من main
git checkout main
git pull origin main
git checkout -b feature/improve-performance

# 2. التطوير وإجراء commit
# ... التطوير ...
git add .
git commit -m "feat: optimize database queries"

# 3. الدفع (push) بانتظام
git push origin feature/improve-performance

# 4. فتح Pull Request
gh pr create --title "Improve database performance" \
             --body "Optimizes queries to reduce load time by 50%"

# 5. المراجعة والنقاش
# ... مراجعة الشيفرة ...

# 6. الدمج في main
gh pr merge --squash

# 7. النشر
# نشر تلقائي انطلاقًا من main

قواعد GitHub Flow

  1. الفرع main قابل للنشر دائمًا
  2. فروع ذات أسماء وصفية تُنشأ انطلاقًا من main
  3. دفع متكرر إلى origin
  4. Pull Request لكل تعديل
  5. مراجعة إلزامية قبل الدمج
  6. دمج ونشر فوريان

إعداد GitHub

# .github/branch-protection.yml
protection_rules:
  main:
    required_status_checks:
      strict: true
      contexts:
        - continuous-integration
        - security-scan
    enforce_admins: true
    required_pull_request_reviews:
      required_approving_review_count: 2
      dismiss_stale_reviews: true
    restrictions:
      users: []
      teams: ["core-team"]

المزايا والعيوب

✅ المزايا:

  • أقصى درجات البساطة
  • نشر مستمر سهل
  • تغذية راجعة سريعة
  • مثالي لتطبيقات الويب

❌ العيوب:

  • لا توجد بيئة staging صريحة
  • صعب مع الإصدارات المجدولة
  • يتطلب CI/CD متينًا
  • قد يصبح فوضويًا دون انضباط

Trunk-Based Development

المبدأ

التطوير مباشرة على الفرع الرئيسي مع فروع قصيرة جدًا (< يوم واحد).

mainshort-featuretiny-changeInitialFeature AQuick fixFeature BFeature CTypo fixFeature D

الممارسات الأساسية

commits متكررة

# عدة commits في اليوم على main
git add .
git commit -m "feat: add user validation (partial)"
git push origin main

# بعد بضع ساعات
git add .
git commit -m "feat: complete user validation"
git push origin main

Feature Flags

// استخدام feature flags للشيفرة غير المكتملة
function processPayment(amount) {
    if (featureFlags.newPaymentSystem) {
        return newPaymentProcessor(amount);
    }
    return legacyPaymentProcessor(amount);
}

فروع قصيرة جدًا

# فرع لا يتجاوز 1-2 يوم
git checkout -b quick-fix/typo-correction
# ... تصحيح سريع ...
git push origin quick-fix/typo-correction
# ... PR ودمج فوري ...

الإصدار انطلاقًا من trunk

# فروع الإصدار انطلاقًا من main
git checkout main
git checkout -b release/2024.03.15
git tag v2024.03.15
git push origin release/2024.03.15
git push origin v2024.03.15

# hotfixes مباشرة على main
git checkout main
# ... إصلاح ...
git commit -m "hotfix: critical security patch"
git tag v2024.03.15.1
git push origin main
git push origin v2024.03.15.1

المزايا والعيوب

✅ المزايا:

  • أقصى درجات التكامل المستمر
  • لا يوجد merge hell
  • تغذية راجعة فورية
  • بساطة قصوى

❌ العيوب:

  • يتطلب انضباطًا صارمًا
  • الاختبارات الآلية إلزامية
  • تعقيد feature flags
  • لا يناسب جميع أنواع المشاريع

GitLab Flow

المبدأ

مزيج من GitHub Flow مع فروع للبيئات.

mainfeature/authstagingproductionInitialAuth 1Auth 2Déploiement stagingDéploiement prodv1.0

البنية مع البيئات

# فروع البيئات
main          # التطوير
staging       # اختبارات التكامل
production    # الإنتاج

# سير العمل
git checkout main
git checkout -b feature/new-api

# التطوير
git push origin feature/new-api
# ... Pull Request نحو main ...

# النشر على staging
git checkout staging
git merge main
git push origin staging

# الاختبارات على staging
# ... التحقق ...

# النشر على الإنتاج
git checkout production
git merge staging
git push origin production

فروع الإصدار

# للإصدارات المجدولة
git checkout main
git checkout -b release/2.1.0

# cherry-pick للميزات
git cherry-pick feature-commit-1
git cherry-pick feature-commit-2

# نشر الإصدار
git checkout production
git merge release/2.1.0
git tag v2.1.0

Forking Workflow

المبدأ

يملك كل مطوّر نسخته الخاصة (fork) من المستودع الرئيسي.

Dépôt PrincipalFork Développeur 1Fork Développeur 2Clone Local 1Clone Local 2Pull Request 1Pull Request 2

سير العمل الكامل

# 1. عمل fork للمستودع الرئيسي (عبر GitHub)

# 2. استنساخ الـ fork الخاص بك
git clone https://github.com/VOUS/projet.git
cd projet

# 3. إضافة upstream
git remote add upstream https://github.com/ORIGINAL/projet.git

# 4. إنشاء فرع ميزة
git checkout -b feature/awesome-feature

# 5. التطوير
# ... commits ...

# 6. المزامنة مع upstream
git fetch upstream
git rebase upstream/main

# 7. الدفع إلى الـ fork الخاص بك
git push origin feature/awesome-feature

# 8. إنشاء Pull Request نحو upstream

صيانة الـ fork

# مزامنة منتظمة
git fetch upstream
git checkout main
git merge upstream/main
git push origin main

# تنظيف الفروع
git branch -d feature/completed-feature
git push origin --delete feature/completed-feature

اختيار سير العمل المناسب

معايير القرار

1-3 devs4-10 devs10+ devsWeb appProduitMicroservicesChoisir un WorkflowTaille équipeGitHub FlowType projetGit Flow ou ForkingGitHub FlowGit FlowTrunk-Based

جدول المقارنة

سير العملالتعقيدالفريقالنشرالإصدارات
GitHub Flowمنخفضصغير إلى متوسطمستمرمتكررة
Git Flowمرتفعمتوسط إلى كبيرمجدولمجدولة
Trunk-Basedمنخفضأي حجممستمرمستمرة
GitLab Flowمتوسطمتوسطمختلطمرنة
Forkingمتوسطالمصادر المفتوحةمتغيّرمتغيّرة

إعداد سير العمل

GitHub Flow - الإعداد

# .github/workflows/ci.yml
name: CI/CD
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run tests
        run: npm test
      
  deploy:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to production
        run: ./deploy.sh

Git Flow - السكربتات

#!/bin/bash
# scripts/git-flow-feature.sh

FEATURE_NAME=$1

if [ -z "$FEATURE_NAME" ]; then
    echo "Usage: $0 <feature-name>"
    exit 1
fi

# إنشاء فرع الميزة
git checkout develop
git pull origin develop
git checkout -b "feature/$FEATURE_NAME"

echo "Feature branch feature/$FEATURE_NAME created"
echo "When done, run: git-flow-feature-finish.sh $FEATURE_NAME"

Trunk-Based - الخطافات (Hooks)

#!/bin/bash
# .git/hooks/pre-push

# التحقق من نجاح الاختبارات قبل الدفع
npm test
if [ $? -ne 0 ]; then
    echo "Tests failed. Push aborted."
    exit 1
fi

# التحقق من تنسيق الشيفرة
npm run lint
if [ $? -ne 0 ]; then
    echo "Linting failed. Push aborted."
    exit 1
fi

تمارين عملية

التمرين 1: محاكاة GitHub Flow

# 1. إنشاء مستودع تجريبي
mkdir github-flow-demo
cd github-flow-demo
git init
echo "# GitHub Flow Demo" > README.md
git add README.md
git commit -m "Initial commit"

# 2. محاكاة تطوير ميزة
git checkout -b feature/add-calculator
echo "function add(a, b) { return a + b; }" > calculator.js
git add calculator.js
git commit -m "feat: add calculator function"

# 3. محاكاة Pull Request (دمج)
git checkout main
git merge --no-ff feature/add-calculator
git branch -d feature/add-calculator

# 4. التكرار مع ميزات أخرى
git checkout -b feature/add-tests
echo "// Tests for calculator" > calculator.test.js
git add calculator.test.js
git commit -m "test: add calculator tests"

git checkout main
git merge --no-ff feature/add-tests
git branch -d feature/add-tests

التمرين 2: تجربة Git Flow

# 1. تهيئة Git Flow
git flow init

# 2. إنشاء ميزة
git flow feature start user-authentication
echo "function login() { /* auth logic */ }" > auth.js
git add auth.js
git commit -m "feat: add login function"
git flow feature finish user-authentication

# 3. إنشاء إصدار
git flow release start 1.0.0
echo "1.0.0" > VERSION
git add VERSION
git commit -m "bump: version to 1.0.0"
git flow release finish 1.0.0

# 4. محاكاة hotfix
git flow hotfix start critical-fix
echo "// Fixed critical bug" >> auth.js
git add auth.js
git commit -m "fix: resolve critical authentication bug"
git flow hotfix finish critical-fix

أفضل الممارسات المشتركة

رسائل commit

# اصطلاح Conventional Commits
feat: add new user authentication system
fix: resolve login timeout issue
docs: update API documentation
style: format code according to style guide
refactor: restructure user service
test: add unit tests for payment module
chore: update dependencies

حماية الفروع

# عبر GitHub CLI
gh api repos/:owner/:repo/branches/main/protection \
  --method PUT \
  --field required_status_checks='{"strict":true,"contexts":["ci"]}' \
  --field enforce_admins=true \
  --field required_pull_request_reviews='{"required_approving_review_count":2}'

الأتمتة

# .github/workflows/workflow-enforcement.yml
name: Workflow Enforcement
on:
  pull_request:
    branches: [main]

jobs:
  check-branch-name:
    runs-on: ubuntu-latest
    steps:
      - name: Check branch name
        run: |
          if [[ ! "${{ github.head_ref }}" =~ ^(feature|fix|hotfix)/.+ ]]; then
            echo "Branch name must start with feature/, fix/, or hotfix/"
            exit 1
          fi

موارد إضافية

أدوات سير العمل

  • Git Flow AVH: امتداد Git Flow المحسّن
  • GitHub CLI: أتمتة مسارات عمل GitHub
  • GitKraken Glo: إدارة المشاريع المدمجة
  • Sourcetree: واجهة رسومية تدعم مسارات العمل

التوثيق

الخاتمة

يعتمد اختيار مسار عمل Git على عوامل عديدة: حجم الفريق، ونوع المشروع، وتكرار النشر، وثقافة الشركة. والأهم هو اختيار مسار عمل يناسب سياقكم والالتزام به باستمرار.

في الدرس القادم، سنستكشف الوحدات الفرعية (submodules) والأشجار الفرعية (subtrees) في Git لإدارة المشاريع المعقدة ذات التبعيات الخارجية.


مدة القراءة المقدّرة: 35 دقيقة
المستوى: متقدم
المرحلة السابقة: حل التعارضات
المرحلة التالية: وحدات Git الفرعية والأشجار الفرعية