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 است.

ابزارهای مرتبط