Git: مقدمة إلى Git ومفاهيم التحكم في الإصدارات
يُعد «Git» نظام التحكم في الإصدارات الموزع الأكثر شيوعًا في العالم — فهو يجعل التعاون بين أعضاء الفريق أمرًا بسيطًا وفعالًا.
صُمم هذا البرنامج التعليمي للمبتدئين الذين ليس لديهم خبرة سابقة. يبدأ البرنامج بأساسيات التحكم في الإصدارات ويتطور تدريجيًا حتى تصبح بارعًا في استخدام Git للتعاون الجماعي.
1. ما ستتعلمه
- المفاهيم الأساسية للتحكم في الإصدارات
- تاريخ Git وفلسفة تصميمه
- التحكم في الإصدارات الموزعة مقابل التحكم المركزي
- المزايا الأساسية لـ Git
- حالات استخدام Git
2. ما هو التحكم في الإصدارات؟
التحكم في الإصدارات هو نظام يتتبع التغييرات التي تطرأ على محتوى الملفات بحيث يمكن استرجاع إصدارات محددة في المستقبل.
(1) لماذا يعد التحكم في الإصدارات ضروريًا؟
تخيل أنك تكتب بحثًا:
Thesis-v1.doc # First Edition
Thesis-v2.doc # Some content has been revised.
Thesis-Final Version.doc # My advisor said I still need to revise it.
Thesis-Final Version2.doc # Made a few more changes
Thesis-I'll never change the layout.doc # This really is the final version.
Thesis-I'll never change the layout2.doc # All right,Still needs to be revised...
المشكلة في هذا النهج هي:
- أسماء الملفات المربكة: أي منها هو الإصدار النهائي الفعلي؟
- عدم إمكانية التتبع: من غير الواضح ما هي التغييرات التي أُجريت في كل مرة
- عرضة للأخطاء: ربما تكون قد قمت بتحرير إصدار غير صحيح من الملف
- تحديات التعاون: ماذا يجب أن تفعل عندما يقوم عدة أشخاص بتحرير الملف نفسه؟
وقد تم إنشاء أنظمة التحكم في الإصدارات خصيصًا لمعالجة هذه المشكلات.
3. تطور أنظمة التحكم في الإصدارات
(1) 3.1 التحكم المحلي في الإصدارات
كان الشكل الأقدم لنظام التحكم في الإصدارات يتمثل في تخزين جميع إصدارات الملف محليًّا.
graph TB
A[Local Database<br/>v1, v2, v3] --> B[Workspace]
أدوات تمثيلية: RCS (نظام التحكم في المراجعات)
العيوب: لا يدعم التعاون بين عدة مستخدمين
(2) 3.2 التحكم المركزي في الإصدارات
يتم تخزين جميع إصدارات مجموعة البيانات على خادم واحد. ويقوم أعضاء الفريق باسترداد الملفات من الخادم، وإجراء التغييرات عليها، ثم إرسالها مرة أخرى إلى الخادم.
graph TB
S[Central Server<br/>All Versions]
S --> A[UserA]
S --> B[UserB]
S --> C[UserC]
أدوات تمثيلية: CVS، Subversion (SVN)، Perforce
المزايا:
- سهلة الإدارة، مع نظام تحكم في الوصول بسيط
- يمكن للجميع رؤية ما يفعله الآخرون
العيوب:
- نقطة فشل واحدة: إذا تعطل الخادم، فلن يتمكن أحد من العمل.
- الاعتماد على الإنترنت: يلزم وجود اتصال بالإنترنت لتشغيل هذه الميزة
- بطيء: تتطلب جميع العمليات إرسال طلب إلى الخادم
(3) 3.3 التحكم في الإصدارات الموزعة
يمتلك كل مطور مستودعًا كاملاً للتحكم في الإصدارات (repository) يتضمن السجل الكامل.
graph LR
A[UserAWarehouse<br/>Complete History] <--> B[UserBWarehouse<br/>Complete History]
B <--> C[UserCWarehouse<br/>Complete History]
A <--> C
أدوات تمثيلية: Git، Mercurial، Bazaar
المزايا:
- العمل دون اتصال بالإنترنت: إرسال التغييرات، وعرض السجل، وإنشاء فروع دون الحاجة إلى اتصال بالإنترنت
- سريع: تُنفَّذ معظم العمليات محليًّا
- قدرة عالية على تحمل الأعطال: يُعد مستودع كل مستخدم نسخة احتياطية كاملة
- مسارات العمل المرنة: تدعم أوضاع تعاون متعددة
العيوب:
- عملية النسخ الأولية بطيئة (تتطلب تنزيل السجل بأكمله)
- المفهوم معقد نسبيًا
4. نشأة Git
(1) 4.1 أصول Git
في عام 2005، وقع حدث هام في مجتمع مطوري نواة لينكس:
- لطالما استخدم مشروع نواة لينكس نظام التحكم في الإصدارات «BitKeeper» المملوك لشركة خاصة
- قامت شركة «BitMover»، المالكة لـ«BitKeeper»، بإلغاء حقوق الاستخدام المجاني
- قرر لينوس تورفالدس، مؤسس نظام لينكس، تطوير نظام جديد لإدارة الإصدارات بمفرده
أهداف تصميم Git:
- السرعة: يجب أن تكون سريعة جدًّا
- البساطة: يجب أن يكون التصميم بسيطًا وأنيقًا
- دعم التطوير غير الخطي: يتيح إنشاء آلاف الفروع المتوازية
- موزعة بالكامل: يمتلك كل مطور مستودعًا كاملاً
- Efficient handling of large-scale projects: such as the Linux kernel
أنجز لينوس النسخة الأولية من Git في أبريل 2005 في غضون أسبوعين تقريبًا. واليوم، أصبح Git نظام التحكم في الإصدارات الأكثر شيوعًا في العالم.
(2) 4.2 فلسفة تصميم Git
يجسد تصميم Git عدة مبادئ أساسية:
لمحة عامة، وليس الاختلافات
تقوم أنظمة أخرى (مثل SVN) بتخزين الاختلافات بين الملفات:
v1: file.txt (Original Document)
v2: file.txt + diff1 (Storage Differences)
v3: file.txt + diff1 + diff2 (Cumulative Difference)
يخزن Git لقطة كاملة لكل عملية التزام:
v1: file.txtA complete snapshot of
v2: file.txtA complete snapshot of
v3: file.txtA complete snapshot of
المزايا:
- التبديل السريع للغاية بين الإصدارات (يقرأ اللقطات مباشرةً)
- إنشاء فرع لا يتطلب تكلفة كبيرة (فهو مجرد مؤشر)
تُجرى جميع العمليات تقريبًا محليًّا
- عرض السجل: محلي
- إرسال التغييرات: محلي
- إنشاء فرع: Local
- فرع التبديل: محلي
لا تتطلب سوى عمليات «الدفع» و«السحب» اتصالاً بالإنترنت.
5. المفاهيم الأساسية لـ Git
(1) 5.1 المستودع
يُعد «المستودع» مفهومًا أساسيًّا في Git، ويشمل ما يلي:
- مجلد العمل: الملفات التي تقوم بتحريرها فعليًّا
- منطقة التجهيز: التغييرات الجاهزة للتثبيت
- المستودع: سجل جميع عمليات التسجيل
graph TB
subgraph GitWarehouse
R[Repository .git<br/>All Commit History<br/>All Branch Information]
S[Buffer Stage<br/>Changes Ready to Be Submitted]
W[Workspace Work<br/>Files Actually Edited]
end
W -->|git add| S
S -->|git commit| R
(2) 5.2 الإرسال
يُعد «الالتزام» (commit) الوحدة الأساسية في Git، ويتألف من:
- لقطة: حالة جميع الملفات في لحظة زمنية محددة
- البيانات الوصفية: المؤلف، التاريخ، رسالة الالتزام، الالتزام الأصلي
- المعرّف الفريد: قيمة تجزئة SHA-1 مكونة من 40 حرفًا
commit a1b2c3d4e5f6... (40Bit Hash)
Author: Zhang San <zhangsan@example.com>
Date: 2024-01-01 10:00:00
Add User Login Functionality
(3) 5.3 الفرع
الفرع هو مؤشر قابل للنقل يشير إلى عملية التثبيت. إن إنشاء فرع في Git لا يتطلب جهدًا يذكر — فهو يتطلب ببساطة إنشاء ملف بحجم 41 بايت (تتكون من 40 بايت من التجزئة بالإضافة إلى حرف انتقال سطر واحد بحجم 1 بايت).
graph LR
C1[SubmitC1] --> C2[SubmitC2] --> C3[SubmitC3]
main[mainBranch] --> C3
feature[featureBranch] --> C3
6. حالات استخدام Git
(1) 6.1 المشاريع الشخصية
- تتبع سجل التعديلات: الرجوع إلى أي إصدار في أي وقت
- جرب الميزات الجديدة: أنشئ فرعًا لتجربتها، واحذفه إذا لم تنجح
- رمز النسخ الاحتياطي: إرسال إلى المستودع البعيد كنسخة احتياطية
(2) 6.2 العمل الجماعي
- التطوير المتوازي: عمل عدة أشخاص في وقت واحد على فروع مختلفة
- مراجعة الكود: عملية طلب السحب
- حل التضارب: الدمج التلقائي، وحل التضارب يدويًّا
(3) 6.3 مشاريع البرمجيات مفتوحة المصدر
- سير عمل عملية الفورك: قم أولاً بعمل فورك، ثم قم بإجراء التغييرات، وأخيرًا أرسل طلب سحب (PR)
- المساهمة بالكود: أرسل طلب سحب إلى المشروع
- تتبع النسخة الأصلية: ابقَ متزامنًا مع المشروع الأصلي
(4) 6.4 التكامل المستمر/النشر المستمر (CI/CD)
- الاختبار الآلي: يتم تشغيل الاختبارات تلقائيًا بعد إرسال الكود
- النشر التلقائي: يتم النشر تلقائيًا بعد نجاح الاختبار
- إصدار النسخة: وضع علامة على نسخة جديدة وإصدارها
7. Git مقابل أنظمة التحكم في الإصدارات الأخرى
| الميزات | Git | SVN | CVS |
|---|---|---|---|
| الهندسة | موزعة | مركزية | مركزية |
| العمل دون اتصال بالإنترنت | ✅ مدعوم بالكامل | ❌ غير مدعوم | ❌ غير مدعوم |
| إنشاء فرع | سريع جدًّا (O(1)) | بطيء (نسخ المجلد) | غير مدعوم |
| طريقة التخزين | لقطة | تفاضلية | تفاضلية |
| الاعتماد على الشبكة | الدفع/السحب فقط | جميع العمليات | جميع العمليات |
| التعافي من الكوارث | مرتفع (نسخ احتياطي كامل لكل شخص) | منخفض (يعتمد على الخادم) | منخفض |
▶ مثال: أوامر Git الأساسية
# InitializationGitWarehouse
git init
# View Repository Status
git status
# Add a file to the staging area
git add .
# Submit Changes
git commit -m "Initial Submission"
# View commit history
git log
❓ أسئلة شائعة
📖 ملخص
- التحكم في الإصدارات هو نظام يتتبع التغييرات التي تطرأ على الملفات، ويعالج مشكلات مثل الخلط بين الإصدارات وصعوبات التعاون.
- تطورت أنظمة التحكم في الإصدارات من النمط المحلي إلى النمط المركزي ثم إلى النمط الموزع.
- تم إنشاء Git على يد لينوس تورفالدس في عام 2005، وقد صُمم مع مراعاة السرعة والبساطة واللامركزية.
- يقوم Git بتخزين اللقطات بدلاً من الاختلافات، وتُجرى جميع العمليات تقريبًا محليًّا
- المفاهيم الأساسية لـ Git: المستودعات، عمليات التسجيل، الفروع
- يُعد Git مناسبًا للمشاريع الشخصية، والتعاون الجماعي، ومشاريع البرمجيات مفتوحة المصدر، والتكامل المستمر/التسليم المستمر (CI/CD)، وغيرها من السيناريوهات
📝 تمارين
-
السؤال الأساسي: اشرح بعباراتك الخاصة الفرق بين «التحكم في الإصدارات الموزع» و«التحكم في الإصدارات المركزي»، مع ذكر ثلاث نقاط على الأقل.
-
سؤال متقدم: ابحث عن المشاريع أو الشركات في منطقتك لمعرفة أدوات التحكم في الإصدارات التي تستخدمها، ولماذا اختارت تلك الأدوات.
-
التحدي: اقرأ الرسالة الإلكترونية الأصلية التي كتبها لينوس تورفالدس حول Git (ابحث عن «قائمة بريد لينوس تورفالدس الخاصة بـ Git») للتعرف على الخلفية وفلسفة التصميم الكامنة وراء إنشاء Git.