الفرق عن rebase العادي
في الدرس السابق استخدمنا git rebase main لنقل فرعك فوق آخر تحديث. rebase التفاعلي (-i) يفعل شيئًا مختلفًا: يتيح لك تعديل commits فرعك نفسها — قبل نقلها أو حتى بدون نقلها لفرع آخر — عبر قائمة تحرّرها.
git rebase -i HEAD~3 # آخر 3 commits على فرعك الحالي
يفتح محرّرًا بقائمة كهذه:
pick a1b2c3d إضافة نموذج تسجيل الدخول
pick e4f5g6h إصلاح خطأ إملائي
pick i7j8k9l تعديل تسمية الحقل
أوامر القائمة
| الأمر | ماذا يفعل |
|---|---|
pick | يُبقي الـ commit كما هو (الافتراضي) |
reword | يُبقي الـ commit لكن يفتح محررًا لتعديل رسالته |
edit | يتوقّف عند هذا الـ commit لتعديل محتواه بالكامل |
squash | يدمج هذا الـ commit مع السابق، ويجمع الرسالتين |
fixup | مثل squash لكن يتجاهل رسالة هذا الـ commit |
drop | يحذف الـ commit نهائيًا |
exec | ينفّذ أمر شل (مثلًا اختبار) بين الـ commits |
⚠️ لا تحذف أو تُعدّل الـ hash في بداية كل سطر — فقط غيّر اسم الأمر.
مثال: دمج 3 commits في واحد
الوضع أعلاه فيه commit رئيسي وتصحيحان صغيران لا يستحقّان سطرًا خاصًا بهما في التاريخ. غيّر القائمة إلى:
pick a1b2c3d إضافة نموذج تسجيل الدخول
fixup e4f5g6h إصلاح خطأ إملائي
fixup i7j8k9l تعديل تسمية الحقل
احفظ وأغلق المحرّر — تحصل على commit واحد نظيف برسالة "إضافة نموذج تسجيل الدخول" فقط، وكأنك كتبته صحيحًا من أول مرّة.
💡 استخدم
squashبدلfixupإذا أردت الاحتفاظ برسائل كل الـ commits المدموجة ودمجها في رسالة واحدة تحرّرها بنفسك.
عند التعارض أو التراجع
git add .
git rebase --continue # بعد حلّ التعارض
git rebase --abort # يلغي كل العملية ويعيدك للوضع قبل البدء
متى تستخدمه؟
- قبل فتح Pull Request: نظّف تاريخ فرعك ليكون واضحًا للمراجع — commit واحد لكل ميزة منطقية بدل عشرة commits "wip".
- لتعديل رسالة commit قديمة لم تُدفع بعد.
القاعدة الذهبية من الدرس السابق تنطبق هنا بقوة أكبر: rebase التفاعلي يعيد كتابة hashes الـ commits بالكامل — لا تستخدمه أبدًا على فرع دفعته وأشخاص آخرون يعملون عليه.
🎯 التالي: البحث الثنائي عن الأخطاء (Git Bisect).