Skip to content

Latest commit

 

History

History
105 lines (66 loc) · 10.7 KB

git rest.md

File metadata and controls

105 lines (66 loc) · 10.7 KB
github
true

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

حسین: 🤔 آها، متوجه شدم پیمان جان. این یه سناریوی نسبتاً رایجه که برای خیلی از توسعه‌دهنده‌ها پیش میاد. خوشبختانه، گیت ابزارهای قدرتمندی برای مدیریت این جور موقعیت‌ها داره.

حسین: 😊 راه حلی که من پیشنهاد می‌کنم استفاده از دستور "git reset --soft" هست. این دستور به ما اجازه میده که به یک کامیت قبلی برگردیم، بدون اینکه تغییرات فعلی رو از دست بدیم. 🔗

پیمان: 🤨 چطوری این کار رو انجام بدم؟ می‌شه بیشتر توضیح بدی؟

حسین: 💡 البته! اول از همه، باید شماره کامیتی که می‌خوای بهش برگردی رو پیدا کنی. می‌تونی از دستور "git log" استفاده کنی تا تاریخچه کامیت‌هات رو ببینی. 🔗

حسین: 🖥️ بعد از اینکه شماره کامیت مورد نظرت رو پیدا کردی، این دستور رو اجرا کن:

git reset --soft HEAD~1

این دستور شما رو به کامیت قبلی برمی‌گردونه. عدد 1 نشون میده که می‌خوای یک کامیت به عقب برگردی. اگه بخوای بیشتر برگردی، می‌تونی این عدد رو تغییر بدی. 🔗

یزدان: 🙋‍♂️ ببخشید که می‌پرم وسط حرفتون، ولی میشه یه مثال عملی بزنید؟ من اینجوری بهتر متوجه میشم.

حسین: 😃 حتماً یزدان جان. فرض کن ما یه فایل به اسم app.py داریم و توش این تغییرات رو اعمال کردیم و کامیت کردیم:

def calculate_total(items):
    total = sum(item.price for item in items)
    return total * 1.1  # اضافه کردن 10% مالیات

حالا فهمیدیم که این تغییر اشتباهه و می‌خوایم برگردیم به حالت قبل. پس این دستور رو اجرا می‌کنیم:

git reset --soft HEAD~1

حالا اگه git status رو اجرا کنیم، می‌بینیم که تغییرات هنوز توی Staging Area هستن، ولی کامیت نشدن. 🔗

پیمان: 🤔 خب، حالا که برگشتیم به حالت قبل، چطوری می‌تونیم تغییرات رو اصلاح کنیم؟

حسین: 👨‍🏫 خوشحالم که این سوال رو پرسیدی پیمان. حالا که تغییرات در Staging Area هستن، می‌تونی فایل رو ویرایش کنی و تغییرات جدید رو اعمال کنی. مثلاً:

def calculate_total(items):
    return sum(item.price for item in items)  # حذف مالیات اضافه

بعد از اینکه تغییرات رو اعمال کردی، می‌تونی دوباره فایل رو add کنی و یه کامیت جدید بسازی:

git add app.py
git commit -m "اصلاح محاسبه مجموع بدون اعمال مالیات"

یزدان: 🤯 وای، چقدر جالب! یعنی با این روش می‌تونیم اشتباهاتمون رو اصلاح کنیم بدون اینکه تاریخچه گیت رو خراب کنیم؟

حسین: 😎 دقیقاً یزدان جان! این یکی از قدرت‌های گیته. البته یادت باشه که اگه قبلاً تغییرات رو push کرده باشی، باید از force push استفاده کنی که البته در تیم‌های بزرگ توصیه نمیشه و باید با احتیاط انجام بشه. 🔗

مارال: 👩‍💼 بچه‌ها، من داشتم به مکالمه‌تون گوش می‌دادم. حسین، ممنون که این موضوع رو اینقدر خوب توضیح دادی. پیشنهاد می‌کنم یه جلسه آموزشی درباره این موضوعات گیت برای کل تیم بذاریم. فکر می‌کنم همه می‌تونن از این اطلاعات استفاده کنن.

حسین: 🙌 ایده عالیه مارال جان! من خوشحال میشم که این جلسه رو برگزار کنم. می‌تونیم درباره انواع مختلف reset در گیت صحبت کنیم، مثل --soft، --mixed، و --hard، و اینکه هر کدوم چه کاربردی دارن. 🔗

پیمان: 😅 وای، ممنونم حسین! واقعاً کمک بزرگی کردی. فکر کنم باید بیشتر درباره این ویژگی‌های گیت یاد بگیرم.

یزدان: 🤓 منم خیلی مشتاقم که بیشتر یاد بگیرم. مخصوصاً اینکه چطور می‌تونیم از این تکنیک‌ها توی workflow روزانه‌مون استفاده کنیم.

حسین: 💪 خوشحالم که تونستم کمک کنم. یادتون باشه، گیت یه ابزار قدرتمنده و هر چقدر بیشتر باهاش کار کنید، راحت‌تر می‌تونید مشکلات رو حل کنید. اگه سوال دیگه‌ای دارید، حتماً بپرسید!

مارال: 👏 عالیه بچه‌ها! من هماهنگ می‌کنم که این جلسه آموزشی رو هفته آینده داشته باشیم. فکر می‌کنم این جور بحث‌ها واقعاً به پیشرفت تیم کمک می‌کنه.

پیمان: 🙏 ممنون از همگی. واقعاً خوشحالم که توی همچین تیمی کار می‌کنم که همه به هم کمک می‌کنن.


پیمان: خب فرق soft با hard و mixed چیه؟ 🤔

حسین: 🤓 خیلی خوبه که این سوال رو پرسیدی پیمان. اجازه بده برات توضیح بدم.

git reset --soft

این دستور فقط HEAD رو به کامیت مشخص شده برمی‌گردونه و تغییرات رو در Staging Area نگه می‌داره. یعنی فایل‌ها همچنان برای کامیت بعدی آماده هستن، ولی کامیت قبلی از تاریخچه حذف میشه. به این ترتیب، تغییراتت رو از دست نمی‌دی و می‌تونی اونا رو دوباره کامیت کنی. 🔗

git reset --mixed

این دستور هم مثل --soft، HEAD رو به کامیت مشخص شده برمی‌گردونه، ولی تغییرات رو از Staging Area خارج می‌کنه و فقط در Working Directory نگه می‌داره. این یعنی تغییراتت همچنان در فایل‌ها هستن، ولی دیگه برای کامیت آماده نیستن. این حالت پیش‌فرض git reset هست. 🔗

git reset --hard

این دستور همه چیز رو به حالت کامیت مشخص شده برمی‌گردونه، یعنی هم HEAD، هم Staging Area و هم Working Directory. به این ترتیب، همه تغییراتت از بین می‌رن و دیگه قابل بازیابی نیستن. باید با احتیاط از این دستور استفاده کنی چون تغییراتت رو به طور کامل از دست می‌دی. 🔗

حسین: 😅 یه مثال بزنم که بهتر متوجه بشی. فرض کن سه تا کامیت داریم به ترتیب A, B, C و HEAD روی C هست. اگه از git reset --soft B استفاده کنی، HEAD به B برمی‌گرده ولی تغییرات C همچنان در Staging Area هستن. اگه از git reset --mixed B استفاده کنی، HEAD به B برمی‌گرده و تغییرات C در Working Directory باقی می‌مونن ولی از Staging Area خارج می‌شن. و اگه از git reset --hard B استفاده کنی، همه چیز به حالت B برمی‌گرده و تغییرات C کاملاً از بین می‌رن. 🔗

یزدان: 😮 وای، چقدر جالب! یعنی با --soft تغییراتمون رو حفظ می‌کنیم ولی با --hard همه چیز رو از دست می‌دیم؟

حسین: دقیقاً! به همین دلیل باید بدونی که هر کدوم از این دستورات چه کاری انجام می‌دن و در چه مواقعی باید ازشون استفاده کنی. همیشه قبل از استفاده از --hard مطمئن شو که تغییراتت رو نمی‌خوای. 🔗

مارال: 👩‍💼 خیلی خوب توضیح دادی حسین. این اطلاعات برای همه اعضای تیم خیلی مفیده. پیشنهاد می‌کنم یه مستند داخلی هم درباره این موضوعات تهیه کنیم تا همه بتونن بهش دسترسی داشته باشن.

حسین: 🙌 حتماً مارال جان. من می‌تونم یه مستند تهیه کنم و توش این موارد رو به همراه مثال‌های عملی قرار بدم. اینطوری همه می‌تونن بهتر یاد بگیرن و از این ابزارها به درستی استفاده کنن.

Citations: [1] https://stackoverflow.com/questions/3528245/whats-the-difference-between-git-reset-mixed-soft-and-hard [2] https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Git-reset-hard-vs-soft-Whats-the-difference [3] https://www.gitkraken.com/learn/git/git-reset [4] https://github.com/orgs/community/discussions/68224 [5] https://git-scm.com/docs/git-reset [6] https://www.youtube.com/watch?v=FklX-5_0qik