من أكتر الأسئلة يلي بتلخبط المبرمجين الجداد بـ Git: ليش فيه طريقتين (merge وrebase) لدمج فرع بفرع؟ الاثنين بيوصلوك لنفس النتيجة النهائية (كودك مدموج)، لكن الفرق بشكل التاريخ (history) يلي بيضل بمشروعك.
شو بيعمل git merge؟
git merge بياخد التغييرات من فرع وبيدمجها بفرعك الحالي، وبيضيف commit دمج جديد (merge commit) بيربط الفرعين مع بعض:
git checkout main
git merge feature-login
النتيجة: تاريخ فيه كل الـ commits الأصلية بترتيبها الحقيقي، بالإضافة لـ commit دمج واحد بالنهاية. هيدا التاريخ الحقيقي والدقيق لما صار فعليًا — مين عمل شو ومتى.
شو بيعمل git rebase؟
git rebase بياخد commits فرعك ويعيد تطبيقها فوق آخر نسخة من الفرع التاني، كإنه بيعيد كتابة القصة من جديد بترتيب خطي:
git checkout feature-login
git rebase main
النتيجة: تاريخ خطي بالكامل بلا أي commit دمج — كإن كل شغلك صار بعد آخر تحديث لـ main مباشرة، حتى لو فعليًا اشتغلت عليه بالتوازي.
الفرق بجدول
| المعيار | merge | rebase |
|---|---|---|
| شكل التاريخ | متشعّب (فيه commit دمج) | خطي نظيف |
| يغيّر commit hashes قديمة؟ | لا | نعم (بيعيد كتابتها) |
| آمن على فرع مشترك مرفوع؟ | نعم دائمًا | لا — خطير |
| الأنسب لـ | فروع طويلة، فرق كبيرة | فروع شخصية قبل الرفع |
القاعدة الذهبية
لا تعمل rebase أبدًا لفرع رفعته (push) already وناس تانيين ساحبينه.
السبب: rebase بيغيّر الـ commit hashes بالكامل. لو حدا تاني عنده نسخة قديمة من نفس الفرع وسحب تحديثاتك بعد الـ rebase، Git رح يشوف كل شي كـ commits جديدة كليًا، وبتصير تعارضات (conflicts) فوضوية صعبة الحل.
القاعدة البسيطة:
- فرعك المحلي، لسا ما رفعته؟ → rebase آمن، نظّف تاريخك قبل ما ترفع.
- فرع مرفوع ومشترك مع فريق؟ → merge دائمًا، ما تلمس تاريخه.
مثال عملي: قبل ما ترفع Pull Request
سيناريو شائع جدًا: اشتغلت على فرعك يومين، وبنفس الوقت زملاءك ضافوا commits جديدة على main. قبل ما تفتح Pull Request، تقدر تعمل:
git checkout feature-login
git rebase main
هيك فرعك بيصير مبني فوق آخر نسخة من main مباشرة، بلا تعارضات لاحقة عند الدمج، وبتاريخ نظيف يسهل مراجعته بالـ Pull Request.
الخلاصة
مافي "الأفضل" بشكل مطلق — merge أأمن وبيحافظ على الحقيقة الكاملة، وrebase بيعطيك تاريخ أنظف بس بشرط واحد صارم: بس على فروع لسا ما مشاركتها مع حدا. تعلّم الاثنين، واستخدم الصح حسب الموقف.
ابدأ مسار Git الكامل بالعربي — من الأساسيات لحد rebase وworkflows متقدمة.