بازنشانی تغییرات
پیشنمایش دستور
استفاده
git reset [گزینهها] [<کامیت>]
Git Reset چیست؟
Git reset شاخه فعلی را به یک commit مشخص منتقل میکند و میتواند index و working directory را تغییر دهد. معمولاً برای undo کردن کامیتها، unstaging تغییرات یا بازگشت به یک وضعیت قبلی استفاده میشود.
موارد کاربرد رایج
- بازگشت به آخرین commit بدون از دست دادن تغییرات در working directory.
- Unstage کردن تغییرات از staging area.
- حذف تغییرات uncommitted و بازنشانی working directory و index به یک commit مشخص.
- اصلاح اشتباهات ناشی از merge commit با بازنشانی به وضعیت قبل از merge.
مثالها
# Reset staging area only (soft reset) git reset --soft HEAD~1 # Reset staging and working directory (mixed reset, default) git reset HEAD~1 # Reset everything including working directory (hard reset) git reset --hard HEAD~1 # Unstage a specific file git reset HEAD file.txt # Reset to a specific commit by hash git reset --hard abc1234
دقیقاً چه میکند؟
Git reset تاریخچه شاخه فعلی را تغییر میدهد و اشاره HEAD را به commit خاصی منتقل میکند، یا تغییرات staging area را unstage میکند. بسته به گزینههای انتخابی، میتواند working directory، index یا هر دو را تغییر دهد.
مقایسه با git merge
در حالی که merge یک شاخه دیگر را به شاخه فعلی اضافه میکند، reset اشاره HEAD را جابهجا میکند و عملاً کامیتها یا تغییرات را undo میکند. Merge تاریخچه را حفظ میکند؛ reset میتواند تاریخچه را بازنویسی کند.
مقایسه: Reset در مقابل Merge
| ویژگی | Git Reset | Git Merge |
|---|---|---|
| هدف | کامیتها یا تغییرات را با جابهجایی اشاره HEAD undo میکند. | تغییرات یک شاخه دیگر را به شاخه فعلی اضافه میکند. |
| تأثیر بر تاریخچه | میتواند تاریخچه کامیتها را بازنویسی کند (بهویژه با --hard یا --soft). |
تاریخچه را حفظ میکند؛ تاریخچه بازنویسی نمیشود. |
| تغییرات اعمالشده | میتواند تغییرات در working directory، staging area، یا هر دو را تغییر دهد. | تغییرات یک شاخه دیگر را به شاخه فعلی ادغام میکند. |
| چه زمانی استفاده شود | زمانی که بخواهید تغییرات را undo، unstaged کنید یا تغییرات را حذف کنید. | زمانی که بخواهید تغییرات چندین شاخه را ترکیب کنید. |
| قابلیت برگشت | در صورتی که از hard reset استفاده شود، میتواند دائمی باشد، بنابراین باید با دقت استفاده شود. | کامیتهای merge را میتوان با استفاده از git revert برگرداند، اما خود merge را نمیتوان بهطور مستقیم undo کرد. |
به زبان ساده
Git reset مانند دکمه 'لغو است. این ابزار به شما امکان میدهد تغییرات تاریخچه خود را برگشت دهید، فایلها را unstage کنید یا حتی تغییرات uncommitted را حذف کنید. میتوانید به یک commit خاص بازنشانی کنید تا تغییرات ناخواسته را حذف کنید.
اشتباهات رایج
- استفاده از hard reset بدون درک اینکه این کار تغییرات uncommitted را بهطور دائمی حذف میکند.
- فراموش کردن اینکه reset میتواند تاریخچه را بازنویسی کند، که ممکن است بر روی مخازن اشتراکی تاثیر بگذارد.
- Reset کردن merge commits بدون درک کامل تأثیر آن بر تاریخچه شاخه.
بهترین شیوهها
- قبل از انجام reset، هاش یا مرجع commit را دوباره بررسی کنید تا از دست دادن کارهای مهم جلوگیری کنید.
- اگر فقط نیاز دارید تغییرات را unstaged کنید یا یک commit را به عقب برگردانید، از git reset --soft استفاده کنید.
- فقط زمانی از git reset --hard استفاده کنید که مطمئن باشید میخواهید تمام تغییرات را حذف کنید.
- برای یک reset تمیزتر، از git reset --keep استفاده کنید تا از بازنویسی تغییرات محلی جلوگیری کنید.
محدودیتها
- Hard reset تغییرات uncommitted را بهطور دائمی حذف میکند.
- کامیتهای push شده به remote بدون force push قابل reset نیستند.
- Soft reset هیچ تغییری در working directory ایجاد نمیکند، بنابراین ممکن است تغییرات در فایلها باقی بمانند.
- Reset کردن merge commits میتواند پیچیده باشد و ممکن است منجر به نتایج غیرمنتظره شود اگر به درستی مدیریت نشود.
نحوه استفاده
Git reset میتواند با گزینههای مختلفی استفاده شود، بسته به اینکه آیا فقط staging area، working directory یا هر دو را میخواهید reset کنید. همچنین میتوانید برای unstage کردن فایلها یا بازگشت به یک commit خاص از آن استفاده کنید.
نمای کلی
Git reset یک ابزار قدرتمند است که به شما کمک میکند تاریخچه commitها و working directory خود را مدیریت کنید. چه بخواهید commitها را بازگردانید، فایلها را unstaged کنید یا اشتباهات merge را اصلاح کنید، reset ابزاری انعطافپذیر است که میتواند به شما در اصلاح خطاها یا بازگشت به وضعیتهای قبلی کمک کند.
گزینهها
- --soft : فقط HEAD را منتقل میکند، index و working directory حفظ میشوند
- --mixed : HEAD را منتقل و index را بازنشانی میکند (پیشفرض)
- --hard : HEAD را منتقل و index + working directory را بازنشانی میکند
- --keep : فقط در صورتی reset میکند که تغییرات محلی overwrite نشوند
- --merge : reset با حفظ اطلاعات merge
- <commit> : کامیت هدف برای reset
- <file> : unstage فایل مشخص