كيف يخزن Git محتوى الملفات؟
في الدرس السابق دخلنا إلى مجلد .git و رأينا مجلد objects. لدينا الآن ملف اسمه hello.txt. ما الذي سيحفظه Git منه داخل objects؟
يحتوي الملف على هذا النص:
Hello Gitلا ينسخ Git الملف باسمه إلى .git/objects. يأخذ محتواه و يخزنه في Object من نوع Blob.
ما الذي يخزنه الـ Blob؟
يحتوي الـ Blob على النص نفسه:
Hello Gitلا يدخل اسم الملف hello.txt و لا موقعه ضمن بيانات الـ Blob. سنرى لاحقا أين يحفظ Git هذه المعلومات.

لنجرب بأنفسنا
سنستخدم الأمر git hash-object -w لإنشاء Blob من محتوى الملف و كتابته داخل الـ Object Database.
ستجد في الـ Terminal ملف hello.txt يحتوي على Hello Git. خزن محتواه كـ Blob:
git hash-object -w hello.txtسيطبع Git المعرف 9f4d96d5b00d98959ea9960f069585ce42b1349a.
استخدم المعرف الذي ظهر لقراءة الـ Blob:
git cat-file -p 9f4d96d5b00d98959ea9960f069585ce42b1349aسيظهر Hello Git من دون اسم الملف أو مساره.
ماذا لو تغير المحتوى؟
أضف علامة تعجب إلى المحتوى ليصبح:
Hello Git!ما زلنا نعمل على الملف نفسه لكن المحتوى أصبح مختلفا.
عندما نخزن المحتوى المعدل لا يغير Git الـ Blob الموجود. يحفظ المحتوى الجديد في Blob آخر:
Blob A
└── Hello Git
Blob B
└── Hello Git!عدل محتوى الملف ثم خزن النسخة الجديدة:
echo "Hello Git!" > hello.txt
git hash-object -w hello.txtسيطبع Git المعرف الجديد 106287c47fd25ad9a0874670a0d5c6eacf1bfe4e.
اقرأ الـ Blob الجديد باستخدام المعرف الذي ظهر:
git cat-file -p 106287c47fd25ad9a0874670a0d5c6eacf1bfe4eسيظهر المحتوى الجديد Hello Git!.
اقرأ الـ Blob الأول مرة أخرى:
git cat-file -p 9f4d96d5b00d98959ea9960f069585ce42b1349aسيظل محتواه Hello Git. لم يغير Git الـ Blob الأول بل أنشأ Blob آخر للمحتوى الجديد.
ماذا تكشف التجربة؟
الـ Object المخزن غير قابل للتعديل. عندما نطلب من Git حفظ محتوى مختلف فإنه يكتب Object آخر. تسمى هذه الخاصية Immutability.
الصورة الحالية
يمكننا الآن تصور قاعدة بيانات Git بالشكل التالي:
Object Database
│
└── Blob
└── File Contentأصبح لدينا الآن محتوى محفوظ داخل Blob لكن هذا الـ Blob لا يحمل اسم الملف أو مساره. إذا احتوت قاعدة البيانات على آلاف الـ Blobs فكيف يصل Git إلى الـ Blob المطلوب؟ في الدرس التالي سنرى كيف يستخدم الـ Hash لتمييز كل Object.