إتقان Git و GitHub: دليل المطور
٢٨ مارس ٢٠٢٦
ملخص
يغطي هذا الدليل الشامل لـ Git و GitHub كل شيء بدءًا من مفاهيم التحكم في الإصدار الأساسية وصولاً إلى سير العمل المتقدم. ستتعلم أوامر Git الأساسية، واستراتيجيات التفريع (branching)، وتقنيات الدمج (merging)، وكيفية استخدام GitHub للتعاون. يتضمن الدليل أمثلة عملية، ووسائل إيضاح بصرية، ونصائح لاستكشاف الأخطاء وإصلاحها لمساعدتك في إتقان التحكم في الإصدار. تشمل المواضيع الرئيسية:
- إعداد Git على أي نظام تشغيل
- الأوامر الأساسية وسير العمل
- استراتيجيات التفريع وحل النزاعات (conflict resolution)
- التعاون عبر GitHub باستخدام طلبات السحب (pull requests)
- خطوط أنابيب CI/CD باستخدام GitHub Actions
- مقارنات بين واجهات المستخدم الرسومية (GUI)
- الأخطاء الشائعة وحلولها
- أفضل الممارسات للتطوير الاحترافي
مقدمة في التحكم في الإصدار و Git
يعد التحكم في الإصدار العمود الفقري لتطوير البرمجيات الحديثة، حيث يمكّن المطورين من تتبع التغييرات، والتعاون بفعالية، والحفاظ على سجل لتاريخ الكود الخاص بهم. أصبح Git، الذي أنشأه Linus Torvalds في عام 2005، المعيار الفعلي لأنظمة التحكم في الإصدار، حيث يدير ملايين المشاريع حول العالم.
لماذا يعد التحكم في الإصدار مهمًا
بدون التحكم في الإصدار، يواجه المطورون تحديات عديدة:
- صعوبة تتبع التغييرات عبر ملفات متعددة
- خطر فقدان العمل بسبب الحذف العرضي أو الكتابة فوق الملفات
- تحديات في التعاون مع أعضاء الفريق
- عدم وجود سجل واضح لمن قام بتغيير ماذا ولماذا
يحل Git هذه المشكلات من خلال توفير:
- التحكم الموزع في الإصدار (كل مطور لديه نسخة كاملة من المستودع)
- إمكانيات التفريع والدمج
- تتبع التغييرات على مستوى السطر
- النزاهة التشفيرية لقاعدة الكود بأكملها
مفاهيم Git الأساسية
فهم هذه المفاهيم الأساسية أمر بالغ الأهمية:
- المستودع (repo): مجموعة من الملفات وتاريخها الكامل
- Commit: لقطة (snapshot) لمستودعك في نقطة زمنية محددة
- الفرع (Branch): نسخة موازية من قاعدة الكود
- Clone: نسخة محلية من مستودع بعيد
- Pull: جلب التغييرات من مستودع بعيد
- Push: إرسال التغييرات إلى مستودع بعيد
- Merge: دمج التغييرات من فروع مختلفة
- Fork: نسخة شخصية من مشروع شخص آخر
GitHub: منصة التعاون
GitHub هي خدمة استضافة سحابية لمستودعات Git تضيف ميزات تعاون قوية:
- واجهة قائمة على الويب لإدارة المستودعات
- طلبات السحب (Pull requests) لمراجعة الكود
- تتبع المشكلات (Issue tracking)
- أدوات إدارة المشاريع
- GitHub Actions للأتمتة
- ميزات البرمجة الاجتماعية
إعداد Git
التثبيت
Windows
- قم بتنزيل أحدث إصدار من برنامج تثبيت Git لنظام Windows من git-scm.com
- قم بتشغيل برنامج التثبيت بالإعدادات الافتراضية
- تحقق من التثبيت:
git --version
macOS
باستخدام Homebrew:
brew install git
أو التنزيل من git-scm.com
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install git
الإعدادات
بعد التثبيت، قم بإعداد هويتك:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global init.defaultBranch main
قم بإعداد تفضيلات نهايات الأسطر:
# Windows
git config --global core.autocrlf true
# Linux/macOS
git config --global core.autocrlf input
أوامر Git الأساسية
تهيئة مستودع
mkdir my-project
cd my-project
git init
نسخ مستودع موجود
git clone https://GitHub.com/username/repository.git
التحقق من الحالة
git status
تجهيز التغييرات (Staging)
# Stage specific file
git add filename.ext
# Stage all changes
git add .
# Stage specific changes in a file (interactive)
git add -p
تثبيت التغييرات (Committing)
# Basic commit
git commit -m "Your commit message"
# Add and commit in one command
git commit -am "Your commit message"
# Amend the previous commit
git commit --amend
عرض التاريخ
# Basic log
git log
# Compact log
git log --oneline --graph
# Show changes in a specific file
git log -p filename.ext
# Show who changed what and when
git blame filename.ext
مقارنة التغييرات
# Show unstaged changes
git diff
# Show staged changes
git diff --staged
# Compare with specific commit
git diff commit_hash
التفريع والدمج
إنشاء الفروع والتبديل بينها
منذ إصدار Git 2.23، أصبح git switch هو الأمر الموصى به لتغيير الفروع (ليحل محل git checkout متعدد المهام):
# Create new branch
git branch feature-branch
# Switch to branch (modern)
git switch feature-branch
# Create and switch in one command (modern)
git switch -c feature-branch
# Legacy equivalents (still work, but git switch is clearer)
# git checkout feature-branch
# git checkout -b feature-branch
دمج الفروع
# Switch to target branch
git switch main
# Merge feature branch
git merge feature-branch
حل نزاعات الدمج
عند حدوث نزاعات:
- افتح الملفات المتنازع عليها
- ابحث عن علامات النزاع (
<<<<<<<،=======،>>>>>>>) - قم بحل النزاعات
- قم بتجهيز (stage) الملفات التي تم حلها
- قم بتثبيت (commit) التغييرات
# After resolving conflicts
git add resolved-file.ext
git commit -m "Resolve merge conflict"
استراتيجيات الدمج المتقدمة
إعادة التأسيس (Rebasing)
# Rebase current branch onto main
git switch feature-branch
git rebase main
# Interactive rebase (for rewriting history)
git rebase -i HEAD~3 # Last 3 commits
الانتقاء (Cherry-Picking)
# Apply a specific commit to current branch
git cherry-pick commit-hash
تخزين التغييرات مؤقتًا (Stashing)
# Save uncommitted changes
git stash
# Apply stashed changes
git stash pop
# List stashes
git stash list
# Apply specific stash
git stash apply stash@{n}
GitHub: استضافة الكود الخاص بك
إنشاء مستودع جديد
- انقر على أيقونة "+" في الزاوية العلوية اليمنى
- اختر "New repository"
- أدخل اسم المستودع والوصف
- اختر عام (public) أو خاص (private)
- قم بالتهيئة بملف README (اختياري)
- انقر على "Create repository"
الدفع إلى GitHub
# Add remote
git remote add origin https://GitHub.com/username/repository.git
# Push to main branch
git push -u origin main
سحب التغييرات
# Fetch and merge changes
git pull origin main
# Fetch changes without merging
git fetch origin
طلبات السحب ومراجعة الكود في GitHub
إنشاء طلب سحب
- ادفع فرعك إلى GitHub
- انقر على "Compare & pull request"
- أضف عنوانًا ووصفًا توضيحيًا
- اطلب مراجعين (reviewers)
- انقر على "Create pull request"
أفضل ممارسات مراجعة الكود
- اجعل طلبات السحب صغيرة ومركزة
- قم بتضمين أوصاف وسياق واضح
- اربط المشكلات (issues) ذات الصلة
- استخدم @mentions لطلب مراجعين محددين
- قم بمعالجة جميع الملاحظات قبل الدمج
مراجعة الكود
- تحقق من الوظائف والحالات الاستثنائية (edge cases)
- تأكد من نمط الكود واتساقه
- ابحث عن المشكلات الأمنية المحتملة
- اختبر التغييرات محليًا إذا لزم الأمر
- قدم ملاحظات بناءة
GitHub Actions و CI/CD
إنشاء سير عمل أساسي
أنشئ .GitHub/workflows/ci.yml:
name: CI Pipeline
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
تثبيت الإصدار (Version pinning): استخدم دائماً وسم إصدار رئيسي محدد (
@v6) بدلاً من@masterأو@main. هذا يمنع حدوث تغييرات جذرية غير متوقعة في سير عملك (workflows).
سير عمل النشر (Deployment Workflow)
name: Deploy to Production
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Deploy to server
uses: appleboy/ssh-action@v1.2.5
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm ci --omit=dev
pm2 restart myapp
مقارنة بين برامج واجهة Git الرسومية (GUI Clients)
GitHub Desktop
المميزات:
- واجهة بسيطة وسهلة الاستخدام
- رائع للمبتدئين
- تكامل مدمج مع GitHub
- يعمل على منصات متعددة (Windows, macOS)
العيوب:
- ميزات متقدمة محدودة
- أقل قابلية للتخصيص مقارنة بالبرامج الأخرى
Sourcetree
المميزات:
- مجاني وقوي
- تمثيل مرئي للفروع (branches)
- دعم الـ rebase التفاعلي
- تكامل مع Git-flow
العيوب:
- قد يكون مربكاً للمبتدئين
- مشاكل في الأداء أحياناً مع المستودعات الكبيرة
GitKraken
المميزات:
- واجهة جميلة وسهلة
- محرر مدمج لحل تعارضات الدمج (merge conflicts)
- دعم Git-flow و GitHub Flow
- يعمل على منصات متعددة (Windows, macOS, Linux)
العيوب:
- النسخة المجانية بها ميزات محدودة
- يستهلك موارد الجهاز بشكل كبير
تكامل Git في VS Code
المميزات:
- مدمج في المحرر الشهير
- خفيف وسريع
- قابل للتوسع باستخدام الإضافات (extensions)
- عرض الفروقات (diff) داخل السطور
العيوب:
- أقل مرئية من البرامج المتخصصة
- بعض الميزات المتقدمة تتطلب إضافات
استكشاف أخطاء Git الشائعة وإصلاحها
تعارضات الدمج (Merge Conflicts)
الأعراض: CONFLICT (content): Merge conflict in file.ext
الحل:
- افتح الملف وقم بحل التعارضات
- قم بعمل stage للملف الذي تم حله
- قم بعمل commit للتغييرات
رأس منفصل (Detached HEAD)
الأعراض: You are in 'detached HEAD' state
الحل:
# أنشئ فرعاً جديداً لحفظ التغييرات
git switch -c new-branch-name
فشل المصادقة (Authentication Failed)
الأعراض: fatal: Authentication failed for 'https://GitHub.com/...'
الحل:
- تحديث بيانات الاعتماد في مدير كلمات المرور (credential manager)
- أو استخدم SSH بدلاً من HTTPS
- أو استخدم رمز وصول شخصي (personal access token)
تغييرات غير مسجلة (Uncommitted Changes)
الأعراض: error: Your local changes to the following files would be overwritten
الحل:
# تخزين التغييرات مؤقتاً (Stash)
git stash
# أو تجاهل التغييرات (حديث — Git 2.23+)
git restore .
# المكافئ القديم: git checkout -- .
تخزين الملفات الكبيرة (LFS)
الأعراض: error: File is too large
الحل:
- تثبيت Git LFS
- تتبع الملفات الكبيرة:
git lfs install
git lfs track "*.psd"
git add .gitattributes
أفضل الممارسات في Git
رسائل الـ Commit
- استخدم صيغة الأمر ("Add feature" وليس "Added feature")
- اجعل سطر الموضوع أقل من 50 حرفاً
- أضف سطراً فارغاً بين الموضوع والمتن
- أشر إلى المشكلات (issues) أو التذاكر (tickets)
- اشرح "لماذا" وليس فقط "ماذا"
مثال:
Add user authentication middleware
- Implement JWT token verification
- Add protected routes
- Handle token expiration
Fixes #123
استراتيجية التفريع (Branching Strategy)
Git Flow:
main- كود الإنتاج (Production)develop- فرع التكاملfeature/- الميزات الجديدةrelease/- التحضير للإنتاجhotfix/- إصلاحات الإنتاج العاجلة
GitHub Flow (بديل أبسط):
main- دائماً قابل للنشر- فروع الميزات (Feature branches) - تُنشأ من main
- طلبات السحب (Pull requests) لجميع التغييرات
- النشر من فرع main
.gitignore
قم دائماً بتضمين ملف .gitignore لاستبعاد:
- ملفات البناء (Build artifacts)
- التبعيات (Dependencies)
- ملفات البيئة (Environment files)
- الملفات الخاصة بالمحرر
- ملفات نظام التشغيل
مثال لملف .gitignore لـ Node.js:
# Dependencies
node_modules/
# Environment variables
.env
# Build output
dist/
build/
# Logs
logs/
*.log
# Editor files
.vscode/
.idea/
*.swp
قائمة مراجعة الكود (Code Review Checklist)
- الكود يتبع إرشادات التنسيق (style guidelines)
- الاختبارات (tests) متضمنة وناجحة
- التوثيق (documentation) مُحدث
- لا يوجد كود تم تحويله لتعليق (commented-out code)
- معالجة الأخطاء مناسبة
- اعتبارات الأداء
- اعتبارات الأمان
المصادر ومزيد من التعلم
التوثيق الرسمي
- توثيق Git
- وثائق GitHub
- GitHub Skills — دورات تفاعلية عملية (بديلة لـ GitHub Learning Lab المتوقف)
التعلم التفاعلي
- Learn Git Branching — درس تفاعلي مرئي للتفريع والـ rebasing
- دروس Atlassian Git
الكتب
- "Pro Git" تأليف Scott Chacon و Ben Straub — متاح مجاناً عبر الإنترنت على git-scm.com/book، يتم تحديثه بانتظام وهو المرجع النهائي