وبلاگ

چگونه یک کامیت را undo کنیم


رقیه اباذری رقیه اباذری

بسیاری از دولوپرها با undo کردن commitها درگیر هستند. بعضی مواقع ممکن است فرد به طور اتفاقی تغییراتی اعمال کند که نباید در درخت باشد. در این مقاله یاد می‌گیرید که چگونه این تغییرات را به حالت قبل برگردانید و به اصطلاح حذفشان کنید. این کار را به دو صورت ریموت (remotely) و یا لوکال (locally) آموزش می دهیم. 

به طور کلی یک فایل می تواند در 3 حالت مختلف باشد. 

1- ترک نشده (Untracked)

2- استیج نشده (Unstaged)

3- استیج شده (Staged)

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

فایل‌های Staged، فایل‌هایی هستند که به کامیت بعدی می‌روند.

اگر git status را در ریپازیتوری خود تایپ کنید، می‌توانید این سه حالت را نیز مشاهده کنید.

درخت وضعیت فایل در گیت

حذف فایل‌های جدید از فایل‌های Staged

اگر به طور اتفاقی فایل‌هایی را به قسمت staged اضافه کردید، می‌توانید با تایپ کردن <git restore --staged <file این کار را undo یا خنثی سازی کنید. بنابراین در این حالت، git restore --staged lib.c می‌شود.

فایل lib.c مجددا وارد بخش untracked می‌شود، چون الان یک فایل کاملا جدید است. تغییراتی که شما ایجاد کرده‌اید هنوز هم وجود خواهد داشت. اگر دیگر نیازی به تغییرات ایجاد شده ندارید، می‌توانید فقط فایل را حذف کنید.

حذف فایل‌های موجود از فایل‌های Staged

اگر فایل در درخت وجود داشته باشد، می‌توانید تغییراتی که ایجاد کرده‌اید را نگه دارید و یا اینکه به آخرین کامیت ریست کنید. <git restore --staged <file مجددا فایل را از ناحیه staged به ناحیه unstaged منتقل می‌کند. اگر می‌خواهید فایل را به آخرین کامیت ریست کنید، ابتدا باید فایل را unstage کرده، یعنی آن را از ناحیه staged خارج کنید، و سپس می‌توانید با استفاده git restore <file>، از آن را به آخرین کامیت ریستور کنید.

خب همانطور که دیدید، جابجا کردن فایل‌ها بین بخش untracked/unstaged و بخش staged راحت است. اما اگر فایل‌ها را کامیت کرده باشید و نیاز به undo کردن آخرین کامیت داشته باشید، چطور؟ چه کاری باید انجام داد؟!!

Undo کردن یک کامیت

فرض کنیم شما می‌خواهید به آخرین تغییرات کامیت برگردید، اما تغییرات خودتان را هم نگه دارید. کامیت‌های شما در درخت شبیه به این است:

undo کردن یک کامیت

کامیت فعلی شما در حال حاضر روی Add superDuper.d است. حال قصد دارید دستور undo را با حفظ تغییراتتان، برای این کامیت اجرا کنید. تغییرات از کامیت به بخش unstaged/untracked انتقال خواهد یافت. ^git reset HEAD درخت شما را به آخرین کامیت پیشین کامیت فعلی ریست خواهد کرد. ^HEAD کوتاه شده HEAD-1 است. HEAD جایی ست که دایرکتوری شما، در حال کار است.

اگر خواستید کامیت را بدون نگه داشتن تغییرات undo کنید، hard-- را به دستور ^git reset --hard HEAD اضافه کنید.

توجه

حواستان باشد، این کار تغییراتی که روی کامیت انجام داده‌اید را حذف می‌کند.

برگرداندن یک کامیت از راه دور

آخرین موردی که در جعبه ابزار git نیاز دارید، revert است. Reverting به معنای undo کردن آخرین کامیت است. مشکل اینجاست که درخت قبلاً با ریموت sync شده است. بنابراین فقط حذف commit چندان آسان نیست. کاری که باید بکنیم undo کردن کارهایی است که در یک  کامیت جداگانه انجام داده‌ایم. git revert HEAD دقیقا همین کار را انجام می‌دهد. آخرین کامیت را می‌گیرد و تمامی تغییرات ایجاد شده را برمی‌گرداند و این تغییرات معکوس را به عهده خودش می‌گیرد. بیایید تاریخچه فعلی git را بررسی کنیم.

هیستوری گیت

قصد داریم آخرین کامیتی را که در پوشه database.md اضافه کرده‌ایم، برگردانیم. اگر git revert HEAD را تایپ کنیم، آخرین کامیت ایجاد شده را برمی‌گرداند. اگرچه درخت ما شبیه به این شکل است:

 درخت

اکنون می‌توانید تغییرات ایجاد شده در ریموت را push کرده و آخرین کامیت را با موفقیت برگردانید.


رقیه اباذری
رقیه اباذری

مطالب مرتبط