استكشاف الـ Objects من الداخل
تعرفنا إلى الـ Blob و الـ Tree و الـ Commit كل على حدة. حان الوقت الآن لإنشاء هذه الـ Objects ثم الانتقال بينها داخل مستودع واحد، من الـ Commit حتى نصل إلى محتوى الملف.
قراءة محتوى Object
يعرض الأمر التالي محتوى Object بطريقة تناسب نوعه:
git cat-file -p <hash>ضع معرف الـ Object مكان <hash>. إذا كان Blob فسترى المحتوى. و إذا كان Tree أو Commit فسترى الحقول التي يحتوي عليها. لا تحتاج إلى حفظ الأمر الآن فسنستخدمه عدة مرات خلال الدرس.
يحتوي الـ Terminal بجانبك على ملف hello.txt داخل مستودع جاهز. أنشئ أول Commit:
git add hello.txt
git commit -m "Add hello"بعد تنفيذ الأمرين ستظهر الـ Objects الجديدة في الرسم البياني.
استكشاف Blob Object
يحمل الـ Blob الذي أنشأناه المحتوى التالي:
Hello Gitعند قراءة هذا الـ Blob يعرض Git Hello Git فقط. لن يظهر اسم hello.txt أو مساره لأنهما ليسا جزءا من الـ Blob.
استكشاف Tree Object
تعرض قراءة الـ Tree مدخلا لكل ملف أو مجلد. قد يبدو المخرج هكذا:
100644 blob a1b2c3d hello.txt
100644 blob d4e5f6a app.jsيحتوي كل سطر على mode و نوع الـ Object و معرفه ثم الاسم. في هذا المثال يقود كل معرف إلى Blob:
hello.txt → Blob A
app.js → Blob Bهكذا يربط الـ Tree أسماء الملفات بالمحتوى المخزن في الـ Blobs.
ابدأ بعرض سجل الـ Commits:
git logانسخ المعرف الذي يظهر بعد كلمة commit و استخدمه مكان <commit-hash>:
git cat-file -p <commit-hash>انسخ المعرف الموجود في سطر tree و استخدمه مكان <tree-hash>:
git cat-file -p <tree-hash>أخيرا انسخ معرف الـ Blob المقابل للملف hello.txt و استخدمه مكان <blob-hash>:
git cat-file -p <blob-hash>ستصل في النهاية إلى المحتوى Hello Git.
استكشاف Commit Object
عند قراءة Commit Object سنجد معلومات شبيهة بالتالي:
tree 88e1d5ea8485d69519c52643b7d4565b55f69f54
parent 2589e42028134c2d2321393d7abe2ec43227ad26
author Developer <dev@example.com> 1781895642 +0100
committer Developer <dev@example.com> 1781895642 +0100
Add discount supportتختلف المعرفات و البيانات من Commit إلى آخر لكن الحقول الأساسية واضحة:
- يشير سطر
treeإلى Tree المشروع. - يظهر سطر
parentعندما يوجد Commit سابق. - تسجل أسطر
authorوcommitterبيانات المؤلف و منشئ الـ Commit. - تأتي الرسالة بعد سطر فارغ.
كل ما تعلمناه في الدروس السابقة يظهر هنا بشكل مباشر.
ربط أجزاء الصورة
يمكن الآن تتبع المسار كاملا:
Commit
│
├── Tree
│ │
│ ├── hello.txt → Blob
│ └── app.js → Blob
│
└── Parentمن الـ Commit نصل إلى Tree المشروع. و من مدخلات الـ Tree نصل إلى محتوى الملفات. أما الـ Parent فيقود إلى Commit سابق لا إلى ملف داخل الحالة الحالية.
الصورة الحالية
أنشأنا Commit و قرأنا محتواه ثم انتقلنا منه إلى الـ Tree فالـ Blob. في الدرس التالي سنرى كيف تشكل الـ Commits و علاقات الـ Parent بينها ما يسمى Commit Graph.