تمارين Git - اختبار عملي

1 دقيقة

جدول المحتويات

  1. التمرين 1: الأساسيات
  2. التمرين 2: الفروع
  3. التمرين 3: الدمج مقابل إعادة الأساس
  4. التمرين 4: Stash و cherry-pick
  5. التمرين 5: الطوارئ و reset

التمرين 1: الأساسيات

المهمة: إنشاء مشروع، إجراء 3 إيداعات، وتصحيح الأخير.

bash
mkdir test-git && cd test-git && git init

# 3 إيداعات
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
echo "print('v2')" > app.py && git add . && git commit -m "Version 2"
echo "print('v3 with bug')" > app.py && git add . && git commit -m "Version 3"

# تصحيح آخر إيداع
echo "print('v3 fixed')" > app.py && git add . && git commit --amend -m "Version 3 - Fixed"

التحقق: git log --oneline → 3 إيداعات، الأخير يقول "Fixed"

العودة إلى جدول المحتويات

التمرين 2: الفروع

المهمة: ميزتان بالتوازي، ثم دمج نظيف.

bash
# القاعدة
echo "print('main')" > main.py && git add . && git commit -m "Main app"

# الميزة 1
git checkout -b feature-login
echo "print('login')" > login.py && git add . && git commit -m "Add login"

# الميزة 2
git checkout main && git checkout -b feature-api
echo "print('api')" > api.py && git add . && git commit -m "Add API"

# دمج الكل في main
git checkout main
git merge feature-login
git merge feature-api

# تنظيف
git branch -d feature-login feature-api

التحقق: git log --graph --oneline → رؤية الدمجات

العودة إلى جدول المحتويات

التمرين 3: الدمج مقابل إعادة الأساس

المهمة: السيناريو نفسه، استراتيجيتان مختلفتان.

الاستراتيجية أ: الدمج

bash
mkdir test-merge && cd test-merge && git init
echo "print('base')" > app.py && git add . && git commit -m "Base"

# فرع ميزة
git checkout -b feature
echo "print('feature')" > feature.py && git add . && git commit -m "Add feature"

# main يتقدّم
git checkout main
echo "print('base v2')" > app.py && git add . && git commit -m "Update base"

# الدمج
git merge feature
git log --graph --oneline    # عرض السجل مع الدمج

الاستراتيجية ب: إعادة الأساس

bash
mkdir test-rebase && cd test-rebase && git init
echo "print('base')" > app.py && git add . && git commit -m "Base"

git checkout -b feature
echo "print('feature')" > feature.py && git add . && git commit -m "Add feature"

git checkout main
echo "print('base v2')" > app.py && git add . && git commit -m "Update base"

# إعادة الأساس
git checkout feature && git rebase main
git checkout main && git merge feature
git log --oneline           # سجل خطّي

سؤال: أي فرق تراه في git log؟

العودة إلى جدول المحتويات

التمرين 4: Stash و cherry-pick

المهمة: التنقّل بين عدة مهام.

bash
mkdir test-stash && cd test-stash && git init
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"

# تبدأ بالبرمجة
echo "print('work in progress')" >> app.py

# طارئ! يجب التبديل
git stash                    # حفظ
git checkout -b hotfix
echo "print('URGENT FIX')" > fix.py && git add . && git commit -m "Critical fix"

# Cherry-pick للإصلاح نحو main
git checkout main
git cherry-pick <hash-du-fix>

# العودة إلى عملك
git stash pop
echo "print('feature complete')" >> app.py && git add . && git commit -m "Feature done"

التحدّي: هل الإصلاح العاجل موجود في main و في hotfix؟

العودة إلى جدول المحتويات

التمرين 5: الطوارئ و reset

المهمة: محاكاة طارئ مع reset.

bash
mkdir test-urgence && cd test-urgence && git init

# عدة إيداعات
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
echo "print('v2')" > app.py && git add . && git commit -m "Version 2"
echo "print('v3')" > app.py && git add . && git commit -m "Version 3"
echo "print('v4 BROKEN')" > app.py && git add . && git commit -m "Version 4 - Bug!"

# يا للأسف! v4 يعطّل كل شيء في الإنتاج
git log --oneline                    # سجّل تجزئة v3

# الحل 1: Reset hard (مدمّر)
git reset --hard <hash-v3>           # العودة إلى v3، يختفي v4
git log --oneline                    # 3 إيداعات فقط

# الحل 2: Revert (آمن)
# إعادة v4 أولاً
git reset --hard <hash-v4>           # العودة إلى v4
git revert HEAD                      # إنشاء إيداع يلغي v4
git log --oneline                    # 5 إيداعات: v1,v2,v3,v4,revert-v4

الدرس: Revert = آمن للإنتاج، Reset = مقبول محلياً

العودة إلى جدول المحتويات


التحدّي النهائي

هل تستطيع فعل هذا كله في 15 دقيقة؟

  1. مشروع بـ 3 إيداعات
  2. فرعان بميزتين
  3. دمج واحد + إعادة أساس واحدة
  4. stash واحد + cherry-pick واحد
  5. reset أو revert طارئ واحد

إن نعم → أنت تتقن Git!

العودة إلى جدول المحتويات