Reflog — ماشین زمان گیت
تاریخچه مخفی حرکات HEAD با git reflog — ابزار نجات وقتی فکر میکنید همهچیز از دست رفته!
خبر خوب: هیچچیز در گیت واقعاً گم نمیشود!
شما git reset --hard زدید و کامیتها «حذف» شدند؟ شاخه را با -D پاک کردید؟ rebase خراب شد؟ نگران نباشید — reflog اینجاست!
Reflog چیست؟
Reflog (Reference Log) یک تاریخچه مخفی است که هر جابهجایی HEAD را ثبت میکند — هر کامیت، هر switch، هر reset، هر merge... بهمدت حداقل ۹۰ روز!
reflog محلی و شخصی است — push نمیشود و دیگران آن را نمیبینند. فقط «کجاها بودهاید» را ثبت میکند.
دیدن reflog
git reflog
# e5f6g7h (HEAD -> main)@{0}: commit: افزودن فرم تماس
# a1b2c3d HEAD@{1}: reset: moving to a1b2c3d
# f6e5d4c HEAD@{2}: commit: کامیت اشتباه
# a1b2c3d HEAD@{3}: checkout: moving from feature to main
# ...
هر خط: شناسه کامیت + شماره حرکت + عملی که انجام شد
@{0} = آخرین حرکت، @{1} = یکی قبل، و الی آخر.
سناریوی نجات ۱: بعد از reset --hard
# کامیت مهمی داشتید و اشتباهاً:
git reset --hard HEAD~2
# دو کامیت "حذف" شد! 😱
# نجات با reflog:
git reflog
# a1b2c3d HEAD@{0}: reset: moving to HEAD~2
# e5f6g7h HEAD@{1}: commit: کامیت مهم من ← اینجاست!
# برگشت به آن:
git reset --hard e5f6g7h
# یا با سینتکس reflog:
git reset --hard HEAD@{1}
کامیتها برگشتند! 🎉
سناریوی نجات ۲: شاخه حذفشده
# شاخه را اجباری حذف کردید (merge نشده بود):
git branch -D important-work
# در reflog آخرین جای شاخه را پیدا کنید:
git reflog
# ... i9j0k1l HEAD@{5}: commit: آخرین کار روی important-work
# بازسازی شاخه از آن نقطه:
git branch important-work i9j0k1l
# شاخه با همه کامیتها برگشت!
سناریوی نجات ۳: بعد از rebase خراب
# rebase اشتباه انجام شد و میخواهید قبلش برگردید:
git reflog
# ... f6e5d4c HEAD@{3}: rebase (start) ← قبل از شروع rebase
git reset --hard f6e5d4c
# همهچیز به قبل از rebase برگشت
جستجو در reflog
# جستجوی عملیات خاص:
git reflog --grep=rebase
# reflog یک شاخه خاص:
git reflog show feature
# با تاریخ (مثلاً ۱ روز پیش):
git log -g --since="2 days ago"
محدودیتهای reflog
- فقط محلی است — روی سیستم دیگران نیست
- بعد از ~۹۰ روز پاک میشود (قابل تنظیم)
- اگر مخزن حذف شود (پوشه .git)، reflog هم میرود
- کامیتهای «unreachable» در نهایت توسط gc پاک میشوند — پس سریع عمل کنید!
خلاصه
- reflog = تاریخچه مخفی همه حرکات HEAD (حداقل ۹۰ روز)
git reflogببینید کجاها بودهاید- با
git reset --hard <شناسه>به هر نقطه برگردید - شاخه حذفشده =
git branch <نام> <شناسه> - قبل از هر عمل خطرناک، reflog را چک کنید!
این مبحث بخشی از دوره آموزش کامل Git است.