خلاصه: فایلی رو که حذف کردیم رو از کامیتی که نسخه‌ی نهاییِ اون فایل (آخرین نسخه‌ای از فایل که قبل از حذف شدن) درش هست، ریکاوری می‌کنیم. به همین خاطر، فقط فایلِ مورد نظر رو checkout می‌کنیم (و نه خودِ کامیت رو)

git checkout a642n12 toc.txt

همه‌مون اشتباه می‌کنیم. گاهی اوقات ممکنه به صورتِ تصادفی یک فایل رو پاک کنیم.

بذارین نشونتون بدم که چطور یک فایل حذف‌شده رو از تاریخچه برگردونین. (ریکاور کنین)

برای نمونه می‌خوایم فایلِ toc.txt1 رو پاک کنیم. برای این کار از دستورِ rm استفاده می‌کنیم.

git rm toc.txt

تغییرِ بالا رو کامیت می‌کنیم.

git commit -m "Remove toc.txt"

پیغام بالا، تنها برای نمونه هستش. در شرایط واقعی پیام مشخص نمی‌کنه که این فایل رو پاک کردیم چون ممکنه که حذف فایل رو تصادفی پاک کرده باشیم. پس ممکنه فایل رو به عنوانِ بخشی از رفعِ باگ و یا پیاده‌سازیِ ویژگی‌ِ جدید پاک کنیم.

حالا که فایلِ toc.txt حذف شد.

نیاز داریم که تمامیِ کامیت‌هایی که این فایل رو touch کردن رو پیدا کنیم. این شاملِ کامیت‌هایی می‌شه که این فایل درشون تغییر کرده و یا حتی حذف شده.

git log --oneline toc.txt

البته دستور بالا با خطا مواجه می‌شه. با توجه به اینکه گیت به صورتِ اتوماتیک نامِ فایل‌ها رو تشخیص نمی‌ده باید اسمِ‌فایل رو به کمکِ —- با باقیِ آپشن‌ها جدا کنیم.

git log --oneline -- toc.txt

خروجیِ دستورِ بالا:

Fe7a828 (HEAD -> master) Remove toc.txt
a642n12 Add header to all pages.
S0db987 Include the first section in TOC.
ca49180 Initial commit.

حالا برای ریستور کردنِ این فایل باید به والد یا parent کامیتِ Fe7a828 نگاهی بندازیم. والدِ کامیتِ Fe7a828 کامیت به آی‌دیِ a642n12 هستش. این کامیت جایی هست که آخرین نسخه‌ی این فایل رو داشتیم. چون در کامیتِ Fe7a828 فایلِ toc.txt حذف شده. پس در این snapshot نیستش.

در دستورِ زیر فقط فایلِ toc.txt رو از کامیتِ checkout ،a642n12 می‌کنیم.

git checkout a642n12 toc.txt

حالا با اجرایِ دستورِ بالا working directoryمون dirty شد. git status -s کوتاه‌شده‌ رو اجرا می‌کنیم.

A  toc.txt

با توجه به خروجیِ بالا، یه فایلِ جدید رو داریم که در staging area هستش. پس بیاییم کامیتش کنیم.

git commit -m "Restore toc.txt"

و اینجوری می‌تونیم یک فایلِ حذف‌شده رو برگردونیم.

  1. اسم فایل مخفف table of content هست.