المهمة: إنشاء مشروع، إجراء 3 إيداعات، وتصحيح الأخير.
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"
المهمة: ميزتان بالتوازي، ثم دمج نظيف.
# القاعدة
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 → رؤية الدمجات
المهمة: السيناريو نفسه، استراتيجيتان مختلفتان.
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 # عرض السجل مع الدمج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؟
المهمة: التنقّل بين عدة مهام.
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؟
المهمة: محاكاة طارئ مع reset.
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 دقيقة؟
إن نعم → أنت تتقن Git!