دکمه Undo در Git؛ برگرداندن تغییرات و Commitها
Chapter 7: Press the Undo Button

یکی از رایجترین دغدغهها هنگام کار با Git این است: «اگر اشتباه کردم چه؟» در ظاهر، Git دکمهی Undo مثل نرمافزارهای دیگر ندارد. اما حقیقت این است که Git ابزارهای قدرتمندی دارد که به شما اجازه میدهد تغییرات را به عقب برگردانید، Commitها را ویرایش کنید یا حتی تاریخچه را بازنویسی کنید.
در این فصل با مکانیزمهای مختلف برای بازگرداندن تغییرات آشنا میشویم.
سطوح مختلف تغییرات در Git
قبل از بررسی دستورات Undo، باید بدانیم تغییرات در کجا اتفاق میافتند:
- Working Directory → تغییرات ذخیرهشده روی فایلهای سیستم شما.
- Staging Area → تغییرات آماده Commit.
- Repository (Commits) → تغییرات ثبتشده در تاریخچه پروژه.
هر سطح روشهای خاص خود برای Undo دارد.
بازگرداندن تغییرات در Working Directory
لغو تغییرات فایل قبل از Stage
اگر فایلی را تغییر دادهاید اما هنوز git add
نکردهاید:
git checkout -- filename
یا (در نسخههای جدیدتر Git):
git restore filename
این کار فایل را به آخرین نسخه ذخیرهشده (HEAD) برمیگرداند.
بازگرداندن تغییرات در Staging Area
حذف فایل از Stage (بدون حذف تغییرات)
اگر فایلی را git add
کردهاید اما هنوز نمیخواهید Commit کنید:
git reset filename
یا در نسخههای جدیدتر:
git restore --staged filename
تغییرات همچنان در Working Directory باقی میمانند.
بازگرداندن Commitها
1. اصلاح آخرین Commit (Amend)
اگر Commit کردهاید اما پیام یا فایلها درست نیستند:
git commit --amend
- میتوانید پیام Commit را تغییر دهید.
- میتوانید فایلهای جدید اضافه کنید.
2. بازگرداندن یک Commit (Revert)
برای لغو تغییرات یک Commit خاص بدون تغییر تاریخچه:
git revert <commit-hash>
یک Commit جدید ایجاد میشود که تغییرات Commit موردنظر را برعکس میکند.
3. بازنشانی به یک Commit قبلی (Reset)
git reset --hard <commit-hash>
این دستور تاریخچه را بازنویسی میکند و تغییرات بعد از آن Commit حذف میشوند.
--soft
→ تغییرات در Staging Area باقی میمانند.--mixed
(پیشفرض) → تغییرات به Working Directory برمیگردند.--hard
→ همه چیز به آن Commit بازنشانی میشود.
هشدار: استفاده از reset --hard
خطرناک است چون تغییرات حذف میشوند.
بهترین رویکرد برای Undo در Git
- اگر میخواهید بدون تغییر تاریخچه اصلاح کنید →
git revert
. - اگر Commit هنوز Push نشده و فقط روی سیستم شماست →
git commit --amend
یاgit reset
. - اگر فقط فایلها را تغییر دادهاید →
git restore
یاgit checkout
.
مقایسه دستورات Undo در Git
سطح تغییر | دستور پیشنهادی | توضیح |
---|---|---|
Working Directory | git restore filename |
برگرداندن فایل به آخرین نسخه Commit شده |
Staging Area | git restore --staged filename |
حذف فایل از Stage |
آخرین Commit | git commit --amend |
اصلاح پیام یا اضافهکردن فایل |
Commit خاص | git revert <hash> |
ایجاد Commit معکوس |
تاریخچه کامل | git reset --hard <hash> |
بازنویسی تاریخچه و حذف تغییرات |
جمعبندی
- Git دکمهی Undo ساده ندارد، اما ابزارهای قدرتمند زیادی دارد.
- برای تغییرات محلی از
git restore
یاgit checkout
استفاده کنید. - برای اصلاح Commit اخیر از
git commit --amend
کمک بگیرید. - برای لغو تغییرات در تاریخچه، بهترین گزینهی امن
git revert
است. - در نهایت، اگر میخواهید تاریخچه را بازنویسی کنید، از
git reset
استفاده کنید (با احتیاط).
در فصل بعد (Chapter 8: Branching) یاد میگیریم چگونه با استفاده از شاخهها (Branches) به صورت همزمان روی ویژگیهای مختلف کار کنیم.