حفظت commit على الفرع الخطأ؟ انقل التغيير بأمان
تمثل المقاطع حالات مختلفة وليست سكربتاً واحداً. اختر الحالة المناسبة لمستودعك واستبدل أسماء الفروع والمسارات وVERIFIED_COMMIT قبل الاستخدام. أوامر الإلغاء تخص العملية النشطة المقابلة فقط؛ لا تنفذ البديلين معاً.
الجواب المختصر
إذا أنشأت commit على الفرع الخطأ، احتفظ أولاً بمرجع إليه في فرع إنقاذ. طبق التغيير على الفرع المقصود باستخدام cherry-pick وافحص النتيجة، ثم صحح الأصل. قد يناسب reset رأساً غير مشارك، بينما يحتاج الفرع المشترك عادة إلى revert. نقل التغيير وتصحيح المصدر قراران منفصلان.
المثال وشروطه
يبدأ المثال بحالة محددة: commit عادي واحد، وليس دمجاً، عند رأس main، ينبغي أن يكون على feature/fix الموجود. شجرة العمل نظيفة. استبدل الأسماء بأسماء فروعك. عند وجود عدة commits أو دمج أو عمل لاحق، حدد النطاق الدقيق قبل نسخ reset في المثال.
افحص الحالة قبل التعديل
اقرأ الحالة والفرع الحالي والرسم الحديث. افحص الملفات والتغيير الفعلي لا العنوان فقط؛ فقد يجمع commit عدة مهام. احفظ المعرّف الكامل في SCHOOL_MISTAKE لتمييز الأصل بعد تبديل الفروع. تحقق ممن حصل على هذا التاريخ قبل اختيار كيفية تصحيح main.
git status --short
git branch --show-current
git log -5 --oneline --decorate
git show --stat HEAD
SCHOOL_MISTAKE=$(git rev-parse HEAD)احتفظ بمرجع أو نسخة عمل منفصلة
يحافظ فرع الإنقاذ على إمكانية الوصول إلى كائن commit، لكنه لا ينسخ تعديلات غير محفوظة في commit. احفظ العمل المحلي وتحقق منه منفصلاً عبر commit مقصود أو stash مفحوص أو نسخة خارجية. يشمل stash مع -u الملفات غير المتتبعة، لا الملفات المتجاهلة. لا يحفظ reflog محتوى هذه الملفات تلقائياً.
git branch rescue/wrong-branch "$SCHOOL_MISTAKE"
git show --stat rescue/wrong-branchالمسار الأول
انتقل إلى الفرع المقصود ونفذ cherry-pick للمعرّف المحفوظ. يطبق Git التغيير وينشئ عادة commit بمعرّف مختلف لأن الأب تغير. افحص التغيير وفحوص المشروع المناسبة. لا تزل الأصل قبل التأكد من وجود التغيير المطلوب في الوجهة ومن بقاء مرجع الإنقاذ.
git switch feature/fix
git cherry-pick "$SCHOOL_MISTAKE"
git show --stat HEADاختر النتيجة الأخرى عن قصد
في حالة الرأس غير المشارك فقط، ارجع إلى main وتحقق أن HEAD ما زال SCHOOL_MISTAKE. مع شجرة نظيفة وفرع إنقاذ محفوظ، يزيل reset إلى الأب ذلك commit من main. يبدل hard reset أيضاً الملفات المتتبعة. إذا تقدم main أو شُورك commit، لم تعد هذه السلسلة مناسبة.
git switch main
git status --short
git rev-parse HEAD
git reset --hard "${SCHOOL_MISTAKE}^"الحدود والاستثناءات
عندما وصل الخطأ إلى فرع مشترك، فضل revert عادياً عليه. يضيف commit يعكس التغيير دون حذف تاريخ الزملاء. راجع cherry-pick في الوجهة وrevert في المصدر كلّاً على حدة. نسق الدمج اللاحق مع الفريق؛ هذه ليست وصفة لتنفيذ force push تلقائياً.
git switch main
git revert "$SCHOOL_MISTAKE"التعارضات والتنظيف
قد يتوقف cherry-pick بسبب تعارض. اقرأ status وحل الملفات المعنية وأضفها ثم تابع؛ استخدم cherry-pick --abort إذا أخطأت في التغيير أو الوجهة. لدى revert أوامره الخاصة للمتابعة والإلغاء. إلغاء عملية نشطة ليس نسخة احتياطية عامة للتعديلات التي حدثت خارجها.
git status
git cherry-pick --abort
git revert --abortتحقق من النتيجة
يجب أن يظهر الرسم النهائي التغيير على feature/fix والتصحيح المختار على main. قارن التغييرين وافحص حالة كل نسخة عمل. احتفظ بـrescue/wrong-branch حتى انتهاء المراجعة. الحالة النظيفة وحدها لا تثبت صحة التطبيق؛ افحص أيضاً السلوك المتأثر.
git log -6 --oneline --decorate --all
git show --stat feature/fix
git status --shortأسئلة شائعة
عدة commits؟ افحص الترتيب والتبعيات والنطاق. Reset --soft يحرك المرجع ويحتفظ بالفهرس والملفات، لكنه لا ينقل وحده commit إلى فرع آخر. هل نفذت push؟ ابدأ بحالة revert للتاريخ المشترك واتفق صراحة على أي إعادة كتابة استثنائية.
راجع العملية في FluxGit
استخدم عرض التاريخ والتغييرات في FluxGit لمراجعة العملية وcommits المعنية. احتفظ بفحوص الفرع والمشاركة والملفات المحلية في هذا المثال. تعرض صفحة التنزيل النسخ والمنصات المتاحة حالياً.