السؤال الأول دايمًا: الغلطة فين؟ في ملف لسه متعملوش 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 يعني تلاتة.
آمنين. الشغل مش بيروح، بس بيرجع مش متسجل في commit. مفيد لو عايز تقسّم commit كبير لـ commits أصغر.
بيرمي الشغل اللي في الملفات. الـ 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 أو rebase | git reflog |