We are still cooking the magic in the way!
Git و GitHub
سير عمل Git الأساسي
سير عمل Git الأساسي
الآن بعد أن فهمت بنية Git، حان الوقت لوضع تلك المعرفة موضع التنفيذ. في هذا الدرس، سنتعلم سير عمل Git الأساسي: إنشاء المستودعات، فهم عملية الثلاث مراحل، وإجراء أول التزاماتك.
إنشاء مستودع جديد
هناك طريقتان لبدء العمل مع Git: إنشاء مستودع جديد أو استنساخ مستودع موجود.
الطريقة 1: git init - إنشاء مستودع جديد
# إنشاء مجلد مشروع جديد
mkdir my-project
cd my-project
# تهيئة مستودع Git
git init
الإخراج:
Initialized empty Git repository in /path/to/my-project/.git/
ماذا حدث؟
Git أنشأت مجلد .git يحتوي على:
• جميع بنية Git الضرورية
• ملفات التكوين
• قاعدة بيانات الكائنات
• المراجع (الفروع)
مجلدك الآن مستودع Git!
نصيحة: يمكنك تهيئة Git في مشروع موجود بملفات. لن تتتبع Git تلقائياً حتى تضيفها صراحةً.
الطريقة 2: git clone - نسخ مستودع موجود
# استنساخ مستودع من URL
git clone https://github.com/username/repository.git
# استنساخ باسم مجلد مختلف
git clone https://github.com/username/repository.git my-folder
# استنساخ فرع محدد
git clone -b branch-name https://github.com/username/repository.git
ما يفعله git clone:
1. ينشئ مجلداً جديداً
2. يهيئ مجلد .git بالداخل
3. يحمل جميع بيانات المستودع
4. يفحص الفرع الافتراضي
5. يعد تتبع البعيد
النتيجة: لديك نسخة كاملة من المستودع مع التاريخ الكامل.
سير العمل ذو الثلاث مراحل
فهم سير عمل Git ذو الثلاث مراحل أمر بالغ الأهمية للتحكم الفعال في الإصدار:
المرحلة 1: مجلد العمل (معدل)
ملفات مشروعك الفعلية حيث تجري التغييرات.
المرحلة 2: منطقة التدريج (مرحلي)
منطقة احتجاز حيث تعد التغييرات للالتزام.
المرحلة 3: المستودع (ملتزم)
تخزين دائم للقطات في مجلد .git.
التدفق:
[مجلد العمل] --add--> [منطقة التدريج] --commit--> [المستودع]
سير العمل الأساسي أثناء العمل
لنمر بمثال كامل:
الخطوة 1: إنشاء وتعديل الملفات
# تهيئة المستودع
git init my-website
cd my-website
# إنشاء ملف جديد
echo "<h1>Welcome to My Website</h1>" > index.html
# التحقق من الحالة
git status
الإخراج:
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.html
nothing added to commit but untracked files present
فهم "غير متتبع": Git ترى الملف لكن لا تتتبع تغييراته بعد. تحتاج لإخبار Git صراحةً لتتبعه.
الخطوة 2: تدريج التغييرات
# إضافة ملف إلى منطقة التدريج
git add index.html
# التحقق من الحالة مرة أخرى
git status
الإخراج:
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: index.html
ما يفعله git add:
1. يأخذ لقطة من محتوى الملف
2. يخزنها ككائن blob في .git/objects
3. يضيف الملف إلى منطقة التدريج (الفهرس)
4. يوسمه كـ "جاهز للالتزام"
الملف الآن مدرج لكن لم يلتزم به بعد.
الخطوة 3: الالتزام بالتغييرات
# الالتزام بالتغييرات المدرجة
git commit -m "Add homepage with welcome message"
الإخراج:
[main (root-commit) a1b2c3d] Add homepage with welcome message
1 file changed, 1 insertion(+)
create mode 100644 index.html
ما يفعله git commit:
1. ينشئ كائن شجرة يمثل بنية المشروع
2. ينشئ كائن التزام مع:
• مرجع للشجرة
• معلومات المؤلف والملتزم
• رسالة الالتزام
• الالتزام الأصل (إذا لم يكن أول التزام)
3. يحدّث الفرع الحالي ليشير إلى التزام جديد
4. يحدّث HEAD ليشير إلى الفرع
تغييراتك الآن محفوظة بشكل دائم في تاريخ Git!
سير عمل ملفات متعددة
# إنشاء ملفات متعددة
echo "body { font-family: Arial; }" > style.css
echo "console.log('Hello');" > script.js
mkdir images
# التحقق من الحالة
git status
الإخراج:
Untracked files:
script.js
style.css
# إضافة ملفات محددة
git add style.css script.js
# أو إضافة جميع الملفات في المجلد الحالي
git add .
# أو إضافة جميع الملفات المعدلة والجديدة في المستودع بأكمله
git add -A
# الالتزام
git commit -m "Add CSS and JavaScript files"
كن حذراً مع git add .: هذا يضيف كل شيء في المجلد الحالي، والذي قد يتضمن ملفات لا تريد تتبعها (مثل كلمات المرور أو مفاتيح API أو ملفات ثنائية كبيرة). راجع دائماً ما تضيفه!
أفضل الممارسات للالتزامات
1. الالتزامات الذرية
ما هي الالتزامات الذرية؟
كل التزام يجب أن يمثل تغيير منطقي واحد.
❌ سيئ: التزام واحد مع 10 تغييرات غير مرتبطة
"Fix bug, add feature, update docs, refactor code"
✓ جيد: أربعة التزامات منفصلة
الالتزام 1: "Fix login validation bug"
الالتزام 2: "Add password reset feature"
الالتزام 3: "Update API documentation"
الالتزام 4: "Refactor authentication module"
الفوائد:
• أسهل لفهم ما تغير
• أسهل لإرجاع تغييرات محددة
• مراجعة كود أفضل
• تاريخ مشروع أوضح
2. متى تلتزم
التزم عندما:
✓ تكمل وحدة عمل منطقية
✓ تصلح خطأ
✓ تضيف ميزة جديدة (حتى لو غير مكتملة)
✓ تصل إلى حالة مستقرة
✓ قبل التبديل بين المهام
✓ قبل تجربة شيء محفوف بالمخاطر
لا تلتزم عندما:
❌ الكود لا يترجم/يعمل
❌ الاختبارات فاشلة (ما لم توثق الفشل)
❌ تغييرات نصف منتهية تكسر الوظيفة
❌ لست متأكداً مما غيرته
قاعدة عامة:
التزم مبكراً، التزم كثيراً - لكن احتفظ بالتزامات منطقية!
3. تردد الالتزام
التزامات قليلة جداً:
❌ فقدان التاريخ الدقيق
❌ صعوبة تحديد متى تم إدخال الأخطاء
❌ صعوبة إرجاع تغييرات محددة
التزامات كثيرة جداً:
❌ تاريخ فوضوي
❌ التزامات "Fixed typo" في كل مكان
❌ صعوبة رؤية الصورة الكبيرة
في المنتصف:
✓ كل التزام يمثل عملاً مكتملاً
✓ تقدم واضح للتغييرات
✓ سهولة فهم تطور المشروع
مثال على تردد التزام جيد:
الصباح: "Implement user authentication"
بعد الظهر: "Add email verification"
المساء: "Write authentication tests"
ليس: كل 5 دقائق مع التزامات "WIP"
كتابة رسائل التزام جيدة
رسائل الالتزام حاسمة لفهم تاريخ المشروع:
تشريح رسالة التزام جيدة:
سطر الموضوع (50 حرفاً أو أقل)
|
v
Add user authentication with JWT tokens
سطر فارغ فاصل
وصف تفصيلي (التفاف عند 72 حرفاً)
- Implement login and registration endpoints
- Add JWT token generation and validation
- Include refresh token functionality
- Add password hashing with bcrypt
التغييرات الكسرية أو السياق الإضافي هنا
إرشادات سطر الموضوع
أسطر موضوع جيدة:
✓ "Fix memory leak in image processing"
✓ "Add user profile page"
✓ "Update dependencies to latest versions"
✓ "Refactor database connection logic"
أسطر موضوع سيئة:
❌ "Fixed stuff"
❌ "Update"
❌ "asdfasdf"
❌ "Final version"
❌ "Changes"
القواعد:
1. استخدم صيغة الأمر: "Add feature" وليس "Added feature"
2. ابدأ بحرف كبير
3. بدون نقطة في النهاية
4. كن محدداً ووصفياً
5. احتفظ بها تحت 50 حرفاً
لماذا صيغة الأمر؟
فكر في الالتزامات كتعليمات:
✓ "Add login form" = إذا طبق، هذا الالتزام سيضيف نموذج تسجيل دخول
✓ "Fix validation bug" = إذا طبق، هذا الالتزام سيصلح خطأ التحقق
✓ "Remove deprecated code" = إذا طبق، هذا الالتزام سيزيل الكود المهمل
هذا يطابق رسائل Git الخاصة:
• "Merge branch 'feature'"
• "Revert 'Add broken feature'"
الاتساق يجعل التاريخ أسهل في القراءة!
متى تضيف وصفاً تفصيلياً
أضف تفاصيل عندما:
• التغيير معقد
• تحتاج لشرح لماذا (وليس فقط ماذا)
• هناك تغييرات كسرية
• ملفات متعددة متأثرة
• السياق مطلوب للمطورين المستقبليين
مثال:
git commit -m "Refactor authentication system
Replace custom auth with JWT tokens for better security.
This change affects:
- Login endpoint (/api/auth/login)
- Registration endpoint (/api/auth/register)
- All protected routes now require Bearer token
Breaking change: Old session-based auth no longer supported.
Update clients to use Authorization header.
Related to issue #42"
مثال سير عمل عملي
إليك مثال كامل من العالم الحقيقي:
# اليوم 1: ابدأ ميزة جديدة
git init blog-project
cd blog-project
# إنشاء ملفات أولية
echo "# My Blog" > README.md
echo "<h1>Blog</h1>" > index.html
git add .
git commit -m "Initial commit with README and homepage"
# إضافة تنسيق
echo "body { margin: 0; }" > style.css
git add style.css
git commit -m "Add basic CSS reset"
# إنشاء بنية منشور المدونة
mkdir posts
echo "<article>First post</article>" > posts/post1.html
git add posts/
git commit -m "Add blog post template structure"
# عرض التاريخ
git log --oneline
الإخراج:
c3d4e5f Add blog post template structure
b2c3d4e Add basic CSS reset
a1b2c3d Initial commit with README and homepage
ملخص أوامر سير العمل الشائعة
# تهيئة مستودع جديد
git init
# استنساخ مستودع موجود
git clone <url>
# التحقق من الحالة
git status
# تدريج الملفات
git add <file> # ملف محدد
git add . # المجلد الحالي
git add -A # جميع التغييرات
# الالتزام بالتغييرات المدرجة
git commit -m "message"
# تدريج والالتزام في خطوة واحدة (ملفات متتبعة فقط)
git commit -am "message"
# عرض تاريخ الالتزام
git log
git log --oneline # عرض مضغوط
git log --graph # بنية الفرع المرئية
تمرين عملي:
أنشئ مشروع Git الأول الخاص بك:
- أنشئ مجلداً جديداً يسمى "my-portfolio"
- هيئه كمستودع Git
- أنشئ ملف index.html باسمك
- درج والتزم بالملف مع رسالة "Add homepage"
- أنشئ ملف style.css مع تنسيق أساسي
- درج والتزم مع رسالة "Add stylesheet"
- اعرض تاريخ التزاماتك
الأوامر:
mkdir my-portfolio && cd my-portfolio
git init
echo "<h1>Your Name</h1>" > index.html
git add index.html
git commit -m "Add homepage"
echo "h1 { color: blue; }" > style.css
git add style.css
git commit -m "Add stylesheet"
git log --oneline
الملخص
في هذا الدرس، تعلمت:
- كيفية إنشاء المستودعات باستخدام git init و git clone
- سير العمل ذو الثلاث مراحل: مجلد العمل → التدريج → المستودع
- كيفية تدريج التغييرات باستخدام git add
- كيفية الالتزام بالتغييرات باستخدام git commit
- أفضل الممارسات للالتزامات الذرية
- متى تلتزم وكم مرة
- كيفية كتابة رسائل التزام فعالة
- سير عمل كامل من الإنشاء إلى الالتزام
التالي: في الدرس التالي، سنغوص بشكل أعمق في تتبع التغييرات، فهم إخراج git status، واستخدام .gitignore لاستبعاد الملفات!