مقدمه

دستور git reset یکی از پرکاربردترین، قدرتمندترین و در عین حال، خطرناک‌ترین دستورات در جعبه ابزار گیت است. کار اصلی این دستور، بازگرداندن وضعیت پروژه به یک کامیت قدیمی‌تر است. برخلاف git revert که با ایجاد یک کامیت جدید تغییرات را خنثی می‌کند، git reset تاریخچه را مستقیماً دستکاری و بازنویسی می‌کند و کامیت‌ها را به طور کامل از بین می‌برد.

درک عمیق این دستور و تفاوت حالت‌های مختلف آن برای جلوگیری از، از دست دادن ناخواسته کد، ضروری است. قانون طلایی کار با گیت در مورد این دستور بیش از هر جای دیگری صدق می‌کند: هرگز از git reset برای کامیت‌هایی که قبلاً به مخزن عمومی push کرده‌اید، استفاده نکنید.

سه حالت اصلی Reset

دستور git reset اشاره‌گر HEAD (و به دنبال آن، برنچ فعلی) را به یک کامیت مشخص منتقل می‌کند. اما تفاوت اصلی در سه حالت (mode) آن است که تعیین می‌کنند با Staging Area و Working Directory شما چه برخوردی شود.

۱. حالت --soft

این ملایم‌ترین حالت reset است. این دستور فقط اشاره‌گر HEAD را به عقب منتقل می‌کند و هیچ تغییری در Staging Area و Working Directory شما ایجاد نمی‌کند.

git reset --soft HEAD~1

نتیجه اجرای این دستور این است که کامیتی که به آن بازگشته‌اید از تاریخچه حذف شده، اما تمام تغییرات مربوط به آن کامیت، حالا در Staging Area شما قرار دارند (انگار همین الان آن‌ها را add کرده‌اید). این حالت برای زمانی که می‌خواهید چندین کامیت آخر را در هم فشرده (squash) و به صورت یک کامیت واحد ثبت کنید، بسیار مفید است.

۲. حالت --mixed (حالت پیش‌فرض)

این حالت، رفتار پیش‌فرض git reset است (اگر هیچ حالتی را مشخص نکنید، از این حالت استفاده می‌شود). --mixed علاوه بر انتقال HEAD، محتویات Staging Area را نیز پاک می‌کند (unstage می‌کند).

git reset --mixed HEAD~1

نتیجه این است که تغییرات کامیت حذف‌شده، اکنون به صورت تغییرات کامیت‌نشده و آماده برای stage شدن در Working Directory شما قرار دارند. این حالت عملاً معادل «لغو کردن یک کامیت» (uncommit) است و برای زمانی که می‌خواهید تغییرات یک کامیت را مجدداً بررسی و اصلاح کرده و سپس به شکل دیگری کامیت کنید، عالی است.

۳. حالت --hard (حالت خطرناک)

این قدرتمندترین و مخرب‌ترین حالت reset است. این دستور علاوه بر انتقال HEAD و پاک کردن Staging Area، تمام تغییرات را از Working Directory شما نیز پاک می‌کند.

git reset --hard HEAD~1

نتیجه اجرای این دستور این است که شما کامیت‌های اخیر را به طور کامل از دست می‌دهید، انگار که هرگز وجود نداشته‌اند. فایل‌های شما در سیستم دقیقاً به وضعیت کامیتی که به آن بازگشته‌اید، برمی‌گردند. این تغییرات غیرقابل بازگشت هستند. از این دستور فقط زمانی استفاده کنید که ۱۰۰٪ مطمئن هستید می‌خواهید تمام کارهای اخیر خود را دور بریزید.