البرمجة مبتدئ 6 دقيقة

كيفية التراجع عن آخر commit في Git بأمان

للتو أجريت commit وندمت عليه فورًا — ملفات خاطئة، أو كود مكسور، أو رسالة بها خطأ إملائي. يمنحك Git عدة طرق للتراجع، والاختيار الصحيح بينها يعتمد على سؤال واحد: هل تم push هذا الـ commit بالفعل؟ يشرح هذا الدليل كل حالة واقعية حتى تختار الأداة الصحيحة بدلًا من تعقيد الأمور.

الخطوات

  1. 1

    افهم وضعك أولًا

    قبل تشغيل أي أمر، تحقق مما إذا كان الـ commit قد تم push له. إذا كان موجودًا في مستودعك المحلي فقط، يمكنك إعادة كتابة التاريخ بحرية. أما إذا تم push له إلى فرع مشترك، فستتعارض إعادة الكتابة مع نسخ الآخرين.

    bash
    # تحقق هل الفرع المحلي متقدم على الـ remote
    git status
    # أو افحص السجل
    git log --oneline -5
  2. 2

    تراجع عن commit غير منشور مع الاحتفاظ بالتغييرات

    استخدم git reset --soft HEAD~1. يعيد هذا الأمر مؤشر الفرع خطوة للخلف لكن يُبقي جميع التغييرات في منطقة الـ staging جاهزةً لإعادة الـ commit. لا شيء يُفقد — الفرق لا يزال في الـ index.

    bash
    git reset --soft HEAD~1
    # تغييراتك لا تزال في منطقة الـ staging
    git status
  3. 3

    تراجع عن commit غير منشور مع إبقاء التغييرات خارج الـ staging

    الخيار الافتراضي --mixed يعيد المؤشر للخلف ويُخرج التغييرات من الـ staging، لكن يُبقيها في مجلد العمل. مناسب عندما تريد تقسيم الـ diff وإضافة أجزاء منه فقط.

    bash
    git reset HEAD~1
    # يعادل: git reset --mixed HEAD~1
    # التغييرات موجودة في مجلد العمل لكن خارج الـ staging
  4. 4

    تراجع عن commit غير منشور وامسح التغييرات نهائيًا

    تحذير: هذا الأمر مدمِّر. git reset --hard HEAD~1 يعيد المؤشر للخلف ويحذف جميع التغييرات من الـ index ومجلد العمل. لا يوجد Ctrl-Z بعدها — إلا من خلال git reflog (مشروح أدناه).

    bash
    # مدمِّر — التغييرات ستُحذف من مجلد العمل
    git reset --hard HEAD~1
  5. 5

    تراجع بأمان عن commit تم نشره مسبقًا

    لا تُعيد كتابة تاريخ تم push له على فرع مشترك. استخدم git revert بدلًا من ذلك، وهو ينشئ commit جديدًا يلغي التغييرات. يبقى التاريخ سليمًا ولا يتضرر زملاؤك.

    bash
    # ينشئ commit جديدًا يعكس محتوى HEAD
    git revert HEAD
    # لـ commit بـ SHA محدد:
    git revert a3f9c12
  6. 6

    صحّح خطأ إملائيًا في رسالة آخر commit

    إذا لم يُنشر الـ commit بعد، يُعيد git commit --amend كتابة آخر commit — الرسالة أو المؤلف أو حتى الملفات. يُنشئ SHA جديدًا، لذا لا تستخدمه أبدًا بعد الـ push.

    bash
    # تغيير الرسالة فقط
    git commit --amend -m "Fix login redirect on expired session"
    
    # فتح المحرر لتعديل نص الرسالة أيضًا
    git commit --amend
  7. 7

    استرجع ما أُزيل بـ --hard بالخطأ

    لا يحذف Git فورًا الـ commits التي لا يمكن الوصول إليها. استخدم git reflog للعثور على SHA الـ commit الضائع واستعادته خلال فترة السماح الافتراضية البالغة 90 يومًا.

    bash
    # قائمة بمواضع HEAD الأخيرة
    git reflog
    # مثال على الإخراج:
    # a3f9c12 HEAD@{0}: reset: moving to HEAD~1
    # 8b1d3e7 HEAD@{1}: commit: Add user profile page
    
    # العودة إلى الـ commit الذي فقدته
    git reset --hard 8b1d3e7

نصائح ومحاذير

  • استخدم <code>git reset --soft</code> عندما تكون قد أجريت commit مبكرًا وتريد إضافة المزيد من التغييرات لنفس الـ commit.
  • لا تستخدم <code>git reset --hard</code> أو <code>git push --force</code> على فرع يعمل عليه زملاؤك.
  • <code>git reflog</code> هو شبكة أمانك — يحتفظ بسجل كل تحرك لـ HEAD لمدة 90 يومًا افتراضيًا.
  • إذا أردت فقط إخراج ملف واحد من الـ staging دون المساس بالـ commit، استخدم <code>git restore --staged &lt;file&gt;</code>.

خاتمة

القاعدة الذهبية: إذا كان محليًا فأعد الضبط بحرية؛ إذا كان منشورًا فاستخدم revert بدلًا من ذلك. احتفظ بـ git reflog في جعبتك للحالات النادرة التي تسوء فيها عملية --hard. بهذه الأوامر الثلاثة — reset --soft وreset --hard وrevert — تستطيع التعامل مع كل سيناريو تراجع في Git.

#Git #Workflow
العودة إلى جميع الأدلة

هل تحتاج مساعدة في مشروعك؟

احجز استشارة مجانية لمدة 30 دقيقة لمناقشة تحدياتك التقنية واستكشاف الحلول معًا.