إعادة التأسيس والانتقاء وجراحة السجل
إعادة التأسيس والانتقاء وجراحة السجل
كل مهندس متمرس يواجه في النهاية القرار ذاته: هل أدمج هذا الفرع أم أُعيد تأسيسه؟ لا يؤثر هذا الاختيار على الرسم البياني الذي تراه في git log فحسب — بل يحدد كيف يتتبع فريقك الأعطال، ويبحث عن الانحدارات، ويراجع السجل بعد ستة أشهر. يتخطى هذا الدرس الأساسيات ليعلمك استخدام أدوات Git لمعالجة التاريخ بالطريقة التي يتبعها كبار المهندسين وقادة DevOps على نطاق واسع.
الدمج مقابل إعادة التأسيس: النموذج الذهني
يُسجّل الدمج (Merge) حقيقة أن خطَّي تطوير التقيا في لحظة بعينها، ويحفظ السياق الكامل: يمكنك دائمًا إعادة تكوين ما كان على main حين وصل فرعك. يمتلك دمج الالتزام أبوَين ويُمثّل السجل الدائم لهذا الالتقاء.
أما إعادة التأسيس (Rebase) فتأخذ التزاماتك وتُعيد تطبيقها على قاعدة مختلفة. يظل محتوى الالتزام مطابقًا، لكن يتغير الـ SHA لأن مؤشر الأب يتغير. تبدو النتيجة كما لو أنك بدأت العمل بعد آخر التزام في المصدر — يصبح الفرع خطيًا.
إعادة التأسيس اليومية: إبقاء الفرع محدثًا
الاستخدام الأكثر شيوعًا لإعادة التأسيس بسيط: تريد أن يجلس فرع الميزة فوق أحدث إصدار من main قبل فتح طلب دمج (Pull Request).
إعادة التأسيس التفاعلية: المشرط الجراحي
تتيح لك إعادة التأسيس التفاعلية (git rebase -i) إعادة كتابة التاريخ قبل وصوله إلى الخادم المشترك. في شركات التقنية الكبرى، يُعدّ دمج التزامات العمل قيد التنفيذ في التزامات نظيفة وذرية قبل الرفع ممارسةً معيارية. الأوامر المتاحة لكل التزام هي:
- pick — احتفظ بالالتزام كما هو
- reword — احتفظ بالالتزام مع تحرير رسالته
- edit — توقف بعد التطبيق لتتمكن من التعديل
- squash — ادمجه مع الالتزام السابق مع دمج الرسائل
- fixup — مثل squash لكن تجاهل رسالة هذا الالتزام
- drop — احذف الالتزام كليًا
git config --global core.editor "code --wait" (VS Code) أو vim. كثير من الفرق تستخدم git rebase -i --autosquash جنبًا إلى جنب مع git commit --fixup=<SHA> لترتيب التزامات الإصلاح تلقائيًا أثناء إعادة التأسيس.
الانتقاء (Cherry-Pick): زرع التزامات بعينها
أحيانًا تحتاج إلى إصلاح محدد من فرع ما على فرع آخر، دون دمج الفرع كله. يطبّق git cherry-pick الفرق (diff) لالتزام واحد أو أكثر على HEAD الحالية.
Cherry-picked from main: 9d1e2f3) وتتبعها في ملاحظات الإصدار.
Reflog: شبكة الأمان الطارئة
الـ reflog هو شبكة الأمان الخفية في Git. في كل مرة يتحرك فيها HEAD — التزام أو إعادة تأسيس أو إعادة ضبط أو تبديل فرع — يُسجّل Git الموضع القديم في .git/logs/HEAD. يُحتفظ بهذا السجل 90 يومًا افتراضيًا وهو محلي فقط (لا يُرفع). هذا يعني أن لا شيء تقريبًا يضيع حقًا على جهازك.
أدوات أخرى لمعالجة التاريخ
يُعيد git commit --amend كتابة الالتزام الأخير — مفيد لتصحيح خطأ إملائي في الرسالة أو إضافة ملف منسي. مثل إعادة التأسيس، يُغيّر الـ SHA، لذا استخدمه قبل الرفع فقط.
يُحرّك git reset مؤشر الفرع للخلف. يحتفظ --soft بتغييراتك مرحلية؛ يلغي --mixed (الافتراضي) مرحلتها؛ ويتجاهلها --hard كليًا. استخدم --hard فقط حين تكون متأكدًا تمامًا من رغبتك في التخلي عن العمل.
يُعدّ git bisect الأداة الشريكة للتاريخ النظيف: يجعل التاريخ الخطي والذري البحث الثنائي عن الانحدارات أسرع بكثير. هذا هو سبب اشتراط الفرق "تغيير منطقي واحد لكل التزام" — ليس للجمالية، بل لكفاءة الاستجابة للحوادث.