في هذا الدرس 6تصفّح المواضيع
يوفر نظام Git طريقتين رئيسيتين لتكامل الفروع: الأمر git merge والأمر git rebase (إعادة تأسيس قاعدة الفرع). فبينما يربط الدمج قمتي الفرعين بالتزام دمج، يقوم git rebase بأخذ الالتزامات الخاصة بفرع الميزة وإعادة تطبيقها واحداً تلو الآخر فوق أحدث التزام وصل إليه الفرع الأساسي.
انتبه لاتجاه التنفيذ: لإعادة تأسيس الفرع feat-ui فوق قمة main، ننتقل أولاً إلى فرع الميزة عبر git switch feat-ui ثم ننفذ git rebase main. ولأن كل التزام مُعاد تطبيقه يحصل على التزام والد جديد، يمنحه Git بصمة SHA-1 جديدة تماماً.
# Switch to your feature branch and rebase onto main
git switch feat-ui
git rebase main
# Fast-forward main cleanly after rebasing
git switch main
git merge feat-ui
لماذا تفضل كثير من الفرق الهندسية إعادة تأسيس فروع الميزات فوق main قبل دمجها؟
- سجل تاريخي خطي ونظيف: بدلاً من تشابك الخطوط وعقد الدمج المتداخلة في مخرجات
git log --graph، يظهر تاريخ المشروع كخط زمني مستقيم يسهل تتبعه وفحصه. - تمكين الدمج السريع المباشر: بمجرد إعادة تأسيس
feat-uiفوق قمةmain، يصبح الانتقال إلىmainوتشغيلgit merge feat-uiدمجاً سريعاً (Fast-Forward) سلساً بلا عقد إضافية.
# Inspect the clean single-line commit graph after rebase
git log --oneline --graph --decorate -n 5
أثناء تطوير ميزة محلياً، قد تسجل عدة التزامات سريعة مثل «تجربة» أو «تصحيح خطأ إملائي». وقبل تسليم فرعك، يتيح لك الوضع التفاعلي (git rebase -i HEAD~3) تهذيب آخر التزاماتك المحلية وتنظيمها عبر الأوامر التالية داخل المحرر:
- الأمر
pick: الإبقاء على الالتزام كما هو دون تغيير. - الأمر
reword: الاحتفاظ بتعديلات الالتزام مع فتح المحرر لتعديل رسالته فقط. - الأمر
squash: دمج تعديلات الالتزام مع الالتزام الذي يسبقه ودمج رسالتيهما معاً. - الأمر
fixup: دمج تعديلات الالتزام في الالتزام السابق له مع تجاهل رسالته المؤقتة تلقائياً. - الأمر
drop: حذف الالتزام وإسقاطه من السجل.
# Open interactive rebase for the last 3 local commits
git rebase -i HEAD~3
# Verify the squashed clean commit in log
git log --oneline -n 3
نظراً لأن git rebase يعيد تطبيق التزاماتك واحداً تلو الآخر، فقد يتوقف مؤقتاً عند أحد الالتزامات إذا صادف تعارضاً في الأسطر. ويتم التعامل معه بالخطوات التالية:
- حرّر الملف المتعارض واحذف جميع علامات التعارض الثلاث بالكامل.
- جهّز الملف المحسوم عبر الأمر
git add <file>. - شغّل الأمر
git rebase --continue(ولا تشغّلgit commitيدوياً) ليكمل Git تطبيق الالتزام الحالي وينتقل للتالي.
وإذا أردت في أي لحظة إلغاء إعادة التأسيس بالكامل واسترجاع حالة الفرع الأصلية قبل البدء، نفّذ الأمر git rebase --abort.
# Stage resolved file and continue replaying commits
git add app.html
git rebase --continue
# Or cancel the entire rebase back to original state
git rebase --abort
تُعد القاعدة الذهبية لإعادة التأسيس (Golden Rule of Rebasing) أهم قاعدة أمان في هندسة Git: لا تستخدم git rebase أبداً على التزامات عامة مشتركة يعمل عليها مطورون آخرون (مثل الفرع الرئيسي المشترك main).
بما أن git rebase يستبدل الالتزامات القديمة بكائنات التزام جديدة تحمل بصمات SHA-1 مختلفة، فإن إعادة كتابة سجل مشترك تتسبب في تضارب السجلات وتكرار الالتزامات لدى بقية أعضاء الفريق. استخدم git rebase فقط لتحديث وتهذيب التزامات فرعك المحلي الخاص قبل دمجها.
# Inspect reflog or ORIG_HEAD if you need to undo a rebase
git reflog -n 4
git reset --hard ORIG_HEAD
يلخص الجدول المقارن التالي الفروق الجوهرية بين الدمج القياسي git merge وإعادة التأسيس git rebase لاختيار الأداة الأنسب لكل موقف:
| وجه المقارنة | الأمر git merge | الأمر git rebase |
|---|---|---|
| شكل سجل الالتزامات | يحفظ الشكل الحقيقي للتفرع والدمج الزمني | ينشئ سجلاً خطياً مستقيماً يسهل قراءته |
| بصمات الالتزامات SHA-1 | لا يغير بصمات الالتزامات الموجودة أبداً | ينشئ التزامات جديدة ببصمات SHA-1 جديدة |
| التزام الدمج الإضافي | ينشئ التزام دمج بوالدين عند تفرع المسارات | لا ينشئ أي التزام دمج إضافي |
| الأمان على الفروع المشتركة | آمن بنسبة 100% على السجلات المشتركة | ممنوع على السجلات المشتركة (القاعدة الذهبية) |
| تهذيب الالتزامات | يبقي جميع الالتزامات التجريبية كما هي | يتيح دمج وتهذيب الالتزامات عبر rebase -i |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس آلية عمل git rebase لبناء سجل التزامات خطي، وتنظيم الالتزامات المحلية تفاعلياً عبر rebase -i، ومتابعة أو إلغاء التأسيس بـ --continue و--abort، والالتزام بالقاعدة الذهبية بعدم إعادة كتابة التاريخ المشترك. الخطوة التالية: انتقل الآن إلى الدرس رقم 25 «ربط وإدارة المستودعات البعيدة عبر الأمر git remote» لبدء الوحدة السادسة وربط مستودعك المحلي بالسحابة.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Rebase إعادة التأسيس (Rebase)
- نقل سلسلة التزامات فرع لتبدأ من قمة التزام أساسي أحدث عبر إعادة تطبيقها واحداً تلو الآخر ببصمات جديدة.
- للمراجعة
- 02 Interactive Rebase إعادة التأسيس التفاعلية
- تشغيل git rebase -i لفتح قائمة الالتزامات المحلية وتعديل رسائلها أو دمجها أو حذف غير اللازم منها.
- للمراجعة
- 03 Squashing دمج وتكثيف الالتزامات
- جمع عدة التزامات فرعية صغيرة في التزام واحد متكامل ونظيف باستخدام الأمر squash أو fixup.
- للمراجعة
- 04 Cherry-Pick انتقاء الالتزام (Cherry-Pick)
- نسخ تعديلات التزام واحد محدد من فرع آخر وتطبيقه كالتزام جديد فوق الفرع النشط الحالي.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 ORIG_HEAD ORIG_HEAD
- Original HEAD Backup Pointer
- مؤشر أمان يحفظ فيه Git بصمة قمة الفرع الأصلية تلقائياً قبل تنفيذ إعادة التأسيس أو الضبط.
- للمراجعة
- 02 SHA-1 SHA-1
- Secure Hash Algorithm 1
- البصمة الرقمية للالتزام التي تتغير تلقائياً عند إعادة تأسيس الالتزام فوق والد جديد.
- للمراجعة
- 03 WIP WIP
- Work In Progress
- الالتزامات التجريبية الصغيرة أثناء العمل التي يتم دمجها وتهذيبها عبر التأسيس التفاعلي.
- للمراجعة
- 04 DAG DAG
- Directed Acyclic Graph
- الرسم البياني للالتزامات الذي يحوله الأمر git rebase من مسارات متفرعة إلى سلسلة خطية مستقيمة.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
انتقل إلى الفرع feat-ui عبر git switch feat-ui، ونفّذ git rebase main، ثم انتقل إلى main وادمج الفرع دمجاً سريعاً.
-
شغّل الأمر git rebase -i HEAD~3 على فرع محلي لدمج التزام إصلاح إملائي في الالتزام السابق له، وتأكد من النتيجة عبر git log --oneline -n 3.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي10 أسئلة تنتظرك +
كيف يختلف أسلوب الأمر git rebase في تكامل الفروع عن الأمر git merge؟
يعيد الأمر git rebase تطبيق التزامات الفرع الحالي واحداً تلو الآخر فوق قمة الفرع الأساسي لإنتاج سجل خطي.
عندما يعيد الأمر git rebase تطبيق التزاماتك فوق قاعدة جديدة، تحتفظ الالتزامات بنفس بصمات SHA-1 القديمة دون تغيير.
خطأ؛ لأن تغير الالتزام الوالد ينتج كائنات التزام جديدة تماماً تحمل بصمات SHA-1 جديدة.
ما هي القاعدة الذهبية لاستخدام الأمر git rebase بأمان؟
عدم استخدام git rebase أبداً على الالتزامات والفروع المشتركة مع مطورين آخرين.
أي صيغة تفتح المحرر التفاعلي لدمج أو تعديل رسائل أو إعادة ترتيب آخر 3 التزامات محلية؟
يفتح الأمر git rebase -i HEAD~3 شاشة التأسيس التفاعلي لآخر ثلاثة التزامات محلية.
في قائمة git rebase -i التفاعلية، أي أمر يدمج الالتزام في الالتزام الذي يعلوه مع تجاهل رسالته المؤقتة تلقائياً؟
يدمج الأمر fixup التعديلات في الالتزام السابق ويحتفظ برسالة الالتزام السابق فقط دون فتح محرر الرسائل.
بعد تحرير الملف المتعارض أثناء عملية rebase وتجهيزه بالأمر git add، أي أمر يستأنف عملية إعادة التأسيس؟
يستأنف الأمر git rebase --continue تطبيق الالتزامات المتبقية.
أي أمر يلغي عملية إعادة التأسيس الجارية ويعيد الفرع فوراً إلى حالته الأصلية قبل البدء؟
يلغي الأمر git rebase --abort العملية ويعيد الفرع إلى وضعه الأصلي بالكامل.
في محرر التأسيس التفاعلي git rebase -i، تُرتب الالتزامات من الأقدم في الأعلى إلى الأحدث في الأسفل.
صواب؛ تُعرض الالتزامات حسب ترتيب إعادة تطبيقها من الأقدم في السطر الأول إلى الأحدث في الأسفل.
أي أمر في Git ينسخ التزاماً واحداً محدداً فقط من فرع آخر ويطبقه على فرعك النشط الحالي؟
ينسخ الأمر git cherry-pick <commit-hash> تعديلات التزام واحد محدد ويطبقه فوق الفرع الحالي.
ما المؤشر الخاص الذي يحفظ قمة الفرع الأصلية قبل عملية التأسيس ويتيح التراجع عنها بعد اكتمالها؟
يحفظ المؤشر ORIG_HEAD موقع الفرع الأصلي قبل تنفيذ عمليات مثل rebase أو reset.