CI/CD والبنية التحتية كرمز

داخليات Git والعمليات المتقدمة

4 دقيقة للقراءة

أسئلة Git تتجاوز الأوامر الأساسية في مقابلات DevOps/SRE. دعنا نتقن الداخليات والعمليات المتقدمة.

نموذج كائنات Git

فهم داخليات Git يُبهر المقابلين:

Git يخزن 4 أنواع من الكائنات:
1. blob   - محتويات الملف
2. tree   - بنية المجلد
3. commit - لقطة مع بيانات وصفية
4. tag    - مرجع مسمى للـ commit
# عرض نوع الكائن
git cat-file -t <sha>

# عرض محتوى الكائن
git cat-file -p <sha>

# قائمة جميع الكائنات
find .git/objects -type f

كيف تعمل الـ Commits

                    ┌──────────┐
                    │  commit  │
                    │ (sha: a1)│
                    └────┬─────┘
                         │ يُشير إلى
                    ┌────▼─────┐
                    │   tree   │
                    │ (sha: b2)│
                    └────┬─────┘
              ┌──────────┴──────────┐
         ┌────▼─────┐          ┌────▼─────┐
         │   blob   │          │   tree   │
         │  (ملف)   │          │  (مجلد)  │
         └──────────┘          └──────────┘

عمليات Git المتقدمة

Rebase مقابل Merge

الجانبMergeRebase
التاريخيحفظ جميع الـ commitsتاريخ خطي
التعارضاتمرة واحدة أثناء الدمجلكل commit
الأمانآمن للفروع المشتركةيُعيد كتابة التاريخ
متى تستخدمالفروع المشتركةالفروع المحلية/الميزات
# Rebase تفاعلي (إعادة الترتيب، الدمج، تعديل الـ commits)
git rebase -i HEAD~5

# Rebase على main
git checkout feature
git rebase main

# لا تعمل rebase للفروع المشتركة أبداً!
# "إذا شككت، لا تعمل rebase"

سؤال مقابلة: "متى يجب أن تستخدم rebase مقابل merge؟"

الجواب: استخدم rebase للفروع المحلية للميزات للحفاظ على تاريخ نظيف. استخدم merge للفروع المشتركة/العامة للحفاظ على التاريخ وتجنب إعادة كتابة commits يعتمد عليها الآخرون.

Cherry-Pick

# طبق commit(s) محددة على الفرع الحالي
git cherry-pick <commit-sha>

# Cherry-pick بدون commit
git cherry-pick --no-commit <sha>

# Cherry-pick نطاق
git cherry-pick A^..B

Git Bisect

ابحث عن الـ commit الذي أدخل الخلل:

# ابدأ bisect
git bisect start

# علّم الحالي (المعطل) كسيء
git bisect bad

# علّم commit معروف أنه جيد
git bisect good <sha>

# Git يُحضر commit الأوسط، اختبر وعلّم:
git bisect good   # أو
git bisect bad

# استمر حتى يجد Git أول commit سيء
# عند الانتهاء:
git bisect reset

Reflog - شبكة أمانك

# عرض reflog (تاريخ حركات HEAD)
git reflog

# استرجع commits "المحذوفة"
git checkout -b recovery <sha-from-reflog>

# تراجع عن rebase سيء
git reset --hard HEAD@{5}

استراتيجيات سير عمل Git

التطوير المبني على الجذع

main ─────●─────●─────●─────●─────●
           \           /
            ●─────●───
          (فرع ميزة قصير العمر)
  • commits مباشرة إلى main
  • أعلام الميزات للميزات غير المكتملة
  • يتطلب CI/CD واختبار جيد
  • يُستخدم من Google، Facebook

GitFlow

main    ─────●───────────────●─────────
              \             /
develop ───●───●───●───●───●───●───●───
            \       \     /
feature      ●───●   ●───●

release              ●───●───●
  • فروع develop وmain منفصلة
  • فروع feature، release، hotfix
  • أفضل للإصدارات المجدولة
  • أكثر تعقيداً، حمل أكبر

GitHub Flow

main ─────●─────●─────●─────●─────●
           \         / \       /
feature     ●───●───   ●───●
              (PR)       (PR)
  • بسيط: main + فروع الميزات
  • Pull requests للمراجعة
  • النشر من main
  • توازن جيد لمعظم الفرق

أسئلة المقابلة

س: "كيف ستسترجع commit بعد تشغيل git reset --hard؟"

# تحقق من reflog للـ commit المفقود
git reflog

# ابحث عن SHA للـ commit قبل الـ reset
# أنشئ فرعاً منه
git checkout -b recovery <sha>

# أو reset إليه
git reset --hard <sha>

س: "ما الفرق بين git reset وgit revert؟"

العمليةالتأثيرالتاريخحالة الاستخدام
resetيُحرك HEAD، قد يتجاهل commitsيُعيد الكتابةالتنظيف المحلي
revertيُنشئ commit جديد يلغي التغييراتيحفظالفروع المشتركة
# Reset: يُحرك HEAD للخلف (يُعيد كتابة التاريخ)
git reset --hard HEAD~3

# Revert: يُنشئ commit جديد (آمن للمشترك)
git revert <sha>

س: "دفعت بالخطأ أسراراً إلى مستودع عام. كيف تصلحه؟"

# 1. احذف من التاريخ باستخدام filter-branch أو BFG
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch secrets.env" HEAD

# أو استخدم BFG Repo Cleaner (أسرع)
bfg --delete-files secrets.env

# 2. Force push (نسق مع الفريق!)
git push --force-with-lease

# 3. قم بتدوير جميع بيانات الاعتماد المكشوفة فوراً!
# 4. GitHub قد يُخزن مؤقتاً - تواصل مع الدعم

التالي، سنغوص في تصميم خطوط CI/CD—كفاءة أساسية في DevOps/SRE. :::

مراجعة سريعة: كيف تجد هذا الدرس؟

اختبار

الوحدة 3: CI/CD والبنية التحتية كرمز

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.