Git و GitHub

إعادة التأسيس (Rebasing)

13 دقيقة الدرس 11 من 35

إعادة التأسيس (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 عند دفع الفروع المعاد تأسيسها
التالي: في الدرس التالي، سنستكشف المستودعات البعيدة ونتعلم كيفية العمل معها بفعالية!

ES
Edrees Salih
منذ 19 ساعة

We are still cooking the magic in the way!