MASTRILOالدورة/كيف ترتبط الـ Commits ببعضها؟
MASTRILO

كيف ترتبط الـ Commits ببعضها؟

في الدرس السابق رأينا أن كل Commit يشير إلى حالة معينة من ملفات المشروع. لكن هذه الحالات ليست منفصلة عن بعضها. يمكن أن يحمل الـ Commit أيضا معرف Commit سابق. و يسمى هذا الحقل Parent Commit.

بداية التاريخ

لا يوجد شيء قبل أول Commit في المستودع لذلك لا يحتوي على Parent:

text
Commit A

يسمى هذا الـ Commit أحيانا Initial Commit.

إضافة Commit جديد

بعد تعديل الملفات و إنشاء Commit B، يسجل Git معرف Commit A في حقل الـ Parent:

text
Commit B
    │
    ▼
Commit A

أصبح Commit A الآن Parent للـ Commit B. و من Commit B يستطيع Git الرجوع خطوة واحدة إلى الوراء.

بناء سلسلة من الـ Commits

في التاريخ الخطي، يشير كل Commit جديد إلى الـ Commit الذي كان قبله:

text
Commit D
    │
    ▼
Commit C
    │
    ▼
Commit B
    │
    ▼
Commit A

يبدأ Git من Commit معين و يتبع حقول الـ Parent للوصول إلى ما سبقه. هذه العلاقات هي التي تعطي الـ Commits ترتيبها داخل التاريخ.

هذا الشكل الخطي هو أبسط الحالات. لا يحتوي أول Commit على أي Parent. و يحتوي الـ Commit العادي غالبا على Parent واحد، بينما يحتوي Merge Commit على أكثر من Parent. سنعود إلى الحالة الأخيرة عندما ندرس الدمج.

ماذا يحتوي الـ Commit فعليا؟

إلى جانب معرف الـ Tree و بيانات المؤلف و الرسالة، يمكن أن يحتوي الـ Commit على معرف Parent:

text
Commit
├── Tree
├── Author
├── Committer
├── Timestamps
├── Message
└── Parent

عندما يريد Git الوصول إلى ما قبل Commit معين فإنه يقرأ معرف الـ Parent ثم يفتح الـ Commit المشار إليه.

Commit 503347c يحتوي على Parent بالمعرف 886c1bd يشير إلى Commit السابق
تطابق قيمة Parent معرف الـ Commit السابق 886c1bd

كيف يقرأ Git التاريخ؟

لنفترض أن Git بدأ من Commit D. يقرأ معرف الـ Parent فيصل إلى Commit C:

text
Commit D
    ↓
Commit C

ثم يكرر العملية:

text
Commit D
    ↓
Commit C
    ↓
Commit B

و يستمر حتى يصل إلى Commit لا يحتوي على Parent. لهذا يستطيع Git عرض التاريخ من أحدث Commit إلى أقدمه.

سلسلة Parent تربط Commit D بـ Commit C ثم B ثم A من الأحدث إلى الأقدم
يقرأ Git التاريخ بالرجوع عبر Parent حتى يصل إلى Commit A الذي لا يملك Parent

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

الـ Terminal بجانبك يحتوي على مستودع فيه أكثر من Commit.

اعرض سجل الـ Commits:

bash
git log

انسخ معرف أول Commit في المخرج ثم استخدمه مكان <commit-hash>:

bash
git cat-file -p <commit-hash>

ابحث عن سطر parent ثم انسخ المعرف الموجود فيه و استخدمه مكان <parent-hash>:

bash
git cat-file -p <parent-hash>

ستظهر لك بيانات الـ Commit السابق و رسالة first.

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

اكتملت الآن صورة الـ Objects الأساسية التي درسناها:

text
Blob
└── File Content
 
Tree
└── File Structure
 
Commit
├── Project Snapshot
└── Parent Reference

يحمل الـ Blob محتوى ملف. و يربط الـ Tree الأسماء بالـ Objects. و يشير الـ Commit إلى حالة المشروع. أما حقل الـ Parent فيقود إلى Commit سابق.

في الدرس التالي سنجمع هذه العناصر و نستكشف الـ Objects التي أنشأها Git داخل مستودع حقيقي.

الفحص الآلي يؤكد بيانات المستودع فقط. تحقق بنفسك من معرف parent و قارنه بمعرف الـ Commit الأول؛ ظهور علامة النجاح لا يثبت أنك تتبعت الرابط.

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

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

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

Git Objects

5.كيف ترتبط الـ Commits ببعضها؟

Git on Your Machine841 كيف ترتبط الـ Commits ببعضها؟مكافأة إكمال الدرس إضافة إلى نقاط أنشطته. 10 XP. تُمنح المكافأة مرة واحدة فقط.