Git: دمج الـ Commits (Squash)
آخر تحديث
الدمج (squash) يجمع عدة commits في commit واحد، بحيث تتحول سلسلة فوضوية من الـ commits مثل "wip" و"إصلاح خطأ إملائي" و"الآن أُصلح فعلاً" إلى commit واحد نظيف. الأداة المعتادة هي إعادة الأساس التفاعلية - git rebase -i - حيث تُعلّم الـ commits التي تريد دمجها. وبما أن الدمج يعيد كتابة السجل، فقم به قبل الـ push، أو على فرع تعمل عليه وحدك.
جرّب هذه الأوامر في ساحة الطرفية (terminal playground) - صدفة حقيقية في متصفحك، دون الحاجة إلى تثبيت أي شيء.
الصياغة
| Command | What it does |
|---|---|
git rebase -i HEAD~3 | إعادة أساس تفاعلية لآخر 3 commits |
git rebase -i main | إعادة أساس لكل commit منذ main |
git merge --squash feature | يدمج commits الفرع في commit واحد عند الدمج |
git reset --soft HEAD~3 && git commit | يدمج آخر 3 commits دون إعادة أساس |
أوامر إعادة الأساس التفاعلية
في المحرر الذي يُفتح، غيّر pick إلى أحد هذه الأوامر.
| Keyword | What it does |
|---|---|
pick | يبقي الـ commit كما هو |
squash (s) | يدمجه في الـ commit السابق ويجمع الرسائل |
fixup (f) | يدمجه لكنه يتجاهل رسالة هذا الـ commit |
reword (r) | يبقي الـ commit لكنه يعدّل رسالته |
مثال عملي
ادمج آخر ثلاثة commits في commit واحد قبل الـ push.
| Step | Action | Result |
|---|---|---|
| 1 | git rebase -i HEAD~3 | يفتح آخر 3 commits في المحرر |
| 2 | اضبط الـ commit الثاني والثالث على squash | يعلّمهما ليُدمجا في الأول |
| 3 | احفظ وعدّل الرسالة المدمجة | تصبح ثلاثة commits commit واحد نظيف |
أسئلة شائعة حول دمج الـ commits في Git
كيف أدمج آخر N من الـ commits في Git؟
شغّل
git rebase -i HEAD~N (مثلاً HEAD~3 لآخر ثلاثة). في المحرر، اترك الـ commit الأول على pick وغيّر البقية إلى squash (أو fixup لتجاهل رسائلها). احفظ، وعدّل رسالة الـ commit المدمجة، فتنطوي الـ commits في commit واحد.ما الفرق بين squash و fixup؟
كلاهما يدمج commit في الـ commit السابق. يحتفظ
squash برسالة الـ commit ويتيح لك دمجها مع البقية في محرر. أما fixup فيتجاهل رسالة الـ commit تماماً ويبقي على رسالة الـ commit السابق فقط - وهو مفيد للـ commits من نوع "عذراً، إصلاح صغير" التي لا تريدها في الرسالة النهائية.كيف أدمج فرعاً كاملاً عند الدمج؟
استخدم
git merge --squash feature، ثم git commit. هذا يطبّق كل تغييرات الفرع كتغييرات مجهّزة (staged) ويتيح لك تسجيلها بوصفها commit واحداً على الفرع الهدف، دون جلب الـ commits الفردية للفرع. زر "Squash and merge" في GitHub يقوم بالأمر نفسه.هل يمكنني الدمج دون إعادة أساس تفاعلية؟
نعم.
git reset --soft HEAD~N يعيد الفرع N من الـ commits إلى الوراء مع إبقاء كل تغييراتها مجهّزة (staged)، ثم يسجّلها git commit واحد بوصفها commit واحداً. إنها طريقة سريعة لدمج أحدث الـ commits دون فتح محرر إعادة الأساس.هل يمكنني التدرّب على هذا عبر الإنترنت؟
نعم. افتح ساحة الطرفية (terminal playground) لتشغيل إعادة الأساس التفاعلية في صدفة حقيقية داخل متصفحك - دون الحاجة إلى تثبيت أي شيء. كما يغطي كورس Git التفاعلي المجاني من Coddy إعادة الأساس وتنظيف السجل خطوة بخطوة.