صرف نظر از اینکه چقدر تجربه دارید ، توسعه نرم افزار بدون اشتباه انجام نمی شود. اما آنچه میانگین را از برنامه نویسان بزرگ جدا می کند این است که آنها می دانند چگونه واگرد اشتباهات آنها!

اگر از Git به عنوان سیستم کنترل نسخه خود استفاده می کنید ، قبلاً تعداد زیادی “ابزار واگرد” در دست دارید. این پست به شما پنج راه قدرتمند را نشان می دهد رفع اشتباهات با Git!

برخی تغییرات محلی خود را کنار بگذارید

برنامه نویسی اغلب یک فرآیند آشفته است. گاهی احساس می کنید دو قدم به جلو و یک قدم به عقب بر می دارید. به عبارت دیگر: برخی از کدهایی که تولید کرده اید عالی هستند … اما برخی دیگر نه چندان زیاد. در اینجا جایی است که Git می تواند به شما کمک کند: به شما این امکان را می دهد که چیزهای خوب را حفظ کرده و تغییراتی را که دیگر نمی خواهید کنار بگذارید.

بیایید نگاهی به یک سناریوی نمونه با برخی تغییرات “محلی” (با نام تغییراتی که هنوز انجام نداده ایم) بیندازیم.

تغییرات محلی و بدون تعهد - برخی از آنها را می خواهیم کنار بگذاریم

توجه: برای یک نمای کلی بهتر و تجسم واضح تر ، من از نرم افزار استفاده می کنم مشتری دسکتاپ Tower Git در برخی از اسکرین شات های من برای همراهی با این آموزش نیازی به برج ندارید.

بیایید با مشکل مقابله کنیم general.css اولین. تغییراتی که ما انجام دادیم در جهت کاملاً اشتباه قرار گرفت. بیایید همه آنها را لغو کرده و آخرین حالت متعهد آن فایل را بازسازی کنیم:

$ git restore css/general.css

توجه داشته باشید که در عوض ، می توانستم از آن استفاده کنم git checkout دستور برای دستیابی به همان نتیجه اما چون git checkout دارای مشاغل و معانی بسیار متفاوتی است ، من به شدت موارد جدیدتر را ترجیح می دهم git restore فرمان (که فقط بر روی این نوع وظایف متمرکز شده است).

مشکل دوم ما در index.html کمی پیچیده تر است برخی از تغییراتی که در این فایل ایجاد کردیم در واقع عالی هستند ، در حالی که تنها برخی از آنها باید لغو شوند.

لغو تنها برخی از تغییرات در یک فایل ، در حالی که برخی دیگر را دست نخورده نگه می دارید

از نو، git restore به نجات می آید – اما این بار با -p پرچم ، زیرا می خواهیم به سطح “پچ” برویم:

$ git restore -p index.html

Git سپس دست شما را می گیرد و از شما می پرسد – برای هر تکه تغییرات در آن فایل – اگر می خواهید آن را کنار بگذارید یا نه.

Git از ما می پرسد که با هر تکه تغییرات چه کنیم؟

متوجه خواهید شد که من برای تکه اول “n” (به منظور حفظ آن) و “y” برای تکه دوم (به منظور دور انداختن آن) تایپ کردم. پس از اتمام فرآیند ، می توانید ببینید که تنها اولین بخش ارزشمند تغییرات باقی مانده است – درست همانطور که می خواستیم!

بازگرداندن یک فایل خاص به حالت قبلی

گاهی اوقات می خواهید a را بازیابی کنید خاص پرونده به خاص تجدید نظر به عنوان مثال ، شما این را می دانید index.html قبلا خوب کار می کرد ، اما اکنون اینطور نیست. آن وقت است که می خواهید زمان را به عقب برگردانید ، اما فقط برای این فایل خاص و نه برای کل پروژه!

اولین چیزی که باید دریابیم این است که کدام نسخه دقیق را می خواهیم بازیابی کنیم. با تنظیم پارامترهای مناسب ، می توانید از git log دستور برای نشان دادن تاریخچه تنها یک فایل ما:

$ git log -- index.html

بررسی سابقه ارتکاب یک پرونده خاص

این فقط تعهدات را در کجا به ما نشان می دهد index.html تغییر کرده است ، که برای یافتن تجدید نظر “سیب بد” که همه چیز را خراب کرد بسیار مفید است.

اگر به اطلاعات بیشتری نیاز دارید و می خواهید به آن نگاه کنید فهرست از بین این تعهدات ، می توانید از Git تغییرات واقعی در این تعهدات را به شما نشان دهید -p پرچم:

$ git log -p -- index.html

هنگامی که ما تعهد بد را در جایی که پرونده کوچک دوست داشتنی خود را شکستیم پیدا کردیم ، می توانیم ادامه دهیم و اشتباه را برطرف کنیم. ما این کار را با بازگرداندن پرونده در ویرایش انجام می دهیم قبل از آن بد! این مهم است: ما نمی خواهیم پرونده ای را که در آن خطا ایجاد شده است بازیابی کنیم ، اما در آخرین وضعیت خوب – یک تعهد قبل از آن!

$ git checkout <bad-commit-hash>~1 -- index.html

در حال الحاق ~1 به هش بد بدی به Git دستور می دهد دقیقاً همین کار را انجام دهد: یک بار مرور کنید قبل از یکی اشاره شده

پس از اجرای آن دستور ، خواهید یافت index.html در نسخه کار محلی شما اصلاح شود: Git آخرین نسخه خوب فایل را برای ما بازیابی کرد!

بازیابی ویرایش از دست رفته با Reflog

یکی دیگر از ابزارهای واگرد بزرگ در جعبه کمک های اولیه Git ، “Reflog” است. شما می توانید آن را به عنوان مجله ای در نظر بگیرید که Git تمام حرکات اشاره گر HEAD را که در مخزن محلی شما اتفاق می افتد ، پروتکل می کند-مواردی مانند کمیت ، تسویه حساب ، ادغام و بازآفرینی ، برداشت گیلاس و تنظیم مجدد. همه اقدامات جالب تر به زیبایی در اینجا وارد شده اید!

البته چنین مجله ای برای مواردی که اوضاع به سمت جنوب می رود کاملاً مناسب است. بنابراین بیایید با ایجاد یک فاجعه کوچک شروع کنیم – که می توانیم آن را با Reflog تعمیر کنیم.

فرض کنید متقاعد شده اید که آخرین تعهدات شما خوب نبوده است: می خواهید آنها را از بین ببرید و بنابراین استفاده می کنید git reset برای بازگشت به نسخه قبلی در نتیجه ، تعهدات “بد” همانطور که می خواستید از سابقه تعهد شما ناپدید شدند.

متوجه شدیم که ما یک اشتباه وحشتناک مرتکب شده ایم - بعد از اینکه ماشه فرمان

اما وقتی زندگی گاهی پیش می رود ، متوجه می شوید که این ایده بدی بود: در نهایت ، تعهدات بالاخره بد نبودند! البته خبر بد این است که شما آنها را به تازگی از سابقه تعهد مخزن خود پاک کرده اید! 😱

استفاده از دستور Reset برای بازگرداندن حالت قبلی - و در نتیجه

این یک مورد کلاسیک برای ابزار Reflog Git است! بیایید ببینیم چگونه می تواند گردن شما را نجات دهد:

$ git reflog

Reflog یک نمای کلی خوب از آخرین اقدامات ما به ما می دهد

بیایید این را ذره ذره تجزیه کنیم:

  • اول از همه ، Reflog بسیار آسان باز می شود: ساده git reflog تمام آنچه نیاز دارید است.
  • دوم ، متوجه خواهید شد که حالتهای ثبت شده به ترتیب زمانی مرتب شده اند ، که جدیدترین آنها در بالا قرار دارد.
  • اگر به دقت نگاه کنید ، خواهید دید که بالاترین (یعنی جدیدترین) مورد یک اقدام “بازنشانی” است. کاری که ما فقط 20 ثانیه پیش انجام دادیم. ظاهراً مجله کار می کند
  • اگر اکنون می خواهیم “بازنشانی” غیر ارادی خود را لغو کنیم ، می توانیم به سادگی به حالت قبل بازگردیم – که در اینجا نیز به طور دقیق ثبت شده است! ما به سادگی می توانیم هش متعهد آن حالت قبلی را در کلیپ بورد کپی کرده و از آنجا ببریم.

برای بازیابی این حالت قبلی ، می توانیم از هر دو استفاده کنیم git reset دوباره یا به سادگی یک شاخه جدید ایجاد کنید:

$ git branch happy-ending e5b19e4

ما توانستیم شعبه و تعهدات ارزشمندی را که فکر می کردیم از دست داده ایم ، بازیابی کنیم

همانطور که می توانیم با خوشحالی تأیید کنیم ، شاخه جدید ما شامل تعهداتی است که فکر می کردیم در اثر تصادف خود از دست داده ایم git reset سکسکه!

بازیابی یک شاخه حذف شده

Reflog می تواند در شرایط دیگر نیز مفید واقع شود. به عنوان مثال ، هنگامی که شما ناخواسته شاخه ای را حذف کرده اید که واقعاً نباید (!) داشته باشید. بیایید نگاهی به سناریوی نمونه خود بیندازیم:

$ git branch
  * feature/analytics
    master

بیایید وانمود کنیم که مشتری / سرپرست تیم / مدیر پروژه به ما می گوید که زیباست analytics ویژگی دیگری که ما روی آن کار می کردیم دیگر مورد نیاز نیست. مرتب همانطور که هستیم ، مربوطه را حذف می کنیم feature/analytics البته شعبه!

در بالا ، می توانید ببینید که در سناریوی مثال ما ، آن شعبه را در حال حاضر بررسی کرده ایم: feature/analytics شعبه فعلی HEAD ما است برای اینکه بتوانیم آن را حذف کنیم ، ابتدا باید به شاخه دیگری برویم:

$ git checkout master
$ git branch -d feature/analytics
error: The branch 'feature/analytics' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature/analytics'.

Git به ما می گوید که ما در حال انجام کاری واقعاً جدی هستیم: از آن زمان feature/analytics حاوی تعهدات منحصر به فردی است که در هیچ کجای دیگر وجود ندارد ، حذف آن برخی از داده های (بالقوه ارزشمند) را از بین می برد. خوب … از آنجا که این ویژگی دیگر مورد نیاز نیست ، می توانیم ادامه دهیم:

$ git branch -D feature/analytics
Deleted branch feature/analytics (was b1c249b).

احتمالاً شما پیش بینی کرده اید که چه چیزی در حال حاضر است: مشتری / سرپرست تیم / مدیر پروژه ما با خوشحالی به ما می گوید که این ویژگی در بازی بازگشته است! after بالاخره آنها می خواهند آن را دنبال کنند! 🎉

دوباره ، ما با یک وضعیت زشت روبرو هستیم که ممکن است داده های ارزشمندی را از دست داده باشیم! بنابراین بیایید ببینیم آیا Reflog می تواند یک بار دیگر گردن ما را نجات دهد:

$ git reflog

Reflog مشکل - و راه حل را نشان می دهد

اگر نگاه دقیق تری داشته باشید ، خبر خوب آشکار می شود. قبل از این که بتوانیم (به طرز فاجعه باری) شاخه خود را حذف کنیم ، مجبور بودیم یک کار را انجام دهیم git checkout برای تغییر از آن (از آنجا که Git به شما اجازه نمی دهد شاخه فعلی را حذف کنید). البته این checkout همچنین در Reflog وارد شده است. به منظور بازگرداندن شاخه حذف شده ما ، اکنون می توانیم به سادگی حالت را انتخاب کنیم قبل از به عنوان نقطه شروع برای یک شعبه جدید:

$ git branch feature/analytics b1c249b

و وویلا: شاخه ما مرده است! 🌸💀🌺

اگر به طور اتفاقی از GUI رومیزی استفاده می کنید مانند برج، لغو اشتباهاتی از این قبیل اغلب به سادگی فشاری است CMD + بابه

GUI رومیزی برای Git اغلب می تواند به شما کمک کند و کارها را راحت تر کنید

انتقال تعهد به شعبه دیگری

بیایید با یک کلاسیک واقعی دیگر از “اوه نه!” بخش: تعهد در شعبه اشتباه

امروزه بسیاری از تیم ها قانونی را در نظر گرفته اند که از انجام مستقیم شعب طولانی مدت مانند “اصلی” ، “اصلی” یا “توسعه” جلوگیری می کند. به طور معمول ، تعهدات جدید باید فقط از طریق ادغام/بازآموزی به آن شاخه ها برسد. و با این حال ، ما گاهی اوقات فراموش می کنیم و مستقیماً متعهد می شویم…

بیایید سناریوی زیر را به عنوان مثال در نظر بگیریم.

یک مورد کلاسیک از تعهدی که در شاخه اشتباه اتفاق افتاده است

ما باید متعهد می شدیم feature/newsletter، اما ناخواسته ماشه را روی آن کشید master شاخه. بیایید راه حل را گام به گام بررسی کنیم.

اول ، ما باید مطمئن شویم که این بار در شعبه مناسب هستیم ، بنابراین در حال بررسی هستیم feature/newsletter:

$ git checkout feature/newsletter

اکنون می توانیم با خیال راحت این تعهد را از طریق استفاده از cherry-pick دستور:

$ git cherry-pick 26bf1b48

ما می توانیم نگاهی به feature/newsletter و خواهید دید که در حال حاضر ، تعهد در اینجا نیز وجود دارد.

متعهد به لطف دستور cherry-pick به شاخه صحیح منتقل شده است

تا کنون خیلی خوب. ولی cherry-pick کار را نکرد برداشتن تعهد از master شعبه – جایی که باید هرگز شده است. بنابراین ما باید آشفتگی خود را در آنجا نیز تمیز کنیم:

$ git checkout master
$ git reset --hard HEAD~1

در حال بازگشت به master و سپس استفاده از git reset برای حذف تعهد ناخواسته (در اینجا) از تاریخ.

سرانجام ، همه چیز خوب است – بنابراین شما ممکن است رقص شاد خود را همین حالا شروع کنید! 💃🕺🏻

لغو اشتباهات یک ابرقدرت است

من قبلاً آن را گفته ام ، و متأسفانه همه ما می دانیم که این درست است: ما نمی توانیم از اشتباهات اجتناب کنیم! مهم نیست که چقدر برنامه نویس بزرگی هستیم ، هر از گاهی به هم می ریزیم. بنابراین ، س questionال این نیست اگر ما اشتباه می کنیم ، بلکه چقدر می توانیم با آنها کنار بیاییم و مشکلات را برطرف کنیم؟

اگر می خواهید در مورد ابزارهای واگرد Git اطلاعات بیشتری کسب کنید ، توصیه می کنم “کیت کمک های اولیه برای Git”. این مجموعه ای (رایگان) از ویدئوهای کوتاه است که به شما نشان می دهد چگونه می توانید اشتباهات خود را در Git پاکسازی و لغو کنید.

از حرکت سریع ، شکستن چیزها – و البته ، تعمیر آنها لذت ببرید!