إعادة التأسيس (Rebasing)
إعادة التأسيس هي ميزة قوية في Git تتيح لك إعادة كتابة سجل الالتزامات من خلال نقل أو دمج الالتزامات. في هذا الدرس، سنستكشف ما هي إعادة التأسيس، ومتى نستخدمها، وكيف تختلف عن الدمج.
ما هي إعادة التأسيس؟
إعادة التأسيس هي عملية نقل أو دمج سلسلة من الالتزامات إلى التزام أساسي جديد. على عكس الدمج الذي يُنشئ التزاماً جديداً مع والدين، تعيد إعادة التأسيس كتابة تاريخ المشروع من خلال إنشاء التزامات جديدة لكل التزام في الفرع الأصلي.
مفهوم أساسي: تغير إعادة التأسيس سجل الالتزامات من خلال إعادة كتابته، مما يجعله يبدو كما لو أنك أنشأت التزاماتك من نقطة بداية مختلفة.
أمر إعادة التأسيس الأساسي
الصيغة الأساسية لإعادة التأسيس هي:
# إعادة تأسيس الفرع الحالي على فرع آخر
git rebase <base-branch>
# مثال: إعادة تأسيس فرع الميزة على main
git checkout feature-branch
git rebase main
كيف تعمل إعادة التأسيس
إليك ما يحدث أثناء إعادة التأسيس:
1. يجد Git السلف المشترك للفرع الحالي والفرع المستهدف
2. يحفظ Git جميع الالتزامات التي تمت منذ السلف المشترك
3. يعيد Git تعيين الفرع الحالي إلى الفرع المستهدف
4. يطبق Git كل التزام محفوظ واحداً تلو الآخر فوق الفرع المستهدف
5. يحصل كل التزام على رمز SHA جديد (معرف التزام جديد)
نصيحة: فكر في إعادة التأسيس على أنها "إعادة تشغيل" التزاماتك فوق نقطة بداية مختلفة، مما ينشئ سجلاً خطياً.
مثال مرئي: إعادة التأسيس مقابل الدمج
قبل:
C3 (feature)
/
C1--C2 (main)
بعد الدمج:
C3 (feature)
/ \
C1--C2--C4 (main) ← التزام دمج
بعد إعادة التأسيس:
C1--C2--C3' (feature) ← التزام معاد تأسيسه
(main)
إعادة التأسيس التفاعلية
إعادة التأسيس التفاعلية هي واحدة من أقوى ميزات Git، مما يتيح لك تحرير أو إعادة ترتيب أو ضغط أو حذف الالتزامات:
# بدء إعادة تأسيس تفاعلية لآخر 3 التزامات
git rebase -i HEAD~3
# إعادة تأسيس تفاعلية على فرع
git rebase -i main
يفتح هذا محرراً بالخيارات:
pick abc1234 Add login feature
pick def5678 Fix typo in login
pick ghi9012 Update documentation
# الأوامر:
# p, pick = استخدام الالتزام
# r, reword = استخدام الالتزام، لكن تحرير الرسالة
# e, edit = استخدام الالتزام، لكن التوقف للتعديل
# s, squash = دمج في الالتزام السابق
# f, fixup = مثل squash، لكن تجاهل الرسالة
# d, drop = إزالة الالتزام
ضغط الالتزامات
الضغط يجمع التزامات متعددة في واحد، مما ينشئ سجلاً أنظف:
# قم بالتغيير في محرر إعادة التأسيس التفاعلية:
pick abc1234 Add login feature
squash def5678 Fix typo in login
squash ghi9012 Update documentation
# ينتج عنه التزام واحد بالتغييرات المجمعة
حالة الاستخدام: اضغط الالتزامات قبل دمج فرع الميزة للحفاظ على سجل الفرع الرئيسي نظيفاً ومركزاً على الميزات الكاملة بدلاً من التغييرات الإضافية.
إعادة التأسيس مقابل الدمج: متى تستخدم كل منهما
استخدم إعادة التأسيس عندما:
✓ تعمل على فرع ميزة محلي
✓ تريد الحفاظ على سجل مشروع خطي
✓ تحديث فرع الميزة بأحدث تغييرات main
✓ تنظيف الالتزامات قبل الدفع
✓ تعمل بمفردك على فرع
استخدم الدمج عندما:
✓ دمج الميزات المكتملة في الفرع الرئيسي
✓ العمل على فروع عامة/مشتركة
✓ تريد الحفاظ على السجل الدقيق للتغييرات
✓ عدة أشخاص يعملون على نفس الفرع
✓ تريد أن ترى متى تم دمج الميزات
القاعدة الذهبية لإعادة التأسيس
قاعدة حرجة: لا تعد أبداً تأسيس الالتزامات التي تم دفعها إلى مستودع عام وقد يكون الآخرون قد بنوا عملاً عليها. إعادة التأسيس تعيد كتابة السجل، مما قد يسبب مشاكل خطيرة للمتعاونين.
ممارسات إعادة التأسيس الآمنة:
✓ أعد تأسيس الالتزامات المحلية التي لم يتم دفعها
✓ أعد تأسيس فروع الميزات الخاصة بك
✓ أعد التأسيس قبل إنشاء طلب سحب
✗ لا تعد أبداً تأسيس الفرع الرئيسي main/master
✗ لا تعد أبداً تأسيس الالتزامات التي يعمل عليها الآخرون
✗ لا تعد أبداً تأسيس فروع الإصدار العامة
حل تعارضات إعادة التأسيس
يتم حل التعارضات أثناء إعادة التأسيس التزاماً واحداً في كل مرة:
# إذا حدث تعارض أثناء إعادة التأسيس:
# 1. إصلاح التعارضات في الملفات المتأثرة
git status # عرض الملفات المتعارضة
# 2. تجهيز الملفات المحلولة
git add <resolved-files>
# 3. مواصلة إعادة التأسيس
git rebase --continue
# أو إحباط إذا لزم الأمر
git rebase --abort
نصيحة: أثناء إعادة التأسيس، قد تحتاج إلى حل نفس التعارض عدة مرات إذا ظهر في التزامات مختلفة. كن صبوراً واحلل كل واحد بعناية.
سير عمل إعادة التأسيس العملي
إليك سير عمل شائع للحفاظ على فرع ميزة محدثاً:
# أنت تعمل على feature-branch
git checkout feature-branch
# جلب أحدث التغييرات من البعيد
git fetch origin
# إعادة تأسيس فرعك على أحدث main
git rebase origin/main
# إذا حدثت تعارضات، احلها واستمر
# بمجرد الانتهاء، ادفع بالقوة (فقط إذا تم الدفع مسبقاً)
git push --force-with-lease origin feature-branch
إعادة كتابة رسائل الالتزام
استخدم reword لتغيير رسائل الالتزام دون تغيير المحتوى:
# بدء إعادة تأسيس تفاعلية
git rebase -i HEAD~3
# في المحرر، قم بتغيير pick إلى reword:
reword abc1234 Add login feature
pick def5678 Fix typo
pick ghi9012 Update docs
# سيتوقف Git عند كل التزام reword
# قم بتحرير الرسالة واحفظ
تحرير الالتزامات السابقة
استخدم edit لتعديل محتوى الالتزامات السابقة:
# بدء إعادة تأسيس تفاعلية
git rebase -i HEAD~3
# قم بتغيير pick إلى edit للالتزامات المراد تعديلها
edit abc1234 Add login feature
pick def5678 Fix typo
# يتوقف Git عند التزام edit
# قم بإجراء تغييراتك
git add <files>
git commit --amend
git rebase --continue
إسقاط الالتزامات
إزالة الالتزامات غير المرغوب فيها من السجل:
# في محرر إعادة التأسيس التفاعلية:
pick abc1234 Add feature
drop def5678 Accidentally committed secrets
pick ghi9012 Update docs
# أو ببساطة احذف السطر
ملاحظة أمنية: إذا التزمت بالخطأ بأسرار، فإن إسقاط الالتزام ليس كافياً - الأسرار لا تزال في سجل Git. تحتاج إلى استخدام git filter-branch أو BFG Repo-Cleaner لإزالتها تماماً.
إعادة التأسيس على فرع مختلف
يمكنك إعادة التأسيس على أي فرع أو التزام:
# إعادة تأسيس الفرع الحالي على develop
git rebase develop
# إعادة تأسيس feature-a على feature-b
git checkout feature-a
git rebase feature-b
# إعادة التأسيس على التزام محدد
git rebase abc1234
خيارات الإحباط والتخطي
# إحباط إعادة التأسيس والعودة إلى الحالة الأصلية
git rebase --abort
# تخطي الالتزام الحالي (إذا كان يسبب مشاكل)
git rebase --skip
# المتابعة بعد حل التعارضات
git rebase --continue
تمرين عملي:
سيناريو: لديك فرع ميزة مع 3 التزامات فوضوية تريد تنظيفها قبل الدمج.
# إنشاء مستودع تدريبي
git init rebase-practice
cd rebase-practice
# إنشاء بعض الالتزامات
echo "Feature v1" > feature.txt
git add feature.txt
git commit -m "Add feature"
echo "Feature v2" >> feature.txt
git commit -am "Fix typo"
echo "Feature v3" >> feature.txt
git commit -am "Another fix"
# الآن اضغط الـ 3 التزامات في واحد
git rebase -i HEAD~3
# في المحرر، قم بالتغيير إلى:
# pick (الالتزام الأول)
# squash (الالتزام الثاني)
# squash (الالتزام الثالث)
# احفظ وقم بتحرير رسالة الالتزام المدمجة
# اعرض النتيجة
git log --oneline
التحدي: تدرب على تقسيم التزام باستخدام أمر 'edit'، ثم git reset HEAD^، وإجراء التزامين منفصلين.
الأخطاء الشائعة في إعادة التأسيس
الخطأ 1: إعادة تأسيس الالتزامات المدفوعة
→ الحل: أعد تأسيس الالتزامات المحلية فقط
الخطأ 2: فقدان الالتزامات أثناء إعادة التأسيس
→ الحل: استخدم git reflog للاسترداد
الخطأ 3: تعارضات دمج معقدة
→ الحل: أحبط واستخدم الدمج بدلاً من ذلك
الخطأ 4: نسيان الدفع القسري بعد إعادة التأسيس
→ الحل: استخدم --force-with-lease للأمان
متقدم: الضغط التلقائي
يمكن لـ Git ضغط التزامات الإصلاح تلقائياً:
# إنشاء التزام إصلاح لالتزام سابق
git commit --fixup abc1234
# لاحقاً، اضغط جميع الإصلاحات تلقائياً
git rebase -i --autosquash main
الملخص
في هذا الدرس، تعلمت:
- إعادة التأسيس تنقل الالتزامات إلى قاعدة جديدة، وتعيد كتابة السجل
- إعادة التأسيس التفاعلية تتيح تحرير وضغط وإعادة ترتيب الالتزامات
- استخدم إعادة التأسيس للفروع المحلية، والدمج للفروع العامة
- لا تعد أبداً تأسيس الالتزامات التي بنى عليها الآخرون عملاً
- حل تعارضات إعادة التأسيس التزاماً واحداً في كل مرة
- الضغط ينشئ سجل التزامات أنظف وأكثر تركيزاً
- استخدم --force-with-lease عند دفع الفروع المعاد تأسيسها
التالي: في الدرس التالي، سنستكشف المستودعات البعيدة ونتعلم كيفية العمل معها بفعالية!