جزئیات پست

بازگردانی و حذف آخرین کامیت در گیت (راهنمای کامل)

🔄 بازگردانی و حذف آخرین کامیت در گیت (راهنمای کامل)


مقدمه: وقتی از کامیت خود پشیمان می‌شویم

 

ویدئوی آموزشی

برای مشاهده آموزش تصویری و گام‌به‌گام این مبحث، ویدئوی زیر را مشاهده کنید:

 

 

 

حتماً برایتان پیش آمده که پس از اجرای دستور 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

--soft

باقی می‌ماند

باقی می‌ماند

--mixed

حذف می‌شود

باقی می‌ماند

--hard

حذف می‌شود

حذف می‌شود


عدد 1 در HEAD~1 یعنی چه؟

حتماً برایتان سوال پیش آمده که چرا از ~1 استفاده می‌کنیم و این عدد چه معنایی دارد.

bash

git reset --soft HEAD~1

توضیح کامل:

  • HEAD اشاره‌گر به آخرین کامیتی است که روی آن قرار دارید
  • ~ نمادی برای "برگشت به عقب" یا "نسل قبلی" است
  • عدد 1 یعنی یک قدم به عقب برو

پس HEAD~1 یعنی یک کامیت قبل از آخرین کامیت یا به عبارت دیگر، آخرین کامیت را هدف قرار بده.

مثال‌های بیشتر:

دستور

معنی

HEAD~1

یک کامیت به عقب (همان آخرین کامیت)

HEAD~2

دو کامیت به عقب

HEAD~3

سه کامیت به عقب

HEAD~5

پنج کامیت به عقب

اگر کامیت را به سرور آنلاین پوش کرده‌ایم، چه؟

یکی از سوالات رایج این است که اگر کامیت را روی ریموت (مانند گیت‌هاب، گیت‌لب یا بیت‌باکت) پوش کرده باشیم، چه اتفاقی می‌افتد؟

خوشبختانه، امکان بازگردانی کامیت از روی ریموت نیز وجود دارد.

مراحل:

  1. ابتدا کامیت را به صورت لوکال بازگردانی کنید:

bash

git reset --soft HEAD~1
  1. سپس تغییرات را با اعمال-force روی ریموت آپدیت کنید:

bash

git push --force-with-lease
size=1 width="100%" align=center>

تفاوت بین --force و --force-with-lease

دستور

توضیح

خطر

git push --force

تغییرات را بدون هیچ بررسی اعمال می‌کند

🔴 خطرناک: ممکن است تغییرات دیگران را از بین ببرد

git push --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

نکات امنیتی مهم

  1. اگر اطلاعات حساسی (مانند پسورد) را پوش کرده‌اید:
    • علاوه بر حذف از تاریخچه، آن اطلاعات را بلافاصله تغییر دهید
    • در گیت‌هاب، توکن‌ها و کلیدهای API را ریووک کنید
  2. اگر دیگران روی برنچ کار می‌کنند:
    • از --force-with-lease استفاده کنید
    • با تیم خود هماهنگ کنید تا تغییرات را دوباره pull کنند
  3. پشتیبان‌گیری:
    • قبل از انجام reset --hard، از تغییرات خود پشتیبان بگیرید

جمع‌بندی سریع دستورات

دستور

کاربرد

git reset --soft HEAD~1

بازگردانی کامیت، حفظ تغییرات در استیج

git reset --mixed HEAD~1

بازگردانی کامیت، خارج کردن تغییرات از استیج

git reset --hard HEAD~1

بازگردانی کامل کامیت و حذف تغییرات

git push --force-with-lease

اعمال-force امن روی ریموت