مقدمه

اشتباه کردن بخشی از فرآیند توسعه نرم‌افزار است. ممکن است یک کامیت را زودتر از موعد ثبت کنید، فایلی را فراموش کنید اضافه کنید، در پیام کامیت غلط املایی داشته باشید، یا حتی متوجه شوید کامیتی که ثبت کرده‌اید یک باگ بزرگ ایجاد می‌کند. گیت ابزارهای متعددی برای اصلاح این اشتباهات در اختیار شما قرار می‌دهد.

مهم‌ترین نکته در انتخاب ابزار مناسب، درک این موضوع است که آیا آن دستور تاریخچه را بازنویسی می‌کند یا خیر. بازنویسی تاریخچه‌ای که با دیگران به اشتراک گذاشته شده (push شده)، می‌تواند مشکلات بزرگی برای تیم ایجاد کند. در این درس با سه روش اصلی برای لغو تغییرات آشنا می‌شویم: git commit --amend، git revert و git reset.

روش اول: اصلاح آخرین کامیت با git commit --amend

این دستور برای اصلاح اشتباهات کوچک در آخرین کامیتی که ثبت کرده‌اید، بسیار کارآمد است. فرض کنید به تازگی کامیتی را ثبت کرده‌اید و بلافاصله متوجه می‌شوید که یک فایل را از قلم انداخته‌اید یا پیام کامیت را اشتباه نوشته‌اید.

برای اضافه کردن فایل فراموش‌شده، کافیست آن را با git add به Staging Area اضافه کنید و سپس دستور زیر را اجرا نمایید:

git commit --amend

این دستور یک کامیت جدید ایجاد نمی‌کند، بلکه محتویات Staging Area را با محتویات کامیت قبلی ترکیب کرده و یک کامیت جدید جایگزین کامیت قبلی می‌کند. اگر هیچ فایلی را stage نکرده باشید، اجرای این دستور فقط ویرایشگر متن را باز می‌کند تا پیام آخرین کامیت را ویرایش کنید.

قانون طلایی: از آنجایی که git commit --amend تاریخچه را بازنویسی می‌کند (کامیت قبلی را حذف و یک کامیت جدید به جای آن می‌گذارد)، هرگز نباید از آن برای کامیت‌هایی که قبلاً به یک مخزن عمومی push کرده‌اید، استفاده کنید. این دستور فقط برای اصلاح کامیت‌های محلی که هنوز با کسی به اشتراک نگذاشته‌اید، امن است.

روش دوم: خنثی کردن یک کامیت با git revert

دستور git revert روش امن برای لغو تغییرات یک کامیت است، به خصوص کامیت‌هایی که قبلاً push شده‌اند. این دستور تاریخچه را بازنویسی نمی‌کند.

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

برای استفاده از آن، هش کامیت مورد نظر را به دستور بدهید:

git revert a1b2c3d

با اجرای این دستور، گیت یک کامیت جدید ایجاد می‌کند و ویرایشگر را باز می‌کند تا شما پیام این کامیت جدید (کامیتِ خنثی‌کننده) را تایید یا ویرایش کنید. این روش برای همکاری تیمی ایده‌آل است زیرا هیچ تداخلی در تاریخچه همکاران شما ایجاد نمی‌کند.

روش سوم: بازگشت به عقب با git reset (یک ابزار خطرناک)

دستور git reset یکی از قدرتمندترین و در عین حال خطرناک‌ترین دستورات گیت است. این دستور می‌تواند اشاره‌گر برنچ (و به دنبال آن HEAD) را به یک کامیت قدیمی‌تر منتقل کند و عملاً کامیت‌های بعد از آن را از تاریخچه حذف کند. این دستور تاریخچه را به شدت بازنویسی می‌کند.

برای مثال، اگر بخواهید آخرین کامیت را به طور کامل حذف کنید (انگار هرگز وجود نداشته)، می‌توانید از دستور زیر استفاده کنید:

git reset --hard HEAD~1

در این دستور، HEAD~1 به کامیت یکی مانده به آخر اشاره دارد. آپشن --hard بسیار خطرناک است، زیرا نه تنها کامیت را از تاریخچه حذف می‌کند، بلکه تمام تغییرات مربوط به آن را از Staging Area و پوشه کاری (Working Directory) شما نیز پاک می‌کند. این تغییرات قابل بازیابی نخواهند بود.

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