Git squash = دمج عدة إيداعات في إيداع واحد.
تشبيه: لديك 5 مسودات لرسالة → تجمعها في رسالة نهائية نظيفة واحدة.
مثال:
قبل squash:
- "fix typo"
- "add feature"
- "fix bug"
- "another fix"
بعد squash:
- "Add complete login feature"المشكلة: سجل متسخ
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المزايا:
الأمر السحري:
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 إيداعات → إيداع نظيف واحد!
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أوضاع نموذجية:
فرع ميزة قبل الدمج:
git checkout feature-login
# ... 15 إيداع تطوير مع أخطاء إملائية/إصلاحات
git rebase -i HEAD~15 # squash إلى 2-3 إيداعات منطقية
git checkout main && git merge feature-loginالتنظيف قبل الدفع:
# تطوير محلي مسودة
git rebase -i HEAD~8 # تنظيف قبل المشاركة
git push origin feature-branchتصحيح السجل العام (انتبه!):
# فقط إن لم يسترجع أحد إيداعاتك بعد
git rebase -i HEAD~5
git push --force-with-lease # أأمن من --forcesquash = مكنستك لتنظيف السجل!