سير عمل Git المتقدمة
استكشف تدفقات العمل الشائعة مثل Git Flow وGitHub Flow وTrunk-Based Development.
سير عمل Git المتقدمة
تحدد سير عمل Git (workflows) كيفية تنظيم الفرق لعملية التطوير باستخدام Git. يستعرض هذا الدرس أشهر المنهجيات ويساعدك على اختيار الأنسب لفريقك ومشروعك.
مقدمة إلى سير العمل
سير عمل Git هو مجموعة من القواعد والاتفاقيات التي تحدد:
- كيفية إنشاء الفروع وتسميتها
- متى وكيف يتم الدمج
- من يملك صلاحية القيام بماذا
- كيفية إدارة الإصدارات (releases)
Git Flow
المبدأ
Git Flow هو سير عمل منظم يعتمد على فروع متخصصة لأنواع مختلفة من التطوير.
بنية الفروع
الفروع الرئيسية
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 مع فروع ميزات قصيرة الأمد.
سير العمل خطوة بخطوة
# 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
- الفرع main قابل للنشر دائمًا
- فروع ذات أسماء وصفية تُنشأ انطلاقًا من main
- دفع متكرر إلى origin
- Pull Request لكل تعديل
- مراجعة إلزامية قبل الدمج
- دمج ونشر فوريان
إعداد 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
المبدأ
التطوير مباشرة على الفرع الرئيسي مع فروع قصيرة جدًا (< يوم واحد).
الممارسات الأساسية
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 مع فروع للبيئات.
البنية مع البيئات
# فروع البيئات
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) من المستودع الرئيسي.
سير العمل الكامل
# 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
اختيار سير العمل المناسب
معايير القرار
جدول المقارنة
| سير العمل | التعقيد | الفريق | النشر | الإصدارات |
|---|---|---|---|---|
| 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 الفرعية والأشجار الفرعية