Git amend: صحح commit الأخيرة دون مفاجآت الفهرس
تمثل المقاطع حالات مختلفة وليست سكربتاً واحداً. اختر الحالة المناسبة لمستودعك واستبدل أسماء الفروع والمسارات وVERIFIED_COMMIT قبل الاستخدام. أوامر الإلغاء تخص العملية النشطة المقابلة فقط؛ لا تنفذ البديلين معاً.
الجواب المختصر
يستبدل commit --amend الرأس الحالي بـcommit جديدة، ولا يعدل الكائن الأصلي في مكانه. يصلح رسالة أو محتوى commit محلية أخيرة بعد فحص الفهرس. إذا شُوركت، تكون إضافة commit تصحيحية عادة أسهل تنسيقاً من إعادة كتابة تاريخ الآخرين.
المثال وشروطه
يستخدم المثال commit محلية عادية برسالة خاطئة وتعديل مفقود في src/parser.js. هناك إصلاح للرسالة وحدها وآخر للمحتوى أيضاً. لا يعالج المثال commit أقدم أو أولى أو دمجاً. استبدل المسار والرسالة بقيمك وابدأ بالرأس الحالي.
افحص الحالة قبل التعديل
اقرأ status وآخر commit وdiff --cached. يمد الفهرس amend العادي بالمحتوى، وقد تدخل ملفات مجهزة لمهمة أخرى بلا قصد. افحص غير المجهز أيضاً لمعرفة ما يبقى خارجاً. تحقق هل نُشر الأصل أو دُمج أو استخدمه زميل قبل تغيير هويته.
git status --short
git log -1 --oneline
git diff --cached
git diffاحتفظ بمرجع أو نسخة عمل منفصلة
أنشئ rescue/before-amend عند HEAD ليبقى الأصل متاحاً للمقارنة. لا يحفظ كل الملفات المحلية؛ احفظ المهمة منها منفصلاً. قد يحدد reflog حالات قديمة ما دامت محلية، لكنه لا يضمن حفظ كائنات دائم أو نسخاً لتعديلات لم تُؤكد.
git branch rescue/before-amend HEADالمسار الأول
للرسالة وحدها، يستبعد --amend --only دون مسارات تغييرات مجهزة مسبقاً. يقدم -m الرسالة الصحيحة. افحص commit والفهرس بعدها؛ يجب أن يبقى العمل المجهز متاحاً لـcommit أخرى. تضمين الفهرس أيضاً مسار آخر رغم أن كليهما يستخدم amend.
git commit --amend --only -m "Fix parser error message"
git diff --cachedاختر النتيجة الأخرى عن قصد
للملف المنسي، جهز المسار المطلوب وافحص فرق الفهرس كاملاً ثم --amend --no-edit للاحتفاظ بالرسالة. تدخل الملفات المجهزة الأخرى ما لم تستبعدها عمداً. نفذ فحوص المشروع. اختيار hunks محددة يساعد المراجعة لكنه لا يثبت صحة commit المجمعة.
git add -- src/parser.js
git diff --cached
git commit --amend --no-editالحدود والاستثناءات
عندما يكون الرأس مشتركاً، فضل commit تصحيح جديدة. نشر الرأس المعاد كتابته قد يحتاج تنسيقاً وقد تمنعه حماية الفرع. لا نقدم force push عاماً. إن سمح الفريق، اتبع إجراءه المنفصل لفحص lease والفرع والزملاء.
git add -- src/parser.js
git diff --cached
git commit -m "Correct parser handling"التعارضات والتنظيف
لا يملك amend عادة سلسلة خاصة لحل التعارضات. فشل hook أو رفض commit يستدعي فحص الرسالة والحالة، لا reset --hard تلقائياً. قارن المحتوى الخاطئ أولاً بـrescue/before-amend. احفظ نسخ الملفات المحلية المتحقق منها قبل أي reset تصحيحي.
تحقق من النتيجة
قارن الرسالة والملفات في الأصل والجديد. اختلاف المعرّفين طبيعي. للرسالة فقط يجب أن تتطابق الشجرتان؛ لتصحيح المحتوى يختلف التغيير المقصود فقط. افحص العمل المتبقي بالفهرس واحتفظ بمرجع الإنقاذ حتى دخول البديل المراجع في التاريخ المطلوب بأمان.
git show --stat HEAD
git diff rescue/before-amend HEAD
git status --shortأسئلة شائعة
هل يمنع no-edit تغير المحتوى؟ لا، يحفظ الرسالة فقط ويظل الفهرس مؤثراً. هل يصلح amend commit أقدم؟ ليس مباشرة؛ يلزم مسار آخر. بعد push؟ فقط بسياسة صريحة للتاريخ المشترك؛ commit إضافية تتجنب كثيراً من التنسيق.
راجع العملية في FluxGit
استخدم عرض التاريخ والتغييرات في FluxGit لمراجعة العملية وcommits المعنية. احتفظ بفحوص الفرع والمشاركة والملفات المحلية في هذا المثال. تعرض صفحة التنزيل النسخ والمنصات المتاحة حالياً.