سیستم کنترل نسخه چیست؟ – راهنمای کاربردی
میتوان به جرات گفت که کد منبع تقریبا برای همه پروژههای نرمافزاری، حکم تاج پادشاهی را دارد و در واقع، یک دارایی بسیار گرانبها است که باید از ارزش آن محافظت کرد. برای اغلب تیمهای نرمافزاری، کد منبع یک مخزن از دانش و اطلاعات فوقالعاده گرانبها پیرامون دامنه مسئله (Problem Domain) است که توسعهدهندگان نرمافزار، آن را با تلاشهای خود گردآوری و پالایش کردهاند. کنترل نسخه، از کد منبع در مقابل فجایع و تخریبهای گاه به گاهی که خطای انسانی منجر به ایجاد آن شده است و عواقب ناخواسته آن جلوگیری میکند.
سیستم کنترل نسخه چیست ؟
«سیستمهای کنترل نسخه» (Version Control Systems) دستهای از ابزارهای نرمافزاری هستند که به یک تیم نرمافزاری کمک میکنند تا تغییراتی که در طول زمان روی «کد منبع» (Source Code) انجام میشود را مدیریت کنند. نرمافزار کنترل نسخه، هر ویرایش و تغییری در کد را روی نوع خاصی از «پایگاه داده» (Database) ردیابی میکند. بنابراین اگر اشتباهی در تغییر کدها اتفاق بیفتد، توسعهدهندگان میتوانند زمان را به عقب بازگردانند و نسخههای اولیه کد را با نسخه دارای مشکل مقایسه کنند. این کار به رفع اشتباهات تیم با کمترین سطح از سختی، کمک میکند.
توسعهدهندگان نرمافزاری که در تیمهای کاری روی پروژهها کار میکنند، به طور مداوم کد منبعهای جدیدی مینویسند و کد منبع موجود را تغییر میدهند. کد منبع یک پروژه، برنامه کاربردی یا مولفه نرمافزاری در یک ساختار پوشهای یا «درخت فایل» (File Tree) سازماندهی شده است. در یک پروژه نرمافزاری، یک توسعهدهنده در تیم ممکن است روی ویژگیهای جدید کار کند، در حالی که توسعهدهنده دیگری ممکن است روی اصلاح یک «اشکال» (Bug) با انجام تغییراتی در کد، کار کند. هر یک از توسعهدهندهها تغییرات خود را در بخشهای مختلفی از درخت فایل ایجاد میکنند.
کنترل نسخه به تیمها برای حل این نوع از مسائل، پیگیری هرگونه تغییر انجام شده توسط مشارکتکنندگان و پیشگیری از وقوع ناسازگاری و تناقض در کارهایی که به صورت همزمان انجام میشوند کمک میکند. تغییراتی که در یک بخش از نرمافزار انجام میشوند، ممکن است با تغییرات دیگری ناسازگار باشد که به وسیله توسعهدهنده دیگری در همان زمان انجام شده است.
این مسئله را باید به شیوهای منظم و بدون مسدود و متوقف کردن کار بقیه اعضای تیم حل کرد. علاوه بر این، در همه توسعههای نرمافزاری، هر تغییری ممکن است منجر به ایجاد باگهای جدید شود و نرمافزار جدید تا هنگامی که تست نشده، قابل اعتماد نیست. بنابراین، تست و توسعه تا هنگامی که یک نسخه جدید آماده شود، با هم به پیش میروند.
یک نرمافزار کنترل نسخه خوب، از جریانهای کاری مورد نظر کاربر، بدون تحمیل یک راه خاص کار کردن، پشتیبانی میکند. چنین نرمافزاری در حالت ایدهآل، روی هر پلتفرمی کار میکند و به توسعهدهنده دیکته نمیکند که از چه سیستمعامل یا ابزارهایی استفاده کند. همچنین، یک سیستم کنترل نسخه خوب، جریان روان و پیوسته تغییرات روی کد را تسهیل میکند و فاقد مکانیزمهای ناامیدکننده و دست و پاگیر قفل کردن فایل است که طی آنها، امکان ویرایش به یک توسعهدهنده داده میشود و بقیه توسعهدهندگان مسدود میشوند و امکان کار روی آن بخش از کد را ندارند.
تیمهای نرمافزاری که از هیچ نوعی از کنترل نسخه استفاده نمیکنند، دچار مشکلاتی مانند عدم آگاهی از اینکه کدام بخش از تغییرات انجام شده در دسترس کاربران هستند و یا ایجاد تغییراتی میشوند که منجر به ناسازگاری بین دو بخش نامرتبط از کار میشود و بنابراین، دردسرهای آتی و نیاز به اصلاحات مجدد کد را در پی دارد. اگر فرد یک توسعهدهنده وب است که تاکنون هرگز از کنترل نسخه استفاده نکرده، احتمالا فایلهای خود را با دادن اسامی و پسوندهایی مانند «Final» و «Last» نامگذاری کرده و همین موجب شده تا طی انجام پروژه و پیشرفت آن، فایلهای «LastFinal» ،«NewFinal» و چنین مواردی را داشته باشد.
برنامهنویس ممکن است بلوکهای کد خود را با این هدف که میخواهد کارکردهای خاصی را بدون حذف کد (و شاید به صورت موقت) غیر فعال کند، به صورت «توضیحات» (Comment) درآورده باشد. دلیل این امر گاه این موضوع است که فرد نگران آن است که بعدا به این بخش از کد نیاز پیدا کند و بنابراین آن را حذف نمیکند. کنترل نسخه، راهکاری برای حل چنین مشکلات و مسائلی است. نرمافزار کنترل نسخه، یک بخش مهم و حیاتی از فعالیتهای روزانه تیمهای توسعه نرمافزاری است. توسعهدهندگان نرمافزاری نیز که به تنهایی در کارهای تیمی خود عادت به کار کردن با یک سیستم کنترل نسخه توانمند دارند، معمولا از ارزش بسیاری زیادی که کنترل نسخه در پروژههای کوچک به آنها میدهد آگاه هستند. هنگامی که توسعهدهنده به مزایای قدرتمند کار با سیستمهای کنترل نسخه عادت کرد، حتی برای پروژههای غیر نرمافزاری (مانند نوشتن کتاب، پایاننامه و مقاله) نیز از آن استفاده میکند.
مزایای سیستم های کنترل نسخه
توسعه نرمافزار بدون استفاده از کنترل نسخه، مانند عدم تهیه نسخه پشتیبان، کار پرمخاطرهای است. کنترل نسخه میتواند توسعهدهندگان را قادر به حرکت سریعتر کند و به تیمهای نرمافزاری امکان حفظ کارایی و چابکی را همگام با بزرگترین شدن تیم و اضافه شدن توسعهدهندگان جدید به آن، میدهد.
«سیستمهای کنترل نسخه» (Version Control Systems | VCS) طی چند دهه اخیر شاهد بهبودهای قابل توجهی بودهاند. برخی از VCSها، بهتر از برخی دیگر هستند. سیستم کنترل نسخه، گاهی نیز با عنوان ابزارهای «مدیریت کد منبع» (Source Code Management | SCM) یا «سیستم کنترل بازنگری» (Revision Control System | RCS) شناخته میشود. یکی از محبوبترین ابزارهای سیستم کنترل نسخه، نرمافزار گیت است. گیت، یک «سیستم کنترل نسخه توزیع شده» (Distributed VCS) (دستهای که با عنوان DVCS شناخته شده است) محسوب میشود. در بخشهای بعدی این مطلب، به طور کامل به گیت پرداخته خواهد شد.
همچون دیگر انواع سیستمهای کنترل نسخه محبوبی که این روزها در دسترس توسعهدهندگان هستند، گیت نیز رایگان و اوپن سورس است. صرفنظر از اینکه نام این سیستمها چیست و کدام سیستم توسط کاربر استفاده میشود، مزایای اولیهای که از سیستم کنترل نسخه انتظار میرود، به شرح زیر است.
- تاریخچه کامل و بلند مدت از هر فایل: این یعنی همه تغییراتی که توسط کلیه افراد و طی سالها روی هر فایلی انجام شده، موجود خواهد بود. این تغییرات شامل ساختن و حذف فایلها و همچنین، ویرایش محتوای آنها میشود. ابزارهای VCS گوناگون، در چگونگی مدیریت تغییر نام و جابجایی فایلها با یکدیگر متفاوت هستند. این تاریخچه ممکن است شامل نام پدیدآورنده، تاریخ و یادداشتهای نوشته شده پیرامون هر تغییر شود. داشتن تاریخچه کامل، امکان بازگشت به نسخههای پیشین را برای کمک به تحلیلهای ریشهای اشکالات (باگها) فراهم میکند و هنگامی که نیاز به رفع اشکال در نسخههای قدیمیتر نرمافزار است، قابلیتی حیاتی محسوب میشود. اگر نرمافزار به طور فعالانهای کار کند، تقریبا هر چیزی را میتوان به عنوان نسخه قدیمیتر نرمافزار در نظر گرفت.
- امکان انشعاب و ادغام: به کار گرفتن اعضای یک تیم پروژه نرمافزاری به گونهای که به صورت همزمان روی یک پروژه کار کنند، کار عاقلانهای نیست؛ مگر آنکه تلاشهای هر فرد روی جریانهای کاملا مستقل تغییرات، مزایای خودش را داشته باشد. ساخت یک انشعاب در سیستم کنترل نسخه، چندین جریان کاری را مستقل از یکدیگر نگه میدارد و در عین حال، امکان ادغام این تلاشها با یکدیگر را فراهم میکند. این امر، توسعهدهندگان را قادر میسازد تا تایید کنند که تغییرات در هر شاخه، با دیگر شاخهها ناسازگار نیستند. بسیاری از تیمهای نرمافزاری، امکان انشعاب برای هر ویژگی یا حتی انشعاب برای هر «انتشار» یا هر دو این موارد را فراهم میکنند. جریانهای کاری متفاوتی وجود دارد که تیمها میتوانند هنگام تصمیمگیری پیرامون چگونگی استفاده از تسهیلات انشعاب و ادغام در سیستمهای کنترل نسخه، از میان آنها انتخاب کنند.
- قابلیت ردیابی: وجود قابلیت ردیابی برای پیگیری هر تغییری که در نرمافزار انجام شده و مرتبط کردن آن به مدیریت پروژه و نرمافزارهای ردیابی باگ مانند «جیرا» (Jira) و وجود توانایی حاشیهنویسی برای هر تغییر با متنی که هدف و نیت تغییر را مشخص میکند، به تحلیل ریشهای دلایل تغییر کمک میکند. داشتن تاریخچه حاشیهنویسی شده برای ردپای توسعهدهنده، در هنگام خواندن کد برای فهمیدن کاری که انجام میدهد و دلیل طراحی آن به این صورت، به توسعهدهنده کمک میکند که تغییرات درست و هماهنگی را انجام دهد که با طراحی بلند مدت مورد نظر سیستم سازگار است. این ویژگی، به طور ویژه برای کار کردن موثر با کدهای موروثی نیست و در توانمندسازی توسعهدهندگان برای تخمین کارهای بعدی با هر میزانی از صحت، نقش حیاتی دارد.
در حالی این امکان برای توسعهدهندگان وجود دارد که بدون استفاده از هر سیستم کنترل نسخهای کار کنند، انجام چنین کاری پروژه را در خطر بزرگی قرار میدهد ک هیچ تیم تخصصی نمیتواند پذیرای آن باشد. بنابراین، اکنون پرسشی که مطرح میشود این است که از کدام سیستم کنترل نسخه باید استفاده کرد. انواع مختلفی از سیستمهای کنترل نسخه وجود دارد و برای هر یک از این انواع نیز نمونههای گوناگونی موجود است؛ اما توصیه این مطلب، استفاده از سیستم کنترل نسخه گیت (Git) است.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش گیت (Git) برای مدیریت نسخه توزیع شده
- مجموعه آموزشهای ابزارهای مهندسی کامپیوتر
- راهنمای پیشرفته Git برای مبتدیان — به زبان ساده
- 1۰ دستور گیت (Git) که باید آنها را بدانید — فهرست کاربردی
^^
عالی
برای یک مبتدی خیلی نامفهوم بود و فقط میشد یه ایده کلی بدست آورد که در چهار خط هم قابل انتقال بود. احساس میکنم ترجمه Technical term ها موجب گمراهی متن شده.