الرئيسية قاعدة المعرفة البرمجة والمنطق التحكم بالإصدارات مع Git: أساس العمل الجماعي
البرمجة والمنطق

التحكم بالإصدارات مع Git: أساس العمل الجماعي

لماذا التحكم بالإصدارات؟

تخيّل أنك تعمل على برنامج تحكم لخط إنتاج. أضفت ميزة جديدة — وفجأة توقف النظام عن العمل. تريد العودة للنسخة التي كانت تعمل بشكل صحيح، لكنك حفظت فوق الملف الأصلي. ضاع كل شيء.

هذا السيناريو يحدث يومياً في الشركات التي لا تستخدم التحكم بالإصدارات (Version Control). الحل؟ Git — النظام الذي يحفظ كل تغيير أجريته على الكود، ويسمح لك بالعودة لأي لحظة في تاريخ المشروع.

لماذا Git مهم للبرمجيات الصناعية؟

  • السلامة: لو حدث خلل، ترجع فوراً للنسخة المستقرة
  • التتبع: تعرف من غيّر ماذا ومتى ولماذا
  • التعاون: عدة مبرمجين يعملون على نفس المشروع بدون تضارب
  • التوثيق: تاريخ التغييرات يشكّل توثيقاً تلقائياً
  • التدقيق: مطلوب في المعايير الصناعية مثل IEC 62443

Git: المفاهيم الأساسية

Git يعمل بفكرة بسيطة: كل تغيير تحفظه يُسمى commit (لقطة). تاريخ المشروع هو سلسلة من هذه اللقطات.

التثبيت:
  Windows: حمّل من https://git-scm.com
  Linux:   sudo apt install git
  macOS:   brew install git

الإعداد الأولي:
  git config --global user.name "اسمك"
  git config --global user.email "بريدك@example.com"

المفاهيم الرئيسية:

المفهوم الشرح
Repository (مستودع) مجلد المشروع مع تاريخ التغييرات
Commit (لقطة) نقطة حفظ تسجّل حالة الملفات
Branch (فرع) خط تطوير مستقل
Merge (دمج) جمع فرعين معاً
Remote (بعيد) نسخة المستودع على الخادم (GitHub مثلاً)

العمل اليومي مع Git

إنشاء مستودع جديد

# إنشاء مشروع جديد
mkdir plc-monitor
cd plc-monitor
git init

# أو استنساخ مشروع موجود
git clone https://github.com/company/plc-monitor.git

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

# 1. تعديل الملفات (كتابة الكود)
#    ... تعدّل sensor_reader.py ...

# 2. مراجعة التغييرات
git status              # ما الملفات المتغيرة؟
git diff                # ما التفاصيل الدقيقة للتغييرات؟

# 3. إضافة الملفات للتجهيز (staging)
git add sensor_reader.py          # ملف واحد
git add src/                      # مجلد كامل
git add .                         # كل التغييرات

# 4. حفظ اللقطة (commit) مع رسالة واضحة
git commit -m "feat: add temperature threshold alarm for CNC line"

# 5. عرض التاريخ
git log --oneline

كتابة رسائل commit جيدة:

النمط: <نوع>: <وصف مختصر>

feat:     ميزة جديدة
fix:      إصلاح خلل
docs:     تحديث التوثيق
refactor: إعادة هيكلة بدون تغيير السلوك
test:     إضافة اختبارات

أمثلة:
  feat: add vibration monitoring for pump station
  fix: correct temperature unit conversion from F to C
  docs: update API reference for alarm endpoints

الفروع (Branches): خطوط تطوير متوازية

تصوّر أنك تريد إضافة ميزة جديدة لنظام المراقبة — لكن لا تريد المخاطرة بتعطيل النسخة المستقرة. الحل: أنشئ فرعاً جديداً.

# عرض الفروع
git branch

# إنشاء فرع جديد والانتقال إليه
git checkout -b feature/predictive-alerts

# الآن أنت في الفرع الجديد — كل التغييرات هنا معزولة
# ... تعدّل الكود ...
git add .
git commit -m "feat: implement moving average for predictive alerts"

# العودة للفرع الرئيسي
git checkout main

# دمج الفرع بعد الانتهاء
git merge feature/predictive-alerts

استراتيجية الفروع للفريق:

main          الكود المستقر في بيئة الإنتاج
  |
  +-- develop     فرع التطوير اليومي
       |
       +-- feature/alarm-queue     ميزة جديدة
       +-- feature/dashboard-v2    ميزة أخرى
       +-- fix/sensor-timeout      إصلاح خلل

تعارض الدمج (Merge Conflicts)

يحدث التعارض عندما يعدّل شخصان نفس السطر في نفس الملف. Git لا يستطيع اختيار أيهما صحيح — فيطلب منك التدخل:

# عند حدوث تعارض، يُظهر Git الملف هكذا:
def get_max_temperature():
<<<<<<< HEAD
    return 85.0  # النسخة في الفرع الحالي
=======
    return 90.0  # النسخة في الفرع المُدمج
>>>>>>> feature/new-limits

حل التعارض:

# 1. افتح الملف واختر النسخة الصحيحة (أو ادمجهما)
# 2. احذف علامات التعارض (<<<<, ====, >>>>)
# 3. اختبر الكود
# 4. أضف الملف وأكمل الدمج

git add config.py
git commit -m "fix: resolve temperature limit conflict, use 90°C per new spec"

نصائح لتجنب التعارضات:

  • اسحب التحديثات يومياً: git pull
  • اجعل الـ commits صغيرة ومركّزة
  • لا يعمل شخصان على نفس الملف في وقت واحد
  • تواصل مع الفريق حول المناطق المشتركة

العمل مع GitHub

GitHub (أو GitLab أو Bitbucket) هو خادم بعيد يخزّن نسخة من مستودعك ويسهّل التعاون:

# ربط مستودعك المحلي بـ GitHub
git remote add origin https://github.com/company/plc-monitor.git

# رفع الكود
git push origin main

# سحب التحديثات من الفريق
git pull origin main

سير عمل Pull Request

Pull Request (طلب سحب) هو الطريقة المنظمة لإضافة تغييرات — شخص يكتب الكود، وآخر يراجعه قبل الدمج:

1. أنشئ فرعاً:           git checkout -b feature/alarm-history
2. اكتب الكود والتزم:    git commit -m "feat: add alarm history view"
3. ارفع الفرع:           git push origin feature/alarm-history
4. أنشئ Pull Request على GitHub
5. الزملاء يراجعون الكود ويعلّقون
6. عدّل حسب الملاحظات وارفع مجدداً
7. عند الموافقة: يُدمج في main

أوامر Git الأساسية

الأمر الوظيفة
git init إنشاء مستودع جديد
git clone <url> استنساخ مستودع بعيد
git status عرض حالة الملفات
git add <file> إضافة ملف للتجهيز
git commit -m "msg" حفظ لقطة
git log --oneline عرض التاريخ
git branch عرض الفروع
git checkout -b <name> إنشاء فرع جديد
git merge <branch> دمج فرع
git pull سحب التحديثات
git push رفع التغييرات
git diff عرض الفروقات
git stash تخبئة التغييرات مؤقتاً
git revert <commit> التراجع عن لقطة محددة

ملف .gitignore: ما لا يجب تتبّعه

بعض الملفات يجب ألّا تكون في المستودع — كلمات المرور، ملفات البناء، بيانات الحساسات الضخمة:

# ملفات البيئة (كلمات مرور ومفاتيح)
.env
secrets.toml

# ملفات بناء
target/
__pycache__/
*.pyc

# بيانات ضخمة
data/*.csv
logs/

# إعدادات IDE
.vscode/
.idea/

Git ليس مجرد أداة — إنه ممارسة هندسية أساسية. في البرمجيات الصناعية حيث الخطأ قد يعني توقف خط إنتاج كامل، القدرة على تتبّع كل تغيير والعودة لأي نقطة سابقة ليست رفاهية — إنها ضرورة.

Git version-control branch merge commit GitHub جت التحكم بالإصدارات الفروع الدمج التاريخ العمل الجماعي