تخطَّ إلى المحتوى

🔀 شرح Git

آلية Git الداخلية (Objects, Refs, Packfiles)

الدرس 27 من 28· ⏱ 2 دقائق قراءة

Git — نظام ملفات بمحتوى قابل للعنونة

Git ليس مجرد أداة تحكم بالنسخ — بل نظام تخزين محتوى (Content-Addressable Storage). كل شيء يُخزَّن بمفتاح SHA-1 (أو SHA-256 في Git الحديث) هو المحتوى نفسه.

أنواع الكائنات الأربعة

1) Blob — محتوى الملف

كل ملف يُخزَّن كـ Blob (Binary Large Object):

echo "مرحبًا" | git hash-object --stdin -w
# يُنشئ blob بمفتاح SHA-1 يعتمد على المحتوى فقط

2) Tree — بنية الدليل

التري (Tree) يربط الأسماء والمفاتيح معًا — يشبه الـ inode:

tree (README.md → blob a1b2c3)
     (src/       → tree d4e5f6)

3) Commit — لقطة المشروع

الـ Commit هو كائن يربط التري بالوالد (parent) وبالبيانات الوصفية:

git cat-file -p HEAD
# tree 8f7d6e5...
# parent 9a8b7c6...
# author Baraa <baraa@email.com>
# committer Baraa <baraa@email.com>
# 
# الرسالة

4) Tag — علامة ثابتة

git tag -a v1.0 -m "الإصدار الأول"
# يُنشئ tag object يشير إلى commit معين

حيث يُخزَّن كل شيء

.git/objects/
├── a1/          # أول حرفين من SHA-1
│   └── b2c3d4e5f6...  # باقي الـ SHA-1
├── b2/
│   └── c3d4e5f6a7...
└── info/        # حزم المعلومات

المراجع (Refs)

المراجع مؤشرات التسمية — بدل تذكّر SHA-1، تستخدم أسماء:

.git/refs/
├── heads/       # الفروع المحلية
│   ├── main
│   └── feature-auth
├── tags/        # العلامات
│   └── v1.0
└── remotes/     # الفروع البعيدة
    └── origin/
        └── main

HEAD هو مرجع خاص — يشير إلى الفرع الحالي:

cat .git/HEAD
# ref: refs/heads/main

Packfiles — الضغط الذكي

عند تزايد عدد الملفات، يضغط Git الكائنات المتشابهة:

# ضغط يدوي
git gc

# يبحث عن كائنات متطابقة ويخزّن الفروق فقط (delta compression)

فكرة ذكية: بدل تخزين كل نسخة من ملف كاملًا، يخزّن Git الفروق (deltas) — هذا يقلص حجم المستودع بشكل كبير.

إعادة بناء commit من الصفر

مراحل إنشاء commit:

1. git hash-object -w README.md → blob: a1b2c3
2. git write-tree             → tree: d4e5f6
3. echo "msg" | git commit-tree d4e5f6 -p parent

ما حدث فعليًا:
- تم إنشاء blob للمحتوى
- تم إنشاء tree يربط الملفات
- تم إنشاء commit يشير إلى التري والوالد

العلاقة بين كل شيء

  commit (SHA-1)
    │
    ├── tree (SHA-1)
    │     ├── blob "README.md"
    │     └── tree "src/"
    │           └── blob "app.js"
    │
    └── parent commit (SHA-1)

أي تغيير في أي ملف يُنتج SHA-1 جديدًا — هذا يضمن سلامة التاريخ بالكامل.

⚠️ لا تحذف مجلد .git أبدًا — هو قلب المستودع وكل تاريخه.

🎯 التالي: استراتيجيات التفرّع (Git Flow, Trunk-Based).

شرح آلية Git الداخلية (Objects, Refs, Packfiles) — Git بالعربي
آلية Git الداخلية (Objects, Refs, Packfiles)Git بالعربي · The Code Fix

📚 لمزيد من التعمّق في Git، راجِع التوثيق الرسمي لـ Git.

هل كان هذا الدرس مفيدًا؟