ما المشكلة التي يحلها Git؟
إذا سألت معظم المطورين عن Git فغالبا ستسمع إجابات مثل:
- أداة لإدارة الإصدارات.
- أداة للتعاون بين أعضاء الفريق.
- أداة نستخدمها مع GitHub.
كل هذه الإجابات صحيحة لكنها تصف ما يفعله Git أكثر مما تشرح كيف يعمل. قبل أن ندرس مكونات Git الداخلية نحتاج أولا إلى فهم المشكلة التي جاء لحلها.
مشكلة تتبع التغييرات
تخيل أنك تعمل على مشروع يحتوي على ملف واحد:
app.jsفي البداية يحتوي الملف على:
function calculateTotal(price, quantity) {
return price * quantity;
}بعد فترة أضفت إلى الكود دعم الخصومات (Discounts):
function calculateTotal(price, quantity, discount = 0) {
const total = price * quantity;
return total - discount;
}ثم واصلت العمل على المشروع و أضفت تعديلات أخرى. بعد أسبوع اكتشفت أن أحد التغييرات تسبب في مشكلة داخل التطبيق.
الأسئلة التي تواجهك الآن:
- ما الذي تغير؟
- متى تغير؟
- من قام بهذا التغيير؟
- كيف يمكن العودة إلى النسخة السابقة؟

إذا كنت تحتفظ بنسخة واحدة فقط من الملف فسيكون من الصعب الإجابة عن هذه الأسئلة. لهذا السبب كان المطورون يحتفظون سابقا بعدة نسخ من المشروع:
project/
project-final/
project-final-v2/
project-final-v2-fixed/
project-final-v2-fixed-final/مع مرور الوقت تتحول هذه الطريقة إلى فوضى يصعب إدارتها. المشكلة ليست في تخزين الملفات، بل في تتبع التغييرات التي تحدث عليها مع مرور الوقت.

ما هو Version Control؟
يساعدنا نظام Version Control على إدارة التغييرات التي تطرأ على المشروع و الاحتفاظ بتاريخ يمكن الرجوع إليه لاحقا. بدلا من إنشاء نسخة جديدة من المشروع بعد كل تعديل يحتفظ النظام بسجل للتغييرات التي مر بها المشروع.
يتطور المشروع عبر سلسلة من النسخ المتتالية:
Version 1
↓
Version 2
↓
Version 3
↓
Version 4تمثل كل نسخة حالة المشروع في لحظة محددة. و هكذا نعرف ما الذي تغير و متى حدث التغيير. و يمكننا العودة إلى أي نقطة سابقة عند الحاجة.

هل Git مجرد نظام Version Control؟
من ناحية الاستخدام نعم لكن هذه ليست الصورة الكاملة. عندما نستخدم Git غالبا نتعامل مع أوامر مثل:
git add
git commit
git branch
git mergeلكن هذه الأوامر ليست سوى واجهة للتعامل مع نظام أعمق. يخزن Git البيانات أولا ثم يبني منها تاريخ المشروع. لهذا يمكن النظر إلى Git على أنه يتكون من جزأين رئيسيين:
Git
│
├── Data Storage System
│
└── History Management Systemالجزء الأول يخزن البيانات و يمثلها داخليا، بينما يدير الجزء الثاني تاريخ المشروع و العلاقات بين التغييرات المختلفة.

الفكرة الأساسية التي سترافقنا طوال الدورة
خلال هذه الدورة سنفهم كيف يعمل Git من الداخل. و بدلا من حفظ الأوامر سنتعرف إلى المكونات التي يعتمد عليها Git لتخزين البيانات و إدارة تاريخ المشروع.
في الدرس التالي سنرى كيف ينظر Git إلى المستودع قبل أن نبدأ باستكشاف مكوناته من الداخل.