Reset — بازگرداندن شاخه به گذشته

بازگرداندن شاخه به کامیت قبلی با git reset و سه حالت soft، mixed و hard — و اینکه کی از کدام استفاده کنیم.

Reset چیست؟

git reset شاخه فعلی را به یک کامیت قبلی برمی‌گرداند — انگار کامیت‌های بعد از آن هرگز اتفاق نیفتاده‌اند. برخلاف revert که کامیت جدید می‌سازد، reset تاریخچه را جابه‌جا می‌کند.

سه حالت reset

تفاوت حالت‌ها در این است که با Staging Area و Working Directory چه می‌کنند:

حالتشاخهStagingفایل‌های شماکاربرد
--softبرمی‌گردددست‌نخوردهدست‌نخورده ✅بازکردن کامیت برای ویرایش پیام
--mixed (پیش‌فرض)برمی‌گرددخالی می‌شوددست‌نخورده ✅بازکردن کامیت + unstage
--hardبرمی‌گرددخالی می‌شود⚠️ تغییرات پاک می‌شوند!حذف کامل همه‌چیز

مثال عملی: سه حالت

فرض کنید ۳ کامیت دارید و می‌خواهید به کامیت اول برگردید:

git log --oneline
# c3c3c3c (HEAD -> main) کامیت سوم
# b2b2b2b کامیت دوم
# a1a1a1a کامیت اول

حالت soft — همه‌چیز در staging می‌ماند

git reset --soft a1a1a1a
git status
# Changes to be committed:
#   (تغییرات کامیت ۲ و ۳ اینجا هستند — آماده کامیت مجدد!)

مثل این است که کامیت‌های ۲ و ۳ را «باز» کرده‌اید — همه تغییرات stage شده‌اند.

حالت mixed (پیش‌فرض) — unstage می‌شوند

git reset --mixed a1a1a1a
# یا فقط: git reset a1a1a1a
git status
# Changes not staged for commit:
#   (تغییرات هست اما stage نیستند)

حالت hard — همه‌چیز پاک!

git reset --hard a1a1a1a
# HEAD is now at a1a1a1a کامیت اول
git status
# nothing to commit, working tree clean
حالت --hard تغییرات کامیت‌نشده working directory را هم برای همیشه پاک می‌کند! قبل از استفاده، مطمئن شوید یا اول stash کنید. کامیت‌های حذف‌شده معمولاً با reflog قابل بازیابی‌اند (مبحث ۳۷).

میان‌برهای رایج

# بازکردن آخرین کامیت (تغییرات در staging):
git reset --soft HEAD~1

# بازکردن + unstage:
git reset HEAD~1

# حذف کامل آخرین کامیت:
git reset --hard HEAD~1

# دو کامیت آخر:
git reset --hard HEAD~2

HEAD~1 یعنی «یک کامیت قبل از HEAD»، HEAD~2 یعنی دو کامیت قبل.

reset فقط برای staging هم هست!

یک کاربرد ساده‌تر: خارج کردن فایل از staging (بدون دست به تاریخچه):

git reset HEAD hello.txt
# Unstaged changes after reset:
#   hello.txt

معادل git restore --staged hello.txt در سینتکس جدید.

reset یا revert؟

وضعیتدستور درست
کامیت push شده (دیگران دیده‌اند)revert — reset تاریخچه مشترک را خراب می‌کند!
کامیت محلی، هنوز push نشدهreset آزادانه ✅
فقط می‌خواهم پیام/محتوای آخرین کامیت را اصلاح کنمreset --soft HEAD~1 یا commit --amend
همه‌چیز محلی را دور بریزم و مثل ریموت شروع کنمgit reset --hard origin/main

خلاصه

این مبحث بخشی از دوره آموزش کامل Git است.

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