بازگردانی و حذف آخرین کامیت در گیت (راهنمای کامل)
🔄 بازگردانی و حذف آخرین کامیت در گیت (راهنمای کامل)
مقدمه: وقتی از کامیت خود پشیمان میشویم
ویدئوی آموزشی
برای مشاهده آموزش تصویری و گامبهگام این مبحث، ویدئوی زیر را مشاهده کنید:
حتماً برایتان پیش آمده که پس از اجرای دستور git commit، ناگهان متوجه اشتباهی میشوید. شاید یک فایل اشتباهی را به کامیت اضافه کردهاید، یا بدتر از آن، اطلاعات حساسی مانند رمز عبور، کلیدهای API یا تنظیمات محیطی را در کامیت خود قرار دادهاید.
در چنین مواقعی، اولین سوالی که به ذهن میرسد این است:
«آیا راهی برای بازگردانی آخرین کامیت و برگرداندن تغییرات به حالت قبل وجود دارد؟»
خوشبختانه پاسخ بله است. در این مقاله، به طور کامل و قدمبهقدم با روشهای بازگردانی آخرین کامیت در گیت آشنا میشویم.
سناریوهای رایج برای بازگردانی کامیت
پیش از آنکه به سراغ دستورات برویم، بیایید ببینیم معمولاً در چه شرایطی نیاز به بازگردانی آخرین کامیت پیدا میکنیم:
سناریو | توضیح |
|---|---|
افزودن فایل اشتباه | فایلی را کامیت کردهاید که نباید بخشی از کامیت میبود |
اطلاعات حساس | پسورد، توکن، یا کلیدهای API در کد جا مانده است |
کامیت ناقص | تغییرات کامل نشده و نیاز به ادامه کار دارید |
پیام کامیت اشتباه | توضیحات کامیت را اشتباه نوشتهاید |
تغییرات اضافی | تغییراتی را کامیت کردهاید که نباید انجام میشد |
روش اول: بازگردانی به حالت استیج (Soft Reset)
اگر میخواهید آخرین کامیت را بازگردانی کنید ولی تغییرات را حفظ کنید، از دستور soft reset استفاده میکنیم.
bash
git reset --soft HEAD~1
این دستور چه کاری انجام میدهد؟
- آخرین کامیت را از تاریخچه حذف میکند
- تمام تغییرات آن کامیت را به حالت استیج (Staged) برمیگرداند
- یعنی فایلها همچنان در منطقه استیج باقی میمانند و میتوانید آنها را اصلاح کنید و دوباره کامیت بزنید
مثال کاربردی:
فرض کنید سه فایل را کامیت کردهاید، اما بعد متوجه میشوید که یکی از فایلها نباید در این کامیت میبود.
bash
# مشاهده وضعیت فعلی
git log --oneline
# بازگردانی آخرین کامیت
git reset --soft HEAD~1
# حالا فایلها در حالت استیج هستند
git status
# فایل اشتباه را از استیج خارج کنید
git reset HEAD filename.txt
# دوباره کامیت بزنید
git commit -m "Commit with correct files"روش دوم: بازگردانی کامل (Hard Reset)
اگر میخواهید آخرین کامیت را به طور کامل حذف کنید و تغییرات را نیز از دست بدهید، از دستور hard reset استفاده میکنیم.
bash
git reset --hard HEAD~1
توجه: این دستور تمام تغییرات آخرین کامیت را به طور کامل از بین میبرد و قابل بازگشت نیست. پس با احتیاط از آن استفاده کنید.
روش سوم: بازگردانی با حفظ تغییرات (Mixed Reset)
دستور mixed reset به طور پیشفرض در گیت استفاده میشود و تغییرات را به حالت Unstaged برمیگرداند.
bash
git reset --mixed HEAD~1
# یا به صورت مخفف:
git reset HEAD~1
تفاوت با Soft Reset:
نوع Reset | تغییرات در استیج | تغییرات در Working Directory |
|---|---|---|
| باقی میماند | باقی میماند |
| حذف میشود | باقی میماند |
| حذف میشود | حذف میشود |
عدد 1 در HEAD~1 یعنی چه؟
حتماً برایتان سوال پیش آمده که چرا از ~1 استفاده میکنیم و این عدد چه معنایی دارد.
bash
git reset --soft HEAD~1
توضیح کامل:
HEADاشارهگر به آخرین کامیتی است که روی آن قرار دارید~نمادی برای "برگشت به عقب" یا "نسل قبلی" است- عدد
1یعنی یک قدم به عقب برو
پس HEAD~1 یعنی یک کامیت قبل از آخرین کامیت یا به عبارت دیگر، آخرین کامیت را هدف قرار بده.
مثالهای بیشتر:
دستور | معنی |
|---|---|
| یک کامیت به عقب (همان آخرین کامیت) |
| دو کامیت به عقب |
| سه کامیت به عقب |
| پنج کامیت به عقب |
اگر کامیت را به سرور آنلاین پوش کردهایم، چه؟
یکی از سوالات رایج این است که اگر کامیت را روی ریموت (مانند گیتهاب، گیتلب یا بیتباکت) پوش کرده باشیم، چه اتفاقی میافتد؟
خوشبختانه، امکان بازگردانی کامیت از روی ریموت نیز وجود دارد.
مراحل:
- ابتدا کامیت را به صورت لوکال بازگردانی کنید:
bash
git reset --soft HEAD~1
- سپس تغییرات را با اعمال-force روی ریموت آپدیت کنید:
bash
git push --force-with-lease
تفاوت بین --force و --force-with-lease
دستور | توضیح | خطر |
|---|---|---|
| تغییرات را بدون هیچ بررسی اعمال میکند | 🔴 خطرناک: ممکن است تغییرات دیگران را از بین ببرد |
| قبل از اعمال، بررسی میکند که شخص دیگری روی برنچ تغییراتی نداده باشد | 🟢 ایمنتر: از بروز تداخل جلوگیری میکند |
توصیه: همیشه از --force-with-lease استفاده کنید تا از بروز مشکلات جدی جلوگیری شود.
سناریوی کامل: بازگردانی کامیت پوش شده به گیتهاب
فرض کنید یک کامیت شامل اطلاعات حساس را به گیتهاب پوش کردهاید. برای رفع این مشکل، مراحل زیر را دنبال کنید:
bash
# 1. آخرین کامیت را به حالت استیج برگردانید
git reset --soft HEAD~1
# 2. فایلهای حساس را از استیج خارج کنید
git reset HEAD sensitive-file.txt
# 3. تغییرات را اصلاح کنید (فایل حساس را ویرایش کنید)
# 4. دوباره فایلها را به استیج اضافه کنید
git add .
# 5. کامیت جدید با پیام مناسب
git commit -m "Remove sensitive information"
# 6. اعمال-force روی ریموت
git push --force-with-lease
نکات امنیتی مهم
- اگر اطلاعات حساسی (مانند پسورد) را پوش کردهاید:
- علاوه بر حذف از تاریخچه، آن اطلاعات را بلافاصله تغییر دهید
- در گیتهاب، توکنها و کلیدهای API را ریووک کنید
- علاوه بر حذف از تاریخچه، آن اطلاعات را بلافاصله تغییر دهید
- اگر دیگران روی برنچ کار میکنند:
- از
--force-with-leaseاستفاده کنید - با تیم خود هماهنگ کنید تا تغییرات را دوباره pull کنند
- از
- پشتیبانگیری:
- قبل از انجام
reset --hard، از تغییرات خود پشتیبان بگیرید
- قبل از انجام
جمعبندی سریع دستورات
دستور | کاربرد |
|---|---|
| بازگردانی کامیت، حفظ تغییرات در استیج |
| بازگردانی کامیت، خارج کردن تغییرات از استیج |
| بازگردانی کامل کامیت و حذف تغییرات |
| اعمال-force امن روی ریموت |