خلاصه: هر تغییری از فایل یا فایل‌ها یا همه‌چیز که در staging area هستن رو با دستورِ زیر undo کن. این دستور در واقع آخرین نسخه از فایل رو از آخرین کامیت (چیزی که در ریپو هستش) رو در staging area قرار می‌ده و اگه فایل هنوز هیچ نسخه‌ای در آخرین کامیت نداشته باشه (A) فایل از staging area حذف می‌شه و وضعیتِ اون فایل به (??) تغییر می‌کنه.

git restore --staged file1.js

بهتون گفتم که باید همیشه چیزهایی که در staging area دارین رو قبل از ساخت یک کامیت بازبینی کنین. خُب، بیاین بگیم این تغییرات رو بازنگری کردیم و فهمیدیم که این تغییرات در file1.js نباید تو کامیت بعدی‌مون باشه. شاید برای اینکه این تغییرات منطقاً‌ بخشی از یه تسک دیگه‌ست. پس نمی‌خوایم که یک کامیت که دارای تغییراتی برایِ تسک‌هایِ دیگه‌ هست باشه.

در این مورد می‌خوایم که عملِ add رو که انجام دادیم رو حذف کنیم. چون قبلش از دستورِ add برای افزودن file1.js به staging area استفاده کردیم حالا می‌خوایم این عمل رو undo کنیم.

MM file1.js
A  file2.js

در گذشته از دستورِ reset استفاده می‌کردیم اما کلی از مردم این دستور رو سردرگم‌کننده دونستن مخصوصاً با آپشن‌هایی مثلِ soft و hard.

git reset --soft
git reset --hard

برای همین یک دستور جدید به اسمِ restore داریم. مطمئن باشین که از آخرین نسخه‌ی گیت دارین استفاده می‌کنین در غیر اینصورت چیزی که قراره بهتون نشون بدم تو سیستم شما کار نخواهد کرد.

می‌خوایم file1.js رو که در staging area هست رو restore کنیم. پس می‌نویسیم.

git restore --staged file1.js

البته می‌تونیم فایل‌هایِ زیادی رو لیست کنیم. و یا از پترن استفاده کنیم. و یا همه چیز رو از staging area توسطِ period ریستور کنیم.

git restore --staged file1.js file2.js
git restore --staged file1.js *.js
git restore --staged .

حالا که file1.js رو از staging area ریستور کردیم اگه git status کنیم خروجی‌ش خواهد بود:

 M file1.js
A  file2.js

دیگه اون M سبزرنگ نیستش چون تمامِ تغییراتی که در staging area داشتیم حالا در مسیر کاری‌مون هستن. دیگه هیچ تغییری برای file1.js در staging area نداریم. تمامیِ این تغییرات در مسیرِ کاری‌مون هستن.

ضروریه که درک کنین که چطور دستورِ restore کار می‌کنه. این دستور اساساً‌ یک نسخه از محیطِ بعدی می‌گیره. یعنی آخرین کامیت. چیزی که در ریپو داریم. وقتی که file1.js رو restore کردیم گیت آخرین نسخه از فایل رو در آخرین snapshot برداشت و در staging area قرارش داد. این اتفاقیه که افتاد.

یه نگاهی به file2.js بندازین. این فایل یک فایلِ جدید هستش چون یک A سبزرنگ داره که همون added هستش. این فایل جدید رو در staging area داریم اما این فایل در آخرین کامیت وجود نداره. چون یه کپی ازش در ریپومون یا در آخرین کامیت‌مون نداریم گیت این فایل رو از staging area پاک می‌کنه و برش می‌گردونه به حالتِ قبلیش که یک فایلِ جدید ردیابی‌نشده هست.

git restore --staged file2.js
 M file1.js
?? file2.js

حالا file2.js فایلِ جدیدی هستش که ردیابی‌نشده هست چون در خروجیِ بالا دو تا علامتِ‌سؤال رو داریم.