Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

Git: دمج الـ Commits (Squash)

آخر تحديث

الدمج (squash) يجمع عدة commits في commit واحد، بحيث تتحول سلسلة فوضوية من الـ commits مثل "wip" و"إصلاح خطأ إملائي" و"الآن أُصلح فعلاً" إلى commit واحد نظيف. الأداة المعتادة هي إعادة الأساس التفاعلية - git rebase -i - حيث تُعلّم الـ commits التي تريد دمجها. وبما أن الدمج يعيد كتابة السجل، فقم به قبل الـ push، أو على فرع تعمل عليه وحدك.

جرّب هذه الأوامر في ساحة الطرفية (terminal playground) - صدفة حقيقية في متصفحك، دون الحاجة إلى تثبيت أي شيء.

الـ squash يطوي سلسلة من الـ commits الصغيرة في commit واحد نظيف عبر rebase تفاعلي.

الصياغة

CommandWhat 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 إلى أحد هذه الأوامر.

KeywordWhat it does
pickيبقي الـ commit كما هو
squash (s)يدمجه في الـ commit السابق ويجمع الرسائل
fixup (f)يدمجه لكنه يتجاهل رسالة هذا الـ commit
reword (r)يبقي الـ commit لكنه يعدّل رسالته

مثال عملي

ادمج آخر ثلاثة commits في commit واحد قبل الـ push.

StepActionResult
1git 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 إعادة الأساس وتنظيف السجل خطوة بخطوة.
Coddy programming languages illustration

تعلّم Git مع Coddy

ابدأ الآن