الخطوات
-
1
افهم وضعك أولًا
قبل تشغيل أي أمر، تحقق مما إذا كان الـ commit قد تم push له. إذا كان موجودًا في مستودعك المحلي فقط، يمكنك إعادة كتابة التاريخ بحرية. أما إذا تم push له إلى فرع مشترك، فستتعارض إعادة الكتابة مع نسخ الآخرين.
bash# تحقق هل الفرع المحلي متقدم على الـ remote git status # أو افحص السجل git log --oneline -5 -
2
تراجع عن commit غير منشور مع الاحتفاظ بالتغييرات
استخدم
git reset --soft HEAD~1. يعيد هذا الأمر مؤشر الفرع خطوة للخلف لكن يُبقي جميع التغييرات في منطقة الـ staging جاهزةً لإعادة الـ commit. لا شيء يُفقد — الفرق لا يزال في الـ index.bashgit reset --soft HEAD~1 # تغييراتك لا تزال في منطقة الـ staging git status -
3
تراجع عن commit غير منشور مع إبقاء التغييرات خارج الـ staging
الخيار الافتراضي
--mixedيعيد المؤشر للخلف ويُخرج التغييرات من الـ staging، لكن يُبقيها في مجلد العمل. مناسب عندما تريد تقسيم الـ diff وإضافة أجزاء منه فقط.bashgit reset HEAD~1 # يعادل: git reset --mixed HEAD~1 # التغييرات موجودة في مجلد العمل لكن خارج الـ staging -
4
تراجع عن commit غير منشور وامسح التغييرات نهائيًا
تحذير: هذا الأمر مدمِّر.
git reset --hard HEAD~1يعيد المؤشر للخلف ويحذف جميع التغييرات من الـ index ومجلد العمل. لا يوجد Ctrl-Z بعدها — إلا من خلالgit reflog(مشروح أدناه).bash# مدمِّر — التغييرات ستُحذف من مجلد العمل git reset --hard HEAD~1 -
5
تراجع بأمان عن commit تم نشره مسبقًا
لا تُعيد كتابة تاريخ تم push له على فرع مشترك. استخدم
git revertبدلًا من ذلك، وهو ينشئ commit جديدًا يلغي التغييرات. يبقى التاريخ سليمًا ولا يتضرر زملاؤك.bash# ينشئ commit جديدًا يعكس محتوى HEAD git revert HEAD # لـ commit بـ SHA محدد: git revert a3f9c12 -
6
صحّح خطأ إملائيًا في رسالة آخر commit
إذا لم يُنشر الـ commit بعد، يُعيد
git commit --amendكتابة آخر commit — الرسالة أو المؤلف أو حتى الملفات. يُنشئ SHA جديدًا، لذا لا تستخدمه أبدًا بعد الـ push.bash# تغيير الرسالة فقط git commit --amend -m "Fix login redirect on expired session" # فتح المحرر لتعديل نص الرسالة أيضًا git commit --amend -
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 <file></code>.
خاتمة
القاعدة الذهبية: إذا كان محليًا فأعد الضبط بحرية؛ إذا كان منشورًا فاستخدم revert بدلًا من ذلك. احتفظ بـ git reflog في جعبتك للحالات النادرة التي تسوء فيها عملية --hard. بهذه الأوامر الثلاثة — reset --soft وreset --hard وrevert — تستطيع التعامل مع كل سيناريو تراجع في Git.