التصليح · فصل ٦

ترجع في أي غلطة

restore · amend · reset soft/mixed/hard · revert · reflog
🎯 الهدف: تختار الأمر الصح للرجوع حسب الغلطة حصلت فين، ومتخافش من Git.

السؤال الأول دايمًا: الغلطة فين؟ في ملف لسه متعملوش commit؟ في آخر commit؟ في commit اترفع وزمايلك سحبوه؟ كل حالة ليها أمر.

قبل الـ push، تقدر تعيد كتابة التاريخ براحتك. بعد الـ push على branch مشترك، متمسحش، اعمل commit بيعكس الغلطة.

ملف لسه متعملوش commit

git restore cart.tsx            # ارمي التعديلات اللي في الملف وارجع لآخر commitgit restore --staged cart.tsx   # طلّعه من الـ staging، والتعديلات تفضل في الملف

آخر commit فيه غلطة صغيرة

نسيت ملف، أو الرسالة غلط:

git add forgotten-file.tsgit commit --amend              # ضيف للـ commit الأخير، وعدّل الرسالة لو عايزgit commit --amend --no-edit    # ضيف من غير ما تغيّر الرسالة

الـ amend بيعمل commit جديد بـ hash جديد مكان الأخير. فقبل الـ push بس.

git reset: رجّع الـ branch لورا

reset بيرجّع الـ branch لـ commit قديم. السؤال هو: التعديلات اللي كانت في الـ commits اللي اتشالت تروح فين؟

git reset --soft HEAD~1    # شيل آخر commit، والتعديلات تفضل في الـ staginggit reset HEAD~1           # (--mixed، الافتراضي) والتعديلات تفضل في الملفات بسgit reset --hard HEAD~1    # شيل آخر commit، وارمي التعديلات خالص

HEAD~1 يعني commit واحد قبل الـ HEAD. HEAD~3 يعني تلاتة.

--soft و --mixed

آمنين. الشغل مش بيروح، بس بيرجع مش متسجل في commit. مفيد لو عايز تقسّم commit كبير لـ commits أصغر.

--hard

بيرمي الشغل اللي في الملفات. الـ commits اللي اتشالت تقدر ترجعها بـ reflog، لكن التعديلات اللي مكانتش في commit راحت.

git revert: لـ commit اترفع خلاص

لو الـ commit الغلط اترفع على main وزمايلك سحبوه، متعملش reset، لأن ده بيعيد كتابة التاريخ زي الـ rebase بالظبط. اعمل revert:

git revert a3f9c21

ده بيعمل commit جديد بيعكس تعديلات a3f9c21. التاريخ مبيتمسحش منه حاجة، والكل يقدر يعمل pull عادي.

git reflog: شبكة الأمان

Git بيسجل كل مرة الـ HEAD اتحرك فيها: كل commit، و switch، و reset، و rebase. حتى الـ commits اللي “ضاعت” بعد reset أو rebase بتفضل موجودة فترة (الافتراضي حوالي 90 يوم).

git reflog# a3f9c21 HEAD@{0}: reset: moving to HEAD~3# 9e8d7c6 HEAD@{1}: commit: Add quantity limit# 5f4e3d2 HEAD@{2}: commit: Add cart page

عملت reset --hard غلط؟ ارجع للنقطة اللي قبله:

git reset --hard 9e8d7c6# أو اعمل branch عليها تبص عليها الأولgit switch -c rescue 9e8d7c6

أي أمر أستخدم؟

الحالةالأمر
ملف متعملوش add وعايز ترميهgit restore file
ملف في الـ staging وعايز تطلّعهgit restore --staged file
نسيت حاجة في آخر commit (لسه متعملوش push)git commit --amend
عايز تفك آخر commit وتحتفظ بالشغلgit reset HEAD~1
commit اترفع على branch مشتركgit revert <hash>
ضيعت commits بعد reset أو rebasegit reflog

خلّصت الفصل لما

🧠 اختبر نفسك
١) commit غلط اترفع على main وزمايلك سحبوه. reset ولا revert؟
revert، لأنه بيعمل commit جديد ومش بيعيد كتابة التاريخ.
٢) عايز تقسّم آخر commit لاتنين. تعمل إيه؟
git reset HEAD~1، فالتعديلات ترجع للملفات، وبعدين تعمل add و commit مرتين.
٣) عملت reset --hard ورجعت 3 commits بالغلط. ضاعوا؟
لا. git reflog هيوريك الـ hash اللي كنت عليه، وترجعله بـ reset —hard أو تعمل عليه branch.