MASTRILOالدورة/كيف يخزن Git محتوى الملفات؟
MASTRILO

كيف يخزن Git محتوى الملفات؟

في الدرس السابق دخلنا إلى مجلد .git و رأينا مجلد objects. لدينا الآن ملف اسمه hello.txt. ما الذي سيحفظه Git منه داخل objects؟

يحتوي الملف على هذا النص:

text
Hello Git

لا ينسخ Git الملف باسمه إلى .git/objects. يأخذ محتواه و يخزنه في Object من نوع Blob.

ما الذي يخزنه الـ Blob؟

يحتوي الـ Blob على النص نفسه:

text
Hello Git

لا يدخل اسم الملف hello.txt و لا موقعه ضمن بيانات الـ Blob. سنرى لاحقا أين يحفظ Git هذه المعلومات.

محتوى ملف hello.txt ينتقل إلى Blob داخل قاعدة بيانات Git من دون اسم الملف
يخزن الـ Blob محتوى الملف من دون اسمه

لنجرب بأنفسنا

سنستخدم الأمر git hash-object -w لإنشاء Blob من محتوى الملف و كتابته داخل الـ Object Database.

ستجد في الـ Terminal ملف hello.txt يحتوي على Hello Git. خزن محتواه كـ Blob:

bash
git hash-object -w hello.txt

سيطبع Git المعرف 9f4d96d5b00d98959ea9960f069585ce42b1349a.

استخدم المعرف الذي ظهر لقراءة الـ Blob:

bash
git cat-file -p 9f4d96d5b00d98959ea9960f069585ce42b1349a

سيظهر Hello Git من دون اسم الملف أو مساره.

ماذا لو تغير المحتوى؟

أضف علامة تعجب إلى المحتوى ليصبح:

text
Hello Git!

ما زلنا نعمل على الملف نفسه لكن المحتوى أصبح مختلفا.

عندما نخزن المحتوى المعدل لا يغير Git الـ Blob الموجود. يحفظ المحتوى الجديد في Blob آخر:

text
Blob A
└── Hello Git
 
Blob B
└── Hello Git!

عدل محتوى الملف ثم خزن النسخة الجديدة:

bash
echo "Hello Git!" > hello.txt
git hash-object -w hello.txt

سيطبع Git المعرف الجديد 106287c47fd25ad9a0874670a0d5c6eacf1bfe4e.

اقرأ الـ Blob الجديد باستخدام المعرف الذي ظهر:

bash
git cat-file -p 106287c47fd25ad9a0874670a0d5c6eacf1bfe4e

سيظهر المحتوى الجديد Hello Git!.

اقرأ الـ Blob الأول مرة أخرى:

bash
git cat-file -p 9f4d96d5b00d98959ea9960f069585ce42b1349a

سيظل محتواه Hello Git. لم يغير Git الـ Blob الأول بل أنشأ Blob آخر للمحتوى الجديد.

ماذا تكشف التجربة؟

الـ Object المخزن غير قابل للتعديل. عندما نطلب من Git حفظ محتوى مختلف فإنه يكتب Object آخر. تسمى هذه الخاصية Immutability.

الصورة الحالية

يمكننا الآن تصور قاعدة بيانات Git بالشكل التالي:

text
Object Database
│
└── Blob
    └── File Content

أصبح لدينا الآن محتوى محفوظ داخل Blob لكن هذا الـ Blob لا يحمل اسم الملف أو مساره. إذا احتوت قاعدة البيانات على آلاف الـ Blobs فكيف يصل Git إلى الـ Blob المطلوب؟ في الدرس التالي سنرى كيف يستخدم الـ Hash لتمييز كل Object.

اختبر معلوماتك

سجّل دخولك للإجابة على الأسئلة وحفظ تقدّمك.

سجّل الدخول
اللوحات
نوع الخط
حجم الخط
أكملت 0 من 41 درس

Git Objects

1.كيف يخزن Git محتوى الملفات؟

Git on Your Machine441 كيف يخزن Git محتوى الملفات؟مكافأة إكمال الدرس إضافة إلى نقاط أنشطته. 10 XP. تُمنح المكافأة مرة واحدة فقط.