احتمالا شما پیشتر به صورت ناخودآگاه از یک سیستم کنترل نسخه منحصربهفرد خود استفاده کردهاید. مثلا از اضافه کردن عدد به آخر فایل مثل (File1, File2,…) یا اضافه کردن تاریخ به نام آن فایل. ولی نگهداری تمام تغییرات کار به صورت دستی، طاقتفرسا و بیهوده است که ترجیحا بهتر است توسط ماشینها با دقت بیشتر انجام شود.
به طور کلی، میتوان این نرمافزارها را بر اساس مدل اشتراکگذاری به دو دسته متمرکز و غیرمتمرکز تقسیمبندی کرد. در سیستمهای متمرکز، تمام کاربران تغییرات خود را با یک سرور در میان میگذارند و آخرین تغییرات بقیه کاربران را از سرور میگیرند و تمام کاربرها، نسخهای مشابه آن چه در سرور هست دارند. در این دسته از سیستمها اگر سرور دچار مشکل شود، کاربرها دیگر نمیتوانند تغییر جدیدی به مخزن اضافه کنند. اگر سرور از دست برود و نسخه پشتیبانی از آن نباشد، تاریخچه پروژه از دست میرود. در حالی که در یک سیستم کنترل نسخه غیرمتمرکز، مخزن هر کاربر شامل نسخهای مستقل از بقیه کاربرهاست و هر کاربر میتواند نسخهای که در اختیار دارد را با هر نسخه دیگری ادغام کند و هر کس به تنهایی کل تاریخچه پروژه را دارد و حتی اگر سرور در دسترس نباشد هم کاربر میتواند کار خود را انجام دهد و تغییرات را به ثبت برساند.
در هر دو دسته، هنگامی که دو یا چند کاربر به صورت همزمان روی یک فایل تغییراتی را انجام میدهند، مشکل همگامسازی دادهها وجود دارد. سادهترین ولی ناکارآمدترین روش، سیستم قفلگذاری است، به این صورت که هر کاربر وقتی شروع به ایجاد تغییرات در فایلی میکند، آن فایل را برای بقیه کاربرها قفل میکند و بقیه کاربرها امکان تغییر دادن آن فایل را ندارند. بدیهی است که این روش تنها در سیستمهای متمرکز قابل اجراست.
روش دیگر که بسیار کارآمدتر است و بین نرمافزارها متداولتر ، روش ادغامکردن یا merge است. در سیستمهای متمرکز، هرگاه دو کاربر به صورت همزمان روی یک فایل تغییراتی را انجام دهند، هر کدام که زودتر تغییرات را ارسال کند، موفق میشود نسخه خودش را با نسخه سرور ادغام کند. در حالی که در سیستمهای غیرمتمرکز، کاربرها تنها زمانی که میخواهند نسخه خود را با نسخه یکی دیگر از کاربرها همگام کنند، نیازمند ادغام کردن هستند.
معروفترین و بهترین نرمافزار برای کنترل نسخه، نرمافزار «گیت» (git) است. این نرمافزار از دسته نامتمرکزها است که از روش ادغام کردن استفاده میکند و در خیلی از پروژههای معروف از جمله هسته کرنل لینوکس استفاده میشود. پروژه گیت توسط لینوس توروالدز خالق لینوکس شروع شده است و هماکنون نیز در حال توسعه است. از دیگر نرمافزارهای دسته نامتمرکزها میتوان به «مرکوریال» و «بازار» اشاره کرد. «SVN» و «CVS» نیز از جمله نرمافزارهای کنترل نسخه متمرکز هستند که از روشهای قفلگذاری و ادغام استفاده میکنند.دو نرمافزار SVN و CVS برای سالهای متمادی استفاده میشدند ولی به دلیل مشکلات متعدد امروزه کمتر استفاده میشوند (برای اطلاع بیشتر در مورد این ایرادها، به سخنرانی لینوس توروالدز در گوگل تک تالک مراجعه کنید).
تعدادی نرمافزار انحصاری هم در این حوزه هستند که معمولا به خاطر باگهای متعدد و ناکارآمد بودن، نادیده گرفته میشوند.
کنترل نسخه، نه تنها برای پروژههای برنامهنویسی، بلکه تقریبا برای تمام فایلها قابل استفاده است. برای مثال برای نوشتن همین مقاله میتوان از یک نرمافزار کنترل نسخه استفاده کرد. برای شروع، یک مخزن (repository) برای نگهداری تغییرات میسازیم و فایل مقاله را در آن اضافه میکنیم. حال پاراگراف شروع مقاله را اضافه میکنیم. تغییرات را اضافه (commit) میکنیم، در پیامی در مورد تغییرات توضیح میدهیم و در آخر به مخزن ارسال میکنیم.
حال اگر متوجه شویم که بعد از چند تغییر، در یکی از نسخهها، جملهای به اشتباه پاک شده است، با برگشتن در نسخههای قبلی و خنثی کردن تغییر مورد نظر، اشتباه را برطرف میکنیم.
در این مثال به صورت خیلی ساده، یک سناریوی استفاده از کنترل نسخه برای کار شخصی بیان شد. حال بیایید سناریو را کمی پیچیدهتر کنیم. مثلا اگر این مقاله چندین نویسنده و ویراستار داشته باشد، بعد از ایجاد نسخه مخزن، برسام و امید شروع به نوشتن دو قسمت مختلف مقاله میکنند. پس از چند تغییر، برسام، نسخه امید را با نسخه خودش ادغام میکند. حال برسام نسخهای شامل تغییرات امید و تغییرات خودش دارد.
در مثال بالا، مخزن، تغییرات هر نویسنده را به اسم آن نویسنده ذخیره میکند. این کار به ما امکان آن را میدهد تا ببینیم هر خط از مطلب را کدام نویسنده نوشته، یا تغییر داده است.
حال فرض کنیم که الان موعد ویراستاری مقاله است و مقاله هنوز کامل نشده است. ویراستار یک نسخه از سرور یا یکی از نویسندهها تهیه کرده و شروع به ویرایش مطلب میکند. نویسندهها هم همچنان در حال نوشتن ادامه مطالب هستند. پس از نوشته شدن آخرین تغییرات ویراستار، نسخه ویراستاری شده خود را با آخرین تغییرات نویسندهها همگام میکند و نوشتههای جدیدی که ویراستاری نشدهاند را ویراستاری میکند.
در تمام این سناریوها، اگر هر نویسنده یا ویراستاری خطا داشته باشد یا مطلبی حذف شده باشد، تغییرات آن در مخزن موجود است و میتوان آن را بازگرداند. همچنین میتوان نسخهها را نامگذاری کرد؛ بهطور مثال میتوان نسخههای قبل از ویراستاری و بعد از ویراستاری را از هم جدا کرد. از طرفی دیگر، با وجود داشتن مخزن تغییرات، اگر در آینده، نویسنده دیگری خواست این مطلب را گسترش دهد، میتواند با دسترسی به مخزن با روند کامل شدن و همچنین نویسندههای قبلی مقاله آشنا شود.
مطمئنا موارد پیچیدهتری نیز ممکن است رخ دهد، یک نرمافزار کنترل نسخه خوب مانند گیت میتواند تمام این سناریوهای ممکن را پشتیبانی کند. در موارد پیچیدهتر، ممکن است شما روشهای خاص خود را برای نحوه استفاده از گیت پیش بگیرید. بهترین منبع برای یادگیری گیت وبسایت رسمی آن یعنی git-scm.com است. همچنین اگر به یک سرور برای مخزن خود احتیاج دارید، میتوانید از سایتهای github یا bitbucket استفاده کنید. همچنین در این دو وبسایت، میتوانید به تعداد زیادی از پروژههای آزاد دسترسی داشته باشید.
فراموش نکنید وقتی یک مخزن به درد شما میخورد که شما به صورت مداوم تغییرات خود را اضافه کنید. مخزنی با یک یا دو کامیت، به درد هیچ کسی نمیخورد. سعی کنید از گیت به صورت ماژولار استفاده کنید یعنی برای هر قابلیتی که به صورت مستقل کار میکند، مخزن جدا بسازید. از پیامهای مناسب و درخور هر تغییر برای کامیتهای خود استفاده کنید. همچنین آگاه باشید که ابزارهایی اضافی برای ویرایشگر شما ایجاد شدهاند که میتوانید از آنها استفاده کنید. برای اکثر ویرایشگرهای معروف، ابزار کارکردن با گیت وجود دارد.