كيف يمثل Git حالة المشروع؟
يستطيع الـ Tree وصف أسماء الملفات و المجلدات و ربطها بمحتواها. لكن المشروع يتغير مع الوقت. كيف يسجل Git حالة معينة من هذه البنية مع معلومات توضح من سجلها و لماذا؟
ينشئ Git Object يشير إلى الـ Tree الذي يمثل مجلد المشروع و يضيف إليه معلومات عن تلك اللحظة. هذا الـ Object هو Commit.
كيف يصل الـ Commit إلى حالة المشروع؟
لا يحتوي الـ Commit على الملفات مباشرة. بل يحمل معرف الـ Tree الذي يمثل مجلد المشروع. يصل Git من هذا الـ Tree إلى المجلدات و الملفات و محتواها.
يمكن تصور العلاقة بالشكل التالي:
Commit
│
▼
Tree
│
├── hello.txt
│ │
│ ▼
│ Blob
│
└── app.js
│
▼
Blobيصف الـ Tree حالة ملفات المشروع في تلك اللحظة. أما الـ Commit فيجعل هذه الحالة نقطة يمكن لـ Git الرجوع إليها داخل التاريخ.

ماذا يحتوي الـ Commit؟
إلى جانب معرف الـ Tree يحتوي الـ Commit على معلومات نحتاج إليها لفهم هذه النقطة من التاريخ:
- بيانات المؤلف و وقت التأليف.
- بيانات من أنشأ الـ Commit و وقت إنشائه.
- رسالة الـ Commit.
قد يكون المؤلف و من أنشأ الـ Commit الشخص نفسه لكن Git يحتفظ بالدورين كل على حدة. أما الرسالة فتساعد من يقرأ التاريخ على فهم سبب تسجيل هذه الحالة.
ما الذي يضيفه الـ Commit؟
يصف الـ Tree حالة الملفات وحدها. أما الـ Commit فيربط هذه الحالة بمعلوماتها. هذه أهم الحقول التي نحتاج إليها الآن:
Commit
├── Tree ID → Project Snapshot
├── Author
├── Committer
├── Timestamps
└── Message
لنجرب بأنفسنا
أنشئ Commit جديدا للمشروع:
git add .
git commit -m "snapshot"اعرض سجل الـ Commits:
git logانسخ المعرف الذي يظهر بعد كلمة commit و استخدمه مكان <commit-hash> في الأمر التالي:
git cat-file -p <commit-hash>ابحث في المخرج عن سطري tree و author. ستجد رسالة snapshot بعد السطر الفارغ.
الصورة الحالية
أصبح لدينا الآن ثلاثة أنواع من الـ Objects:
Blob
└── File Content
Tree
└── File Structure
Commit
├── Tree ID
├── Author
├── Committer
├── Timestamps
└── Messageيحمل الـ Blob المحتوى و يصف الـ Tree حالة الملفات. أما الـ Commit فيشير إلى هذه الحالة و يسجل معلوماتها. إذا أنشأنا أكثر من Commit فكيف يعرف Git ترتيبها؟ في الدرس التالي سنرى الرابط الذي يصل كل Commit بما سبقه.