بازیابی — راهنمای نجات در موقعیتهای سخت
جمعبندی عملی همه ابزارهای undo: برگرداندن فایل، شاخه، کامیت و حتی مخزن — دفترچه اضطراری شما.
دفترچه اضطراری گیت 🚨
در این مبحث همه ابزارهای بازیابی که یاد گرفتید را در یک مرجع عملی جمع میکنیم — برای روزی که به آن نیاز دارید!
۱. برگرداندن تغییرات یک فایل (هنوز کامیت نشده)
# برگشت فایل به آخرین کامیت (تغییرات پاک میشوند!):
git restore hello.txt
# همه فایلها:
git restore .
# سینتکس قدیمی:
git checkout -- hello.txt
تغییرات کامیتنشده بعد از restore قابل بازیابی نیستند — گیت آنها را هرگز نداشته است!
۲. خارج کردن فایل از staging
git restore --staged hello.txt
# همه:
git restore --staged .
۳. برگرداندن یک فایل از کامیت قدیمی
# نسخه فایل از ۳ کامیت قبل:
git restore --source HEAD~3 hello.txt
# یا از یک شاخه:
git restore --source main -- hello.txt
۴. بازکردن آخرین کامیت
# ویرایش پیام/محتوا:
git commit --amend
# بازکردن کامل (تغییرات در staging):
git reset --soft HEAD~1
۵. حذف کامیتهای محلی (push نشده)
# حذف کامل ۲ کامیت آخر:
git reset --hard HEAD~2
# حذف اما حفظ تغییرات در working dir:
git reset HEAD~2
۶. خنثی کردن کامیت push شده
# امن برای تیم — کامیت معکوس جدید:
git revert HEAD
git push
۷. بازیابی شاخه حذفشده
# پیدا کردن آخرین کامیت شاخه:
git reflog
# ... i9j0k1l HEAD@{7}: commit: روی شاخه حذفشده
# بازسازی:
git branch my-branch i9j0k1l
۸. همگام شدن با ریموت (دور ریختن محلی)
# محلی = ریموت (همه تغییرات محلی main پاک میشوند):
git fetch origin
git reset --hard origin/main
# پاکسازی فایلهای untracked هم:
git clean -fd
# (اول با -n پیشنمایش بگیرید: git clean -nd)
۹. گیر کردن در وسط merge/rebase
# فرار از merge:
git merge --abort
# فرار از rebase:
git rebase --abort
۱۰. stash گم شده!
# لیست همه stash ها:
git stash list
# دیدن محتوای هر کدام:
git stash show -p stash@{2}
# برگرداندن:
git stash apply stash@{2}
جدول مرجع سریع
| مشکل | دستور نجات |
|---|---|
| تغییرات فایل کامیتنشده پاک شد | ❌ قابل بازیابی نیست — درس: زود کامیت کنید! |
| کامیت اشتباه (محلی) | reset --soft HEAD~1 |
| کامیت اشتباه (push شده) | git revert HEAD |
| reset --hard اشتباه | git reflog → reset --hard <id> |
| شاخه حذفشده | reflog → git branch <نام> <id> |
| merge/rebase گیر کرده | --abort |
| محلی با ریموت ناسازگار | reset --hard origin/main |
درسهای پیشگیری
- زود و کوچک کامیت کنید — هرچیز کامیتشده تقریباً همیشه قابل بازیابی است
- قبل از عمل خطرناک (reset/rebase)، شاخه پشتیبان بسازید:
git branch backup-point - مرتب push کنید — ریموت پشتیبان شماست
- از stash با پیام استفاده کنید تا گم نشود
- قبل از --hard نفس عمیق بکشید! 😊
خلاصه
- تقریباً هر فاجعهای در گیت راهحل دارد — reflog بهترین دوست شماست
- تنها چیز غیرقابلبازیابی: تغییرات کامیتنشده پاکشده
- پیشگیری: کامیت کوچک و مکرر + push مرتب + شاخه پشتیبان
این مبحث بخشی از دوره آموزش کامل Git است.