Git Squash

1 دقيقة

جدول المحتويات

  1. ما هو squash؟
  2. لماذا squash؟
  3. squash تفاعلي
  4. ممارسة فورية
  5. حالات الاستخدام

1. ما هو squash؟

Git squash = دمج عدة إيداعات في إيداع واحد.

تشبيه: لديك 5 مسودات لرسالة → تجمعها في رسالة نهائية نظيفة واحدة.

مثال:

قبل squash:
- "fix typo"
- "add feature"
- "fix bug"
- "another fix"

بعد squash:
- "Add complete login feature"

العودة إلى جدول المحتويات

2. لماذا squash؟

المشكلة: سجل متسخ

git log --oneline
abc123 oops fix typo
def456 forgot semicolon
ghi789 actually implement feature
jkl012 fix indent
mno345 real commit message

الحل: squash!

git log --oneline
xyz999 Implement user authentication system

المزايا:

  • سجل نظيف وقابل للقراءة
  • إيداعات منطقية حسب الوظيفة
  • أسهل لإلغاء ميزة كاملة بـ revert

العودة إلى جدول المحتويات

3. squash تفاعلي

الأمر السحري:

bash
git rebase -i HEAD~4    # squash لآخر 4 إيداعات

الواجهة التي تُفتح:

pick abc123 oops fix typo
pick def456 forgot semicolon
pick ghi789 actually implement feature
pick jkl012 fix indent

غيّرها إلى:

pick ghi789 actually implement feature
squash abc123 oops fix typo
squash def456 forgot semicolon
squash jkl012 fix indent

النتيجة: 4 إيداعات → إيداع نظيف واحد!

العودة إلى جدول المحتويات

4. ممارسة فورية

bash
mkdir demo-squash && cd demo-squash
git init

# إنشاء عدة إيداعات «متسخة»
echo "print('v1')" > app.py && git add . && git commit -m "start feature"
echo "print('v1.1')" > app.py && git add . && git commit -m "oops fix"
echo "print('v1.2')" > app.py && git add . && git commit -m "another fix"
echo "print('v2 done')" > app.py && git add . && git commit -m "feature complete"

# سجل متسخ
git log --oneline

# squash تفاعلي
git rebase -i HEAD~4

# في المحرّر: أبقِ الأول "pick"، وغيّر الباقي إلى "squash"
# احفظ وأغلق

# اكتب رسالة الإيداع النهائي
# النتيجة: إيداع نظيف واحد!
git log --oneline

العودة إلى جدول المحتويات

5. حالات الاستخدام

أوضاع نموذجية:

  1. فرع ميزة قبل الدمج:

    bash
    git checkout feature-login
    # ... 15 إيداع تطوير مع أخطاء إملائية/إصلاحات
    git rebase -i HEAD~15    # squash إلى 2-3 إيداعات منطقية
    git checkout main && git merge feature-login
  2. التنظيف قبل الدفع:

    bash
    # تطوير محلي مسودة
    git rebase -i HEAD~8     # تنظيف قبل المشاركة
    git push origin feature-branch
  3. تصحيح السجل العام (انتبه!):

    bash
    # فقط إن لم يسترجع أحد إيداعاتك بعد
    git rebase -i HEAD~5
    git push --force-with-lease    # أأمن من --force

squash = مكنستك لتنظيف السجل!

العودة إلى جدول المحتويات