إلغاء آخر commit في Git: soft reset أو revert
تمثل المقاطع حالات مختلفة وليست سكربتاً واحداً. اختر الحالة المناسبة لمستودعك واستبدل أسماء الفروع والمسارات وVERIFIED_COMMIT قبل الاستخدام. أوامر الإلغاء تخص العملية النشطة المقابلة فقط؛ لا تنفذ البديلين معاً.
الجواب المختصر
لإلغاء آخر commit محلية مع حفظ التغييرات، يحرك reset --soft الفرع إلى الأب ويترك الفهرس والملفات. لإلغاء واحدة مشتركة يضيف revert commit عكسية. قرر أولاً هل تريد حفظ الكود وهل يمتلك الآخرون هذا التاريخ.
المثال وشروطه
يحتوي المثال commit عادية غير دمج لها أب عند الرأس الحالي، بشجرة نظيفة ودون ملفات غير مرتبطة مجهزة. لا تملك الأولى HEAD^، وللدمج عدة آباء؛ لا يناسبهما هذا الاختصار. اقرأ الرسم ولا تعامل HEAD~1 كزر إلغاء شامل.
افحص الحالة قبل التعديل
اقرأ التغيير والحالة ومشاركة الفرع. إزالة غلاف commit لمواصلة الكود، وعكس كود منشور، والتخلص منه كله نتائج مختلفة. نسق قبل إعادة كتابة فرع منشور. التاريخ الحديث أو اسمك كمؤلف لا يثبت الخصوصية.
git status --short
git log -3 --oneline --decorate
git show --stat HEADاحتفظ بمرجع أو نسخة عمل منفصلة
أنشئ rescue/before-undo عند HEAD لحفظ الحالة المؤكدة الأصلية. احفظ الملفات غير المؤكدة منفصلة؛ الفرع لا يخزنها. في المثال النظيف يظهر بعد soft reset هذا التغيير وحده بالفهرس. الفهرس المعدل سابقاً قد يخلط مهام ويحتاج مراجعة مستقلة.
git branch rescue/before-undo HEAD
SCHOOL_UNDO=$(git rev-parse HEAD)المسار الأول
لحفظ العمل المحلي نفذ reset --soft HEAD^ وافحص diff --cached. يبقى المحتوى في الفهرس والشجرة لـcommit جديدة. يختلف تأثير mixed reset على الفهرس. لا تختَر --hard فقط لتقصير عرض الحالة، فهو يغير ملفات العمل أيضاً.
git reset --soft HEAD^
git diff --cached
git status --shortاختر النتيجة الأخرى عن قصد
للـcommit العادية المشتركة احفظ المعرّف المتحقق منه في SCHOOL_UNDO ونفذ revert. تضيف الجديدة التغيير العكسي مع حفظ التاريخ الذي تلقاه الزملاء. راجع النتيجة وفحوص المشروع قبل push عادي. إلغاء merge يحتاج اختيار الأب الرئيسي وفهم آثاره لاحقاً؛ استخدم إجراء خاصاً.
git revert "$SCHOOL_UNDO"الحدود والاستثناءات
قد يتعارض revert مع عمل لاحق. اقرأ status وحل وجهز الملفات ثم revert --continue. استخدم revert --abort للاختيار الخاطئ. لا يملك reset --soft حالة متابعة أو إلغاء مماثلة. لا تخلط المسارين أو تبدأ إصلاحاً آخر وrevert ما زال نشطاً.
git status
git revert --abortالتعارضات والتنظيف
التخلص أيضاً من كود مؤكد وملفات محلية قرار تدميري إضافي. احفظ وافحص الحالة أولاً. العمل غير المؤكد ليس في reflog. مع تفعيل restore points واكتشاف تغييرات محلية، يمكن لـFluxGit حفظ safety stash قبل hard reset مدعوم؛ هذه الطرفية لا تستدعي المسار المحمي.
تحقق من النتيجة
بعد soft reset قارن الرأس والتغيير المجهز بمرجع الإنقاذ. بعد revert تحقق أن العكس يؤثر في المطلوب فقط ويحفظ العمل اللاحق المفيد. نفذ فحوص المشروع واحتفظ بالإنقاذ أثناء المراجعة. نجاح أمر Git دون خطأ لا يثبت صحة الكود.
git log -4 --oneline --decorate
git status --short
git diff --cachedأسئلة شائعة
هل يحذف soft reset الملفات؟ يحتفظ بالشجرة والفهرس ويحرك المرجع. هل يمحو revert الأصل؟ لا، يسجل عكساً جديداً. هل يعيد reflog كل شيء؟ لا؛ يتعلق بمراجع محلية وكائنات محفوظة، لا بمحتوى ملفات غير محفوظ اعتباطياً.
راجع العملية في FluxGit
استخدم عرض التاريخ والتغييرات في FluxGit لمراجعة العملية وcommits المعنية. احتفظ بفحوص الفرع والمشاركة والملفات المحلية في هذا المثال. تعرض صفحة التنزيل النسخ والمنصات المتاحة حالياً.