الاختلافات بين git merge و git rebase

2 دقيقة

image

Git merge

  • العملية: git merge develop
  • الهدف: دمج تعديلات فرع (develop) في فرع آخر (feature/login).
  • الآلية: ينشئ Git «إيداع دمج» جديداً له والدان، واحد لآخر إيداع في كل فرع. يحفظ ذلك السجل كما حدث فعلاً.
  • النتيجة: يُظهر سجل فرع feature/login بنية ذات تفرع، حيث يجمع إيداع الدمج سجلي الفرعين.

Git rebase

  • العملية: git rebase develop
  • الهدف: إعادة تطبيق الإيداعات على قمة فرع أساس آخر.
  • الآلية: تأخذ إعادة الأساس التعديلات المُجراة في فرع feature/login وتعيد تطبيقها على قمة فرع develop.
  • النتيجة: يصبح السجل خطّياً، كأن التعديلات أُجريت مباشرة بعد آخر تعديلات في develop.

الفروقات الأساسية

  • حفظ السجل: الدمج لا يعدّل السجل الموجود، بينما تعيد إعادة الأساس كتابة سجل الإيداعات لجعله خطّياً.
  • حل التعارضات: مع الدمج، تُحلّ التعارضات في نهاية عملية الدمج، بينما قد تتطلّب إعادة الأساس حل تعارضات طوال العملية كلما أُعيد تطبيق كل إيداع.

باختصار، يُستخدم merge للاحتفاظ بسجل دقيق للتغييرات، بينما يُفضَّل rebase لتبسيط السجل قبل دمج فرع ميزات.

2 - ما زال غير واضح؟

Git merge

  • ماذا يفعل: يدمج تغييرات فرعين في واحد. يجمع مساري التطوير.
  • كيف يعمل: ينشئ إيداعاً جديداً له والدان. يمثّل كل والد آخر إيداع في كل فرع قبل الدمج.
  • سجل الإيداعات: يُظهر السجل بوضوح متى تفرّعت الفروع ومتى دُمجت. يشبه رسماً بيانياً بنقطة تلتقي فيها خطّان ليصيرا واحداً.

Git rebase

  • ماذا يفعل: يغيّر أساس فرع ميزاتك ليبدو كأنه أُنشئ من آخر إيداع في فرع develop.
  • كيف يعمل: يأخذ إيداعات فرع الميزات و«يعيد تشغيلها» واحداً تلو الآخر على قمة فرع develop.
  • سجل الإيداعات: يصبح السجل خطّياً. لا ترى تفرعاً كما مع merge. يعطي انطباعاً بأن كل التغييرات أُجريت بالترتيب، بلا تطوير متوازٍ.

لماذا تختار أحدهما أو الآخر؟

  • الدمج: يُستخدم للحفاظ على السجل الكامل والصريح لمشروعك. مفيد عندما تريد رؤية النقاط الدقيقة التي دُمجت فيها التغييرات.
  • إعادة الأساس: تُستخدم لإنشاء سجل أنظف وأبسط. عملية إن أردت أن يبدو سجلك كتسلسل تطوير مباشر بلا فروع ثانوية.

باختصار، إن أردت أن يُظهر سجل مشروعك كيف طُوّرت الميزات بالتوازي ثم دُمجت، استخدم merge. إن فضّلت سجلاً بسيطاً ومباشراً (كأن كل شيء طُوّر بترتيب خطّي)، استخدم rebase.