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

ساختار یک سیستم کنترل نسخهی ابتدایی
سیستم های کنترل نسخه ی محلی ( Local Version Conrtol System )
از همین جا جرقه ی سیستمها و ابزارهای کنترل نسخه زده شد! وقتی برنامه نویسان متوجه شدند که واقعا روش فایل و فولدری ( پوشه ) کارآمد نیست و خیلی اذیت میکنه ، بنابرین ابزاریو ساختن که بجای اینکه بیان و کل پروژه رو که حاوی فایل و فولدر پروژه بود ، کپی کنن توی یه فولدر واحد ، توی یه پایگاه داده ذخیره کنن که هر موقع خواستند به ( VersionControl System ) بگن که فلان نسخه رو برامون باز کن ، این امکان محیا شد که هر موقع خواستن به نسخهی قبل برگردن .
و اما مشکل این نوع سیستم هم اینجا بود که بر فرض مثال روی کامپیوتر محمد و یا روی کامپیوتر علی فقط جواب میداد و یا سایر کامپیوترها و برای پروژههای تیمی که که بتونن کدها خودشونو به اشتراک بذارن و حالا تیمی کار کنند ، ویرایش کنن ، تغییر ایجاد کنن ، این سیستم قدرت و کارایشو نداشت . البته اسمش هم روشه ( سیستمهای کنترل نسخهی محلی ) .
ساختار یک سیستم کنترل نسخهی محلی
سیستم های کنترل نسخه ی متمرکز ( Centralized Version Control System )
مشکلاتی که روش قبلی داشت که گفتیم برای پروژههای تیمی عملا این سیستم ( سیستمهای کنترل نسخهی محلی ) کارآمد نیست و قدرتش رو نداشت ، سیستمهای کنترل نسخهی متمرکز ( Centralized Version Control System ) به اختصار ( CVCS ) معرفی شدند که در این سیستمها بجای این که پروژه و کل تاریخچهی پروژه روی هارد توسعهدهندگان ( کامپیوتر شخصی ) ذخیره بشه ، پایگاه داده روی یک سرور ( کامپیوتری با منابع سختافزاری زیاد ) مرکزی ذخیره میشد و توسعهدهندگان هر زمانی که نیاز داشتن ، پروژه رو از سرور و پایگاه داده دریافت میکردند و بعد از این که خوب دل و رودهی پروژه رو درمیوردن دوباره روی سرور ذخیره میکردند .
و این امکان مشکل سیستمهای قبلی رو برطرف کرد که نمیشد به صورت تیمی کار کرد که
در سیستمهای کنترل نسخهی متمرکز چندین توسعه دهنده میتونستن روی یه پروژه کار کنن .
و اما بازم مشکل ، شاید با خودتون بگید بابا خسته شدیم دیگه از دست این همه مشکل! ولی دیگه تقریبا این آخرشه! این سیستم هم مشکلش این بوده که چندین توسعه دهنده روی یه فایل کار میکردند و خب دیگه مشکلش تابلوعه! اگه دو یا چند برنامه نویس روی یه فایل کار کنن و بعد بخوان روی سرور ذخیره کنن ، سیستم باید تغییرات کدوم از برنامه نویسهارو ذخیره کنه ؟ اولی ؟ دومی و یا سومی ؟ حق با کدوم برنامه نویسه ؟ البته اگه شانس بیاری دعوا نشه! 😅
توی این نوع سیستمهای کنترل نسخه ، مشکل به این صورت حل و فصل میشد که توسعه دهندها حقنداشتند که کار بقیه رو ( override ) ( بازنویسی ) کنند ، و باید به صورت دستی مشکل تداخل و ادغام رو حل میکردند ، یعنی سیستم کارهای نبود و خودشون باید این مشکل رو حل میکردند که خود این کلی از زمان توسعه رو میگیره ، البته اگه پروژه بزرگ باشه و هر روز پروژه بخواد توسط صدها برنامه نویس بروزرسانی بشه . که دیگه تهش معلومه که این روش برای پروژهای بزرگ اصلا جوابگو نیست ، چون پروژه بزرگ هستش و اگه قرار هر بار بیای مشکل تداخل و ادغام رو با بقیه حل کنی که دیگه باید خودت و تیمت پیر بشین تا پروژه رو توسعه بدین و یه نسخهی جدید بدین بیرون! خسته نباشی پیرمرد 😃 .
اما برای پروژههایی که مدت زمان توسعشون کمه و زیاد نسخهی جدیدت و آپدیت ( بروزرسانی ) براشون نیست ، و تعداد برنامه نویساشونم کمه کارآمد و جوابگو هست . دیگه حداقلش خوبه که اعصاب خوردکنی در مقابل پروژههای بزرگ نداری! ☺
چون توی پروژههای بزرگ هی باید مشکل تداخل و ادغام کد رو حل کنی و بشینی سر و کله بزنی که ببینی کد تو درسته یا همکارت .

ساختار سیستم کنترل نسخهی متمرکز
سیستم های کنترل نسخه ی توزیع شده ( Destributed Version Control System )
تقریبا میشه گفت مشکلاتی که سیستم های کنترل نسخهی قبلی ( متمرکز ) داشتند با روی کار اومدن سیستم های کنترل نسخه ی توزیع شده ( Destributed Version Control System ) به اختصار ( DVCS ) حل شد و این سیستم های کنترل نسخه نسل جدید تا به امروز هستن .
توی این سیستم های کنترل نسخه دیگه سرور مرکز وجود نداره و توسعه دهنده ها می تونن هر نسخه ای از پروژه رو روی سیستم خود داشته باشن و بعد از اینکه پروژه رو حسابی بهش َور رفتن ، با کدهای اصلی قاتی کنن ( ترکیب کنن ) ، البته اینجا هم تداخل به وجود میاد ، ولی اینکه بیای این تداخل رو برطرف کنی خیلی راحتتر و کارآمدتر از سیستم های کنترل نسخهی متمرکزه . توی این سیستمها هر توسعه دهندهای میتونه روی نسخهای از پروژه که به صورت (لوکال محلی ، ساده تر روی کامپیوتر هر شخص ) کار کنه و بعد از اینکه تغییراتشو داد ، روی سرور ذخیره کنه ، جدای از این سیستمهای توزیع شده ، تمرکز زیادی روی مدیریت شاخه ها دارن . در این صورت برنامه نویسا روی شاخهی جدا کدهای خودشون رو بروزرسانی میکنند و مشکل تداخل ، ادغام و بعلاوه اون اشتراک کد را آسون میکنه ( درمورد شاخهها در جلسات آینده صحبت میکنیم ) .
این سیستمها سرور - محور نیستن و اگه به هر دلیلی سرور مرکزی دچار مشکل شد ، نگران از دست دادن مخزن کد خود نیستیم و همچنین لازم نیست برای هر تغییری به سرور متصل بشیم و کدها خودمون رو بروز رسانی کنیم ، چون در این سیستمها نسخههای مختلفی رو سیستمها مختلف توزیع شده و سرعت توسعهی پروژه رو افزایش میده و هر وقت به سرور متصل شدیم و تغییرات رو دادیم ، میتونیم روی سرور ذخیره کنیم .
ساختار یک سیستم کنترل نسخهی توزیع شده
امیدوارم عزیزان مورد رضایتتون بوده باشه .