بیشترین موارد استفاده از گیت ( Git )

آفلاین
user-avatar
عرفان حشمتی
26 فروردین 1400, خواندن در 12 دقیقه

در این مقاله برخی از ویژگی‌های کمتر شناخته شده اما بسیار مفید در Git را بررسی خواهیم کرد. شما یاد می‌گیرید که چگونه کامیت‌های حذف شده را بازیابی کنید، سابقه آنها را پاک کنید، از ماژول‌ها برای مدیریت کد شخص ثالث و نوشتن کامیت با دقت بالا همراه با یک صفحه تقلب گیت استفاده کنید.

امروزه روند همکاری در یک پروژه به نوعی سیستم کنترل نسخه مانند Git وابسته است. دانستن و تسلط بر گیت به شما کمک می‌کند تا به یک توسعه دهنده بهتر تبدیل شوید، روند کار برنامه نویسی خود را تقویت کنید و کیفیت پایه کد خود را واقعا بهبود ببخشید. با این حال این کار نیاز به خارج شدن از منطقه راحتی دارد که همه ما با آن آشنا هستیم. همانطور که مشخص شد Git چیزی فراتر از commit، push و pull است.

برخی از توسعه دهندگان به اصول اصلی درگیت وفادار می‌مانند و این کاملا قابل درک است. در دنیای فرانت-اند موارد بسیار پیچیده‌ای برای بهتر شدن وجود دارد، که صادقانه بگویم Git اغلب از اولویت بالایی برخوردار نیست. فرضا بسیاری از تکنیک‌های ارزشمندی که می‌توانند روند کار یک توسعه دهنده را تقویت کنند، مورد توجه قرار نمی‌گیرند و به ندرت کشف می‌شوند.

در ادامه چهار ابزار پیشرفته Git را معرفی خواهیم کرد و امیدواریم این انگیزه‌ای باشد تا شما بیشتر در مورد Git تحقیق کنید و بیاموزید.

بازیابی کامیت‌های حذف شده

شما قبول کرده‌اید که در یک بن بست گیر افتاده‌اید؛ زیرا دو کامیت آخرتان به جایی نمی‌رسند. قابل درک است که بخواهید آنها را لغو کرده و از ابتدا شروع کنید.

اگر بخواهید یک کامیت حذف شده را بازیابی کنید، چه کار می‌کنید؟ اینجاست که Reflog به کمکتان می‌آید

در زیر یکی از راه‌های انجام این کار ذکر شده است:

$ git reset --hard 2b504be

اما بگذارید این را هم بگوییم که لحظاتی بعد متوجه می‌شوید که اشتباهی رخ داده است. در واقع کامیت‌ها حاوی داده‌های مهمی بودند و شما کار ارزشمند خود را از دست داده‌اید. قطعا دچار استرس می‌شوید و قلبتان شروع به تپیدن می‌کند!

حال سوال کلیدی این است: چگونه می‌توانیم آن کامیت‌های به ظاهر حذف شده را بازگردانیم؟ خوشبختانه یک پاسخ وجود دارد و آن هم "Reflog" است.

استفاده از Reflog برای بازیابی عبارات از دست رفته

شما می‌توانید Reflog را به عنوان دفتر خاطرات Git در نظر بگیرید. این مکانی است که Git از هر حرکت اشاره گر HEAD یک پیش نویس می‌گیرد. به عبارت دیگر همه کارهای جالب‌تر مانند commit، merge، chekout، rebase، cherry-pick و سایر موارد. البته این ویژگی‌ها آن را به ابزاری مناسب برای موقعیت‌های اجتناب ناپذیر هنگامی که اوضاع وخیم می‌شود، تبدیل می‌کند.

بیایید Reflog را برای سناریوی مثال خود باز کنیم و ببینیم چگونه می‌تواند به ما کمک کند:

$ git reflog

یک یادداشت کامل از همه کامیت‌ها، قبل و بعد از اشتباه

اولین و مهمترین نکته‌ای که باید در مورد Reflog بدانید این است که به ترتیب زمانی سفارش داده شده است. در واقع بالاترین (جدیدترین) مورد، همان اشتباه ماست وقتی که با عجله از تنظیم مجدد git استفاده کرده و برخی از کامیت‌های خود را از دست داده بودیم.

راه حل این مشکل بسیار آسان است. ما می‌توانیم به سادگی پیش از مرتکب شدن این اشتباه به حالت قبل برگردیم. و این عبارت به وضوح در Reflog، درست در زیر دستور reset نوشته شده است. برای برطرف کردن اشتباه می‌توانیم به منظور بازگرداندن این عبارت به ظاهر از دست رفته، یک بار دیگر از تنظیم مجدد گیت استفاده کنیم:

$ git reset e5b19e4

بنابراین می‌توانید کمی سریعتر همان نتیجه را به دست آورید. ما به عنوان یک گروه از توسعه دهندگان رابط کاربری گرافیکی دسکتاپ Git، هدفمان حل مشکلات مشترک در مورد گیت است. پس در این ابزار کوچک، با زدن Ctrl+Z می‌توانید به همان نتایج برسید. گویی که می‌خواهید یک اشتباه تایپی ساده را در ویرایشگر متن خود اصلاح کنید. در واقع کلید میانبر یکسانی برای برخی از اقدامات مختلف در دسترس است. به عنوان مثال وقتی یک branch را به اشتباه حذف کرده‌اید، یک merge اشتباه انجام داده‌اید یا در branch اشتباهی کامیت کرده‌اید.

پاک کردن تاریخچه کامیت‌ها

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

پاک کردن کامیت‌ها قبل از اینکه آنها را در شاخه تیم ادغام کنید، هنگامی مهم است که بخواهیم یک کد سالم داشته باشیم و ابزار "Interactive Rebase" بهترین راه برای رسیدن به این هدف است.

Interactive Rebase به شما امکان می‌دهد کامیت‌ها را حذف کنید، آنها را مرتب کنید، چندین کامیت را در یکی ادغام کرده و یا یک کامیت بزرگ را به چندین مورد کوچک تقسیم کنید. در این مقاله به عنوان نمونه فقط بررسی کردیم که چگونه یک کامیت قدیمی را که دیگر نیازی به آن ندارید حذف کنید.

بگذارید بگوییم که ما دیگر کامیت زیر را نمی‌خواهیم (زیرا شامل داده‌های حساسی است که از ابتدا نباید کامیت می‌شدند):

انتخاب کامیت برای حذف از تاریخچه - به عنوان مثال اگر حاوی داده‌های حساس باشد

برای اصلاح این اشتباه یک Interactive Rebase را پیاده سازی می‌کنیم:

git rebase -i 2b504be

سپس یک پنجره ویرایشگر باز می‌شود و به ما امکان می‌دهد قسمت انتخاب شده از تاریخچه کامیت‌های خود را دستکاری کنیم:

علامت گذاری کامیت با drop، آن را از تاریخچه حذف می‌کند

از آنجا که می‌خواهیم کامیتی را حذف کنیم، به سادگی خط مربوطه را در ویرایشگر با کلمه کلیدی drop action مشخص می‌کنیم. هنگامی که "Save" را در ویرایشگر خود قرار دادیم و پنجره را بستیم، Interactive Rebase تکمیل شده و کامیت ناخواسته از بین خواهد رفت.

نکته قابل توجه: اگر از GUI دسکتاپ مانند Tower استفاده می‌کنید، می‌توانید یک میانبر داشته باشید. به سادگی بر روی کامیت کلیک راست کرده و از منو گزینه "Delete from" را انتخاب کنید.

حذف کامیت تأثیری بر پایه کد نخواهد داشت و فقط آن را از تاریخچه حذف می‌کند

همانطور که در بالا ذکر شد، Interactive Rebase موارد استفاده بسیار بیشتری برای ارائه دارد. اگر می‌خواهید درباره Interactive Rebase و کارهایی که می‌تواند انجام دهد بیشتر بدانید، نگاهی به "First Aid Kit for Git" بیندازید. مجموعه‌ای از فیلم‌های کوتاه، مفید و رایگان در مورد برطرف کردن اشتباهات در گیت .

استفاده از زیرماژول‌ها برای مدیریت کد شخص ثالث

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

از لحاظ تئوری می‌توانید به سادگی فایل‌های لازم را در پروژه خود کپی و پیست کنید و سپس آنها را به پایگاه کد خود متصل کنید. اما این با چند نکته منفی همراه است. از همه مهمتر هنگامی که نسخه‌های جدید در دسترس هستند، به روزرسانی کد شخص ثالث برای شما بسیار سخت خواهد بود. باید کد را دوباره بارگیری کرده و آن را کپی و پیست کنید - بارها و بارها باید این کار را انجام دهید!

به علاوه اگر چندین پروژه (پروژه واقعی خود و تمام کتابخانه‌های شخص ثالثی که ممکن است به آنها نیاز داشته باشید) را در یک مخزن Git فشرده کنید، این کار اشتباه است. زیرا کد خارجی را با فایل‌های منحصر به فرد پروژه ترکیب می‌کند.

یک روش بسیار بهتر برای این کار استفاده از ساختار زیرماژول‌ها در گیت است. این به شما امکان می‌دهد کد شخص ثالث را به سادگی به عنوان مخزن Git در پروژه واقعی خود قرار دهید. بدان معنی است که همه کدهای اصلی به طور منظم از هم جدا شده‌اند.

وارد کردن یک ماژول / کتابخانه شخص ثالث به راحتی با اجرای دستور زیر امکان پذیر است:

$ git submodule add https://github.com/djyde/ToProgress

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

مسلما استفاده از زیرماژول‌ها در عمل، موضوعی کاملا پیچیده هستند. اگر می‌خواهید آنها را کمی دقیق‌تر درک کنید، به بخش "Submodules" یادگیری کنترل نسخه با گیت مراجعه کنید.

نوشتن دقیق کامیت‌ها

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

در عمل این بدان معنی است که شما برای هر موضوعی کامیت جداگانه ایجاد می‌کنید. حتی اگر این فقط یک رفع اشکال کوچک باشد که در آن فقط یک نقطه ویرگول تغییر می‌یابد. این موضوع مربوط به خودش است، بنابراین توسط خودش کامیت می‌شود.

اما در دنیای واقعی ما اغلب فقط در یک موضوع همزمان کار نمی‌کنیم.یا اینکه فکر می‌کنیم این کار را انجام می‌دهیم ولی در نهایت بعدها متوجه خواهیم شد که کدمان در واقع شامل سه موضوع متفاوت بوده است.

این زمانی است که افزودن یک فایل کامل به کامیت بعدی دیگر بهترین استراتژی نیست.

تقسیم بندی قسمت‌های انتخاب شده فایل‌های تغییر یافته

در مثال زیر می‌بینید که ما در حال حاضر دو قطعه برای اصلاح در فایل imprint.html خود داریم:

مرحله بندی قسمت‌های انتخاب شده در فایلهای تغییر یافته

بگذارید بگوییم که بخش اول مربوط به یک موضوع است (شاید ما در مرحله unifying و پاکسازی عناوین صفحه در پروژه خود هستیم). همچنین تکه دوم به یک موضوع کاملا غیر مرتبط دیگر مربوط می‌شود.

یک git add imprint.html، به معنی اضافه کردن کل فایل به تقسیم بندی است و تمام تغییرات آن را در یک کامیت قرار می‌دهد. بنابراین همکاران ما در درک اینکه این کامیت خاص واقعا چیست، مشکل دارند. با دیدن برخی عناوین که تغییر می‌کنند، ممکن است فکر کنند که این فقط مربوط به پروژه پاکسازی عنوان است، اما ممکن است در هر صورت دیگر تغییرات را نادیده بگیرند.

خوشبختانه گیت به ما اجازه می‌دهد تکه‌هایی را که می‌خواهیم در کامیت بعدی قرار دهیم دقیقا انتخاب کنیم. تنها کاری که باید انجام دهیم افزودن دستور -p به git add است:

$ git add -p imprint.html

دقیقا تکه‌هایی را انتخاب کنید که می‌خواهید در کامیت بعدی قرار دهید

اکنون میبینید Git دست ما را گرفته و از طریق تک تک تغییرات موجود در فایل، ما را راه می‌اندازد. و برای هر کدام، یک سوال ساده از ما می‌پرسد: "Stage this chunk?"

Y را برای yes به عنوان مورد اول و N را برای no به عنوان مورد دوم تایپ می‌کنیم. وقتی واقعا کامیت خود را انجام دادیم، فقط اولین بخش تغییرات در آن گنجانده خواهد شد. مورد دوم به عنوان یک تغییر محلی در نسخه کار ما برای یک کامیت جداگانه باقی می‌ماند.

اگر از Git در GUI دسکتاپ استفاده می‌کنید، ممکن است بتوانید این کار را از طریق رابط کاربری انجام دهید:

تقسیم‌بندی بخش‌ها نیز در GUI دسکتاپ امکان پذیر است

جمع بندی

این مقاله فقط نگاهی اجمالی به برخی از ویژگی‌های پیشرفته گیت بود. اما من صمیمانه امیدوارم که به خوبی نشان داده باشد Git دارای این همه ویژگی قدرتمند است. از Rebase Interactive گرفته تا Submodules و حتی Reflog و File History. یادگیری این ویژگی‌های پیشرفته هزینه دارد زیرا این موارد به شما کمک می‌کند تا بازده بیشتری داشته باشید و اشتباهات کمتری مرتکب شوید.

اگر می‌خواهید عمیق‌تر وارد این موضوع شوید، در اینجا منابع مفید و رایگان آورده شده است:

  • Git Cheat Sheet

اگر می‌خواهید مهمترین دستورات را در دست داشته باشید، Git Cheat Sheet می‌تواند برای شما مناسب باشد. به زبان‌های انگلیسی، آلمانی، اسپانیایی، پرتغالی، عربی و چینی موجود است.

  • Undoing Mistakes

Git یک سیستم کامل برای مواردی است که دچار اشتباه می‌شوید. یادگیری در مورد ویژگی‌های مختلف undo در گیت برای هر توسعه دهندهای لازم و ضروری است.
First Aid Kit for Git مجموعه‌ای از فیلم‌های کوتاه و یک معرفی عالی را ارائه می‌دهد.

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
عرفان حشمتی @heshmati74
مهندس معماری سیستم های کامپیوتری، طراح و توسعه دهنده وب سایت
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو