Git و GitHub

أفضل ممارسات Git

13 دقيقة الدرس 32 من 35

أفضل ممارسات Git

في هذا الدرس، سنستكشف ممارسات Git الأساسية التي ستساعدك على الحفاظ على مستودعات نظيفة وآمنة وفعالة. اتباع هذه الممارسات سيجعل التعاون أسهل ويمنع الأخطاء الشائعة.

الالتزام بشكل متكرر، الدفع بانتظام

الالتزامات المتكررة والدفع المنتظم يحميان عملك ويحسنان التعاون:

الالتزام بشكل متكرر: ✓ التزم بعد إكمال وحدة عمل منطقية ✓ لا تنتظر حتى نهاية اليوم للالتزام ✓ ينشئ تاريخاً أكثر تفصيلاً ✓ أسهل لتحديد متى تم تقديم الأخطاء ✓ أبسط للعودة عن تغييرات محددة الدفع بانتظام: ✓ ادفع مرة واحدة على الأقل يومياً ✓ نسخ احتياطي لعملك إلى البعيد ✓ مشاركة التقدم مع الفريق ✓ تمكين الكشف المبكر عن التعارضات ✓ منع تعارضات الدمج الكبيرة
القاعدة الذهبية: التزم محلياً عندما تعمل ميزة أو إصلاح. ادفع إلى البعيد عندما يكون جاهزاً للآخرين لرؤيته. فكر: "التزم لك، ادفع لهم."

الحفاظ على الالتزامات الذرية والمركزة

الالتزامات الذرية تحتوي على تغيير منطقي واحد وتجعل التاريخ أسهل للفهم:

جيد - الالتزامات الذرية: ✓ "Add user authentication endpoint" ✓ "Fix login button alignment" ✓ "Update API documentation" سيء - الالتزامات غير الذرية: ✗ "Fix bugs and add features" ✗ "Friday afternoon changes" ✗ "Various updates"

كيفية تجهيز التغييرات الجزئية:

# تجهيز ملفات محددة git add file1.js file2.css # التجهيز التفاعلي (وضع التصحيح) git add -p # تجهيز الملفات المعدلة فقط (وليس الملفات الجديدة) git add -u # تجهيز كل شيء في دليل git add src/components/
نصيحة: استخدم git add -p لمراجعة كل تغيير قبل التجهيز. هذا يساعدك على تقسيم التغييرات غير المرتبطة إلى التزامات منفصلة.

كتابة رسائل التزام ذات معنى

رسائل الالتزام الجيدة تشرح لماذا تم إجراء التغييرات، وليس فقط ما تغير:

هيكل رسالة الالتزام: <type>(<scope>): <subject> <body> <footer> مثال: feat(auth): implement JWT token refresh Add automatic token refresh mechanism to prevent session expiration during active use. Tokens are refreshed 5 minutes before expiration. Closes #123

أنواع الالتزامات التقليدية:

feat: ميزة جديدة fix: إصلاح خطأ docs: تغييرات التوثيق style: تنسيق الكود (بدون تغيير منطقي) refactor: إعادة هيكلة الكود (بدون تغيير السلوك) test: إضافة أو تحديث الاختبارات chore: مهام الصيانة (التبعيات، البناء) perf: تحسينات الأداء ci: تغييرات تكوين CI/CD revert: التراجع عن التزام سابق
رسائل التزام جيدة: ✓ "fix(api): handle null values in user response" ✓ "refactor(auth): extract validation logic to service" ✓ "docs(readme): add installation instructions" رسائل التزام سيئة: ✗ "fix stuff" ✗ "update" ✗ "asdfasdf" ✗ "fix fix fix"
أفضل ممارسة: اكتب رسائل الالتزام بصيغة الأمر: "Add feature" وليس "Added feature" أو "Adds feature". فكر: "إذا طُبق، هذا الالتزام سـ <رسالتك>".

استخدام الفروع بفعالية

إدارة الفروع المناسبة تحافظ على قاعدة الكود منظمة والتعاون سلساً:

اتفاقيات تسمية الفروع: feature/add-user-profile bugfix/fix-login-error hotfix/critical-security-patch release/v1.2.0 experiment/new-architecture النمط: <type>/<description> - استخدم الأحرف الصغيرة - استخدم الواصلات، وليس الشرطات السفلية - اجعلها وصفية لكن موجزة - قم بتضمين رقم التذكرة إن وُجد: feature/AUTH-123-login

أفضل ممارسات دورة حياة الفرع:

# 1. إنشاء فرع من main المحدث git checkout main git pull git checkout -b feature/new-dashboard # 2. العمل على الميزة، الالتزام بانتظام git add . git commit -m "feat: add dashboard layout" # 3. الحفاظ على الفرع محدثاً مع main git checkout main git pull git checkout feature/new-dashboard git merge main # أو git rebase main # 4. الدفع وإنشاء PR git push -u origin feature/new-dashboard # 5. بعد الدمج، التنظيف git checkout main git pull git branch -d feature/new-dashboard git remote prune origin
مهم: احذف الفروع بعد الدمج. الفروع القديمة تزدحم المستودع وتربك أعضاء الفريق حول ما هو نشط.

الحفاظ على تاريخ نظيف

تاريخ Git النظيف أسهل للتنقل والفهم:

قبل الدفع إلى الفروع المشتركة: # دمج التزامات صغيرة متعددة git rebase -i HEAD~5 # إصلاح الأخطاء المطبعية في رسالة الالتزام الأخيرة git commit --amend # إعادة ترتيب الالتزامات منطقياً git rebase -i main # تنظيف التزامات "WIP" git rebase -i --autosquash
قاعدة حرجة: لا تعيد أبداً أساس أو تعديل الالتزامات التي تم دفعها إلى الفروع المشتركة. أعد كتابة التاريخ فقط على فروع الميزات المحلية الخاصة بك.

استخدام التزامات الإصلاح لتاريخ أنظف:

# إجراء التزام أولي git commit -m "feat: add login form" # لاحقاً، إصلاح شيء في ذلك الالتزام git add . git commit --fixup HEAD # قبل الدفع، دمج التزامات الإصلاح git rebase -i --autosquash main

اعتبارات الأمان

حماية مستودعاتك ومعلوماتك الحساسة:

قائمة تحقق الأمان: ✓ لا تلتزم أبداً بكلمات المرور أو مفاتيح API أو الأسرار ✓ استخدم متغيرات البيئة للبيانات الحساسة ✓ راجع التغييرات قبل الالتزام ✓ قم بتمكين 2FA على GitHub/GitLab ✓ استخدم مفاتيح SSH أو رموز الوصول الشخصية ✓ قم بتدوير بيانات الاعتماد بانتظام ✓ تدقيق أذونات وصول المستودع ✓ قم بتمكين قواعد حماية الفرع ✓ اطلب مراجعة الكود قبل الدمج ✓ مسح الأسرار في الالتزامات

لا تلتزم أبداً بالأسرار

الالتزام بالأسرار عن طريق الخطأ يعد مخاطرة أمنية خطيرة:

الأسرار الشائعة التي يجب تجنبها: - كلمات مرور قاعدة البيانات - مفاتيح ورموز API - المفاتيح الخاصة (ملفات .pem، .key) - أسرار عميل OAuth - بيانات اعتماد AWS/السحابة - مفاتيح التشفير - أسرار الجلسة

إذا التزمت بسر عن طريق الخطأ:

# 1. قم بتدوير بيانات الاعتماد المكشوفة على الفور # 2. قم بإزالته من تاريخ Git (إذا لم يتم الدفع بعد) git reset --soft HEAD~1 # تحرير الملفات لإزالة السر git add . git commit -m "fix: remove accidentally committed secret" # 3. إذا تم الدفع بالفعل، استخدم أدوات مثل BFG Repo-Cleaner bfg --replace-text secrets.txt git reflog expire --expire=now --all git gc --prune=now --aggressive # 4. دفع قسري (قم بالتنسيق مع الفريق!) git push --force-with-lease
حرج: بمجرد دفع سر إلى مستودع عام، اعتبره مخترقاً للأبد. حتى لو أزلته، فإنه موجود في التاريخ ويمكن الوصول إليه. قم دائماً بتدوير بيانات الاعتماد على الفور.

أفضل ممارسات .gitignore

.gitignore المناسب يمنع الالتزام بملفات غير ضرورية أو حساسة:

# البيئة والأسرار .env .env.local *.key *.pem secrets.yml # التبعيات node_modules/ vendor/ *.egg-info/ # مخرجات البناء dist/ build/ *.pyc *.class # ملفات IDE .vscode/ .idea/ *.swp *.swo # ملفات نظام التشغيل .DS_Store Thumbs.db # السجلات *.log logs/ # الملفات المؤقتة tmp/ temp/ *.tmp

gitignore عام للتفضيلات الشخصية:

# تكوين gitignore عام git config --global core.excludesfile ~/.gitignore_global # إنشاء ~/.gitignore_global مع ملفات خاصة بـ IDE/OS # محتوى مثال: .DS_Store .vscode/ .idea/ *.swp
نصيحة محترف: استخدم gitignore.io لتوليد ملفات .gitignore شاملة لمجموعة التقنيات الخاصة بك.

استراتيجيات الملفات الكبيرة

Git مصمم لكود المصدر، وليس للملفات الثنائية الكبيرة. تعامل معها بشكل صحيح:

خيارات للملفات الكبيرة: 1. لا تلتزم بها (الأفضل للملفات المؤقتة) - أضف إلى .gitignore - التخزين في التخزين السحابي (S3، Google Drive) 2. Git LFS (للملفات الكبيرة المنسوخة) - الصور، الفيديوهات، مجموعات البيانات - ملفات التصميم (PSD، AI، Sketch) - ملفات PDF للتوثيق الكبيرة 3. مستودع منفصل - احتفظ بالأصول الكبيرة في مستودع مختلف - الإشارة عبر الوحدات الفرعية أو مدير الحزم

إعداد Git LFS:

# تثبيت Git LFS git lfs install # تتبع أنواع الملفات الكبيرة git lfs track "*.psd" git lfs track "*.ai" git lfs track "*.mp4" git lfs track "*.zip" # الالتزام بملف .gitattributes git add .gitattributes git commit -m "chore: configure Git LFS" # إضافة والالتزام بالملفات الكبيرة بشكل طبيعي git add large-file.psd git commit -m "feat: add design mockup" git push
حدود الحجم: GitHub لديه حد حجم ملف 100 ميجابايت. الملفات الأكبر من 50 ميجابايت ستولد تحذيرات. استخدم Git LFS للملفات التي تزيد عن 10 ميجابايت.

أفضل ممارسات الأداء

حافظ على عمليات Git سريعة وفعالة:

# تمكين المعالجة المتوازية git config --global checkout.workers 8 # استخدام الاستنساخات الضحلة لـ CI/CD git clone --depth 1 <url> # تحسين المستودع git gc --aggressive # تقليل حجم الاستنساخ git clone --single-branch --branch main <url> # تمكين مراقب نظام الملفات (للمستودعات الكبيرة) git config core.fsmonitor true # تمكين رسم الالتزامات لعمليات أسرع git config core.commitGraph true git commit-graph write --reachable

أفضل ممارسات مراجعة الكود

اجعل التزاماتك سهلة المراجعة:

قبل طلب المراجعة: ✓ قم بمراجعة تغييراتك ذاتياً ✓ قم بتشغيل الاختبارات والمدققات ✓ تحديث التوثيق ✓ دمج التزامات WIP ✓ اكتب وصف PR وصفي ✓ الربط بالقضايا ذات الصلة ✓ إضافة لقطات شاشة لتغييرات UI ✓ طلب مراجعين محددين ✓ وضع علامة كمسودة إذا لم تكن جاهزة

قائمة تحقق سير عمل Git اليومية

اتبع هذا الروتين اليومي لعمليات Git السلسة:

الصباح: 1. git checkout main 2. git pull origin main 3. git checkout <feature-branch> 4. git merge main (أو rebase) خلال اليوم: 5. git add <files> (تجهيز التغييرات الهادفة) 6. git commit -m "meaningful message" 7. كرر أثناء إكمال وحدات العمل نهاية اليوم: 8. git push origin <feature-branch> 9. git status (تأكد من دليل عمل نظيف) قبل PR: 10. git rebase -i main (تنظيف الالتزامات) 11. git push --force-with-lease 12. إنشاء طلب سحب

تمرين تطبيقي:

تدقيق ممارسات Git الخاصة بك:

  1. راجع آخر 10 التزامات - هل تتبع أفضل الممارسات؟
  2. تحقق من .gitignore - هل جميع الملفات الضرورية مستثناة؟
  3. قم بمسح مستودعك بحثاً عن ملفات كبيرة (استخدم du -sh *)
  4. أنشئ .gitignore شاملاً لمشروعك الحالي
  5. اكتب 3 رسائل التزام تتبع الالتزامات التقليدية
  6. نظف أي فروع ميزات مدمجة
  7. قم بإعداد Git LFS إذا كان لديك ملفات كبيرة

الملخص

في هذا الدرس، تعلمت:

  • الالتزام بشكل متكرر والدفع بانتظام لحماية العمل
  • الحفاظ على الالتزامات الذرية، المركزة، والموصوفة جيداً
  • كتابة رسائل التزام ذات معنى باستخدام الالتزامات التقليدية
  • استخدام الفروع بفعالية مع اتفاقيات تسمية واضحة
  • الحفاظ على تاريخ نظيف دون إعادة كتابة الالتزامات المشتركة
  • ممارسات الأمان: لا تلتزم بالأسرار أبداً، استخدم .gitignore
  • التعامل مع الملفات الكبيرة باستخدام Git LFS أو استراتيجيات بديلة
  • تحسين أداء Git لكفاءة أفضل
  • اتباع قائمة تحقق سير العمل اليومية للاتساق
التالي: في الدرس التالي، سنستكشف ميزات GitHub المتقدمة التي تمتد إلى ما هو أبعد من وظائف Git الأساسية!