Git یک ابزار قدرتمند و محبوب ترین سیستم کنترل نسخه است. به این صورت است که توسعه دهندگان و تیم های فنی در پروژه ها با یکدیگر همکاری و همکاری می کنند.

اما چه اتفاقی می‌افتد وقتی به‌طور تصادفی فایلی را اجرا می‌کنید و متوجه می‌شوید که نباید این کار را می‌کردید، زیرا آن فایل حاوی خطا است؟

نیازی به نگرانی نیست زیرا Git به شما اجازه می دهد تا اشتباهات خود را لغو کنید و به نسخه قبلی پروژه خود بازگردید.

یکی از مفیدترین ویژگی‌های Git این است که می‌تواند تغییراتی را که در یک پروژه ایجاد می‌کنید در طول زمان بازگرداند.

در این مقاله یاد خواهید گرفت که چگونه تغییرات در Git را بسته به وضعیت مخزن Git خود لغو کنید.

در اینجا چیزی است که ما پوشش خواهیم داد:

  1. نحوه لغو تغییرات بدون مرحله محلی
  2. نحوه لغو تغییرات مرحله‌ای محلی
  3. نحوه لغو تغییرات متعهد محلی
  4. نحوه لغو تغییرات متعهد عمومی

نحوه لغو تغییرات بدون مرحله محلی در Git

بگویید که روی دستگاه محلی خود کار می کنید. شما تغییراتی را در یک فایل به صورت محلی انجام داده و ذخیره کرده اید، اما می خواهید آنها را نادیده بگیرید.

وقتی هنوز آن تغییرات را انجام نداده اید، از آن استفاده نکرده اید git add فرمان

در این مورد، شما نیاز به استفاده از git restore فرمان

به طور خاص، git restore دستور چیزی شبیه به این خواهد بود:

git restore filename

بنابراین، بگویید که شما یک README.md فایل و شما به طور تصادفی متنی را که می خواهید نادیده بگیرید نوشته و ذخیره کرده اید.

ابتدا می توانید از git status دستور مشاهده وضعیت مخزن Git شما.

این دستور تایید می کند که فایل بدون مرحله است (به این معنی که شما استفاده نکرده اید git add هنوز) و به شما امکان می دهد فایل هایی را که ممکن است بخواهید لغو کنید مشاهده کنید:

On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

در اینجا نحوه لغو تغییرات در README.md فایل:

git restore README.md

سپس می توانید استفاده کنید git status دوباره برای بررسی وضعیت مخزن:

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

اکنون، شما با موفقیت جدیدترین تغییرات خود را کنار گذاشته و به آخرین نسخه تعهد شده پروژه خود بازگشته اید.

پیشنهاد می‌کنیم بخوانید:  نحوه رفع تضادهای ادغام در Git

نحوه لغو تغییرات مرحله‌ای محلی در Git

زمانی که شما از آن استفاده کرده اید، یک فایل مرحله بندی می شود git add فرمان

بنابراین، بگویید که تغییراتی در آن ایجاد کرده اید README.md فایل به صورت محلی، شما از آن استفاده کردید git add دستوری که تغییرات را مرحله بندی کرد و سپس متوجه شدید که متن حاوی اشتباهاتی است.

اول، اجرا کنید git status تا مطمئن شوید که فایل را مرحله بندی کرده اید (یعنی استفاده کرده اید git add) :

On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   README.md

همانطور که از خروجی می توانید متوجه شوید git status، می توانید از دستور زیر برای لغو تغییرات خود استفاده کنید:

git restore --staged filename

این دستور فایل مرحله بندی شده را unstage می کند، اما تغییرات شما را حفظ می کند.

بریم بدویم git status از نو:

On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

اکنون برای حذف تغییراتی که ایجاد کرده اید و فایل را به محتوای اصلی خود بازگردانید، از:

git restore README.md 

و بیایید فرار کنیم git status آخرین بار:

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

اکنون، تغییراتی که ایجاد کرده اید از بین رفته و فایل به نسخه متعهد فعلی برگردانده شده است.

نحوه لغو تغییرات متعهد محلی در Git

مثلاً شما تغییراتی را در یک فایل ایجاد کرده اید، فایل را با آن مرحله بندی کرده اید git add دستور، و فایل را با git commit فرمان

این بدان معنی است که commit فقط به صورت محلی وجود دارد و هنوز به یک مخزن راه دور منتقل نشده است.

ابتدا استفاده کنید git status برای بررسی اینکه آیا فایل را انجام داده اید:

On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

در مرحله بعد، اگر می خواهید آخرین commit محلی خود را لغو کنید، از آن استفاده کنید git log دستور:

آخرین commit دارای یک هش commit (یک سری طولانی از اعداد و کاراکترها) و a (HEAD -> main) در پایان – این همان تعهدی است که شما به دنبال لغو آن هستید.

کامیت دوم تا آخرین دارای هش commit و a است (origin/main) در پایان – این commitی است که می‌خواهید حفظ کنید و تعهدی که به مخزن راه دور منتقل کرده‌اید.

پس از آن، از دستور زیر برای لغو commit استفاده کنید:

git reset --soft HEAD~

حالا بیایید استفاده کنیم git log از نو.

پیشنهاد می‌کنیم بخوانید:  چگونه یک محیط توسعه جنگو راه اندازی کنیم

باید هش commit را ببینید و a (HEAD -> main, origin/main) در پایان.

آخرین تعهدی که انجام دادید دیگر بخشی از تاریخچه مخزن نیست و حذف شده است.

دستور بالا همه چیز را به نسخه فایل قبل از آن commit تصادفی یا اشتباه بازیابی کرد و یک commit به عقب برگشت.

بیایید بررسی کنیم git status از نو

On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   README.md

به خاطر داشته باشید که اگرچه git reset --soft HEAD~ دستور لغو آخرین commit شما، تغییراتی که ایجاد کرده اید را حفظ کرد.

چگونه تغییرات عمومی متعهد در Git را لغو کنیم

اگر تغییراتی در یک فایل ایجاد کردید، فایل را مرحله بندی کردید git add، آن را با git commandو آن را به یک مخزن راه دور با git push – اما بعد متوجه شدید که از ابتدا نباید آن فایل را انجام می دادید؟

بعدش چه کاری میکنی؟

ابتدا استفاده کنید git status برای بررسی وضعیت مخزن git:

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

در قسمت بالا مشاهده کردید که هر commit یک هش commit دارد که یک سری طولانی از اعداد و کاراکترها است.

برای مشاهده نسخه کوتاه هش commit از دستور زیر استفاده کنید:

git log --oneline

با git log دستور، همچنین می توانید بررسی کنید که کدام commit را می خواهید لغو کنید.

بگویید که آخرین کامیت شما دارای هش commit است cc3bbf7، که به دنبال آن است (HEAD -> main, origin/main)و یک پیام commit مانند “commit README.md file”.

برای لغو آن commit خاص، از دستور زیر استفاده کنید:

git revert cc3bbf7 --no-edit

دستور بالا با ایجاد یک commit جدید و برگرداندن آن فایل به حالت قبلی، تغییرات را خنثی می کند، گویی هرگز تغییر نکرده است.

در نهایت، استفاده کنید git push برای فشار دادن تغییر به شاخه راه دور.

هنگامی که این کار را انجام دادید، خواهید دید که پیام commit مانند پیام قبلی اما با کلمه خواهد بود revert قبل از آن، مانند
“تعهد فایل README.md” را برگردانید.

به خاطر داشته باشید که تاریخچه commit هر دو commit را جداگانه نشان می دهد:

Revert "commit README.md file"
@john-doe
john-doe committed 9 minutes ago

commit README.md file
@john-doe
john-doe committed 16 minutes ago 

نتیجه

و شما آن را دارید – اکنون می دانید که چگونه تغییرات را در Git لغو کنید.

برای کسب اطلاعات بیشتر در مورد Git، منابع رایگان زیر را بررسی کنید:

  • Git و GitHub برای مبتدیان – دوره Crash
  • آموزش Git for Professionals – ابزارها و مفاهیم برای تسلط بر کنترل نسخه با Git
  • آموزش پیشرفته Git – Rebase تعاملی، Cherry-Picking، Reflog، Submodules و موارد دیگر

ممنون که مطالعه کردید و کدنویسی خوبی داشتید 🙂