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 |
خلاصه
- reset شاخه را به گذشته برمیگرداند (تاریخچه جابهجا میشود)
--soft: فقط شاخه؛--mixed: + unstage؛--hard: + پاک کردن فایلهاHEAD~1= یک کامیت قبل- push کردهاید؟ revert کنید نه reset!
این مبحث بخشی از دوره آموزش کامل Git است.