الدمج مقابل إعادة الأساس - دراسة حالة

1 دقيقة

جدول المحتويات

  1. المشكلة
  2. الحل 1: الدمج
  3. الحل 2: إعادة الأساس
  4. مقارنة عملية
  5. أي مقاربة تختار؟

1. المشكلة

وضع نموذجي:

  • تطوّر على feature-branch
  • في الأثناء، يتقدّم main (زملاؤك يدفعون)
  • تريد دمج عملك في main

استراتيجيتان ممكنتان:

  1. الدمج (MERGE): دمج الفروع
  2. إعادة الأساس (REBASE): إعادة كتابة السجل

العودة إلى جدول المحتويات

2. الحل 1: الدمج

إعداد السيناريو:

bash
mkdir demo-merge && cd demo-merge && git init

# قاعدة مشتركة
echo "print('app v1')" > app.py
git add . && git commit -m "Version initiale"

# فرع الميزة
git checkout -b feature-login
echo "print('login system')" > login.py
git add . && git commit -m "Add login"
echo "print('login v2')" > login.py
git add . && git commit -m "Improve login"

# main يتقدّم في الأثناء
git checkout main
echo "print('app v1.1')" > app.py
git add . && git commit -m "Update main app"

الدمج:

bash
git merge feature-login

نتيجة الدمج:

*   Merge branch 'feature-login'
|\
| * Improve login
| * Add login
* | Update main app
|/
* Version initiale

السجل: يُظهر بوضوح أنه كان هناك خطّان تطوير متوازيان.

العودة إلى جدول المحتويات

3. الحل 2: إعادة الأساس

إعداد مماثل، استراتيجية مختلفة:

bash
mkdir demo-rebase && cd demo-rebase && git init

# نفس الإعداد السابق...
echo "print('app v1')" > app.py
git add . && git commit -m "Version initiale"

git checkout -b feature-login
echo "print('login system')" > login.py
git add . && git commit -m "Add login"
echo "print('login v2')" > login.py
git add . && git commit -m "Improve login"

git checkout main
echo "print('app v1.1')" > app.py
git add . && git commit -m "Update main app"

إعادة الأساس:

bash
git checkout feature-login
git rebase main              # «ينقل» إيداعاتك بعد main
git checkout main
git merge feature-login      # Fast-forward merge

نتيجة إعادة الأساس:

* Improve login
* Add login
* Update main app
* Version initiale

السجل: خطّي، كأنك طوّرت بعد تحديثات main.

العودة إلى جدول المحتويات

4. مقارنة عملية

الجانبالدمجإعادة الأساس
السجليُظهر فروعاً متوازيةخطّي ونظيف
إيداع الدمجنعم، يُنشأ تلقائياًلا، fast-forward
التعقيدبسيطأعقد
التعارضاتحلّها مرة واحدةربما عدة مرات
القابلية للتتبّعترى متى أُنشئت الميزة ودُمجتكأن التطوير كان متسلسلاً

تصوّر جنباً إلى جنب:

الدمج:

    A---B---C main
   /         \
  D---E---F---G feature (merge commit G)

إعادة الأساس:

A---B---C---D'---E'---F' main (commits D,E,F "déplacés")

العودة إلى جدول المحتويات

5. أي مقاربة تختار؟

استخدم الدمج عندما:

  • تبدأ مع Git
  • تريد الاحتفاظ بالسجل «الحقيقي»
  • يعمل الفريق على فروع طويلة الأمد
  • الأمان أولاً

الأمر:

bash
git checkout main
git merge feature-branch

استخدم إعادة الأساس عندما:

  • تريد سجلاً نظيفاً وخطّياً
  • فرع الميزة قصير وشخصي
  • يفضّل الفريق سجلاً «يشبه القصة»
  • تتقن Git جيداً

الأمر:

bash
git checkout feature-branch
git rebase main
git checkout main
git merge feature-branch    # Fast-forward

القاعدة الذهبية:

لا تعِد أساساً أبداً لإيداعات سبق مشاركتها/دفعها!

توصية بسيطة:

  • مبتدئ → دائماً الدمج
  • متمرّس → إعادة الأساس على الفروع الشخصية، والدمج للمشاركة

كلاهما يعمل. المهم = الاتساق داخل الفريق!

العودة إلى جدول المحتويات