“version control” چیست و چرا باید برایتان مهم باشد؟ “version control” یک سیستم است که تغییرات ایجادشده در یک فایل یا مجموعهای از فایلها را در طول زمان ثبت میکند تا بتوانید نسخههای خاصی را بعداً بازیابی کنید. در مثالهای این کتاب، شما از کد منبع نرمافزار بهعنوان فایلهایی که تحت "version control" هستند استفاده خواهید کرد، هرچند در واقعیت میتوانید این کار را با تقریباً هر نوع فایلی در کامپیوتر انجام دهید.
اگر شما یک طراح گرافیک یا وب هستید و میخواهید هر نسخه از یک تصویر یا طرح را نگه دارید (که قطعاً هم همینطور است)، استفاده از یک "Version Control System (VCS)" انتخاب بسیار هوشمندانهای است. این سیستم به شما اجازه میدهد فایلهای خاصی را به وضعیت قبلی بازگردانید، کل پروژه را به حالت قبل برگردانید، تغییرات را در طول زمان با یکدیگر مقایسه کنید، ببینید چه کسی آخرین بار چیزی را تغییر داده که ممکن است باعث بروز مشکل شده باشد، چه کسی و چه زمانی یک اشکال را وارد کرده، و امکانات بیشتر. استفاده از یک VCS معمولاً به این معناست که اگر چیزی را خراب کردید یا فایلها را از دست دادید، میتوانید بهراحتی آنها را بازیابی کنید. علاوه بر این، همهی این امکانات را با سربار بسیار کمی به دست میآورید.
روش مورد علاقهی بسیاری از افراد برای "version control" این است که فایلها را در یک پوشهی دیگر کپی میکنند (اگر کمی زرنگتر باشند، در یک پوشه با نامگذاری زمانی). این روش بهدلیل سادگی بسیار رایج است، اما در عین حال بهشدت مستعد خطاست. خیلی راحت ممکن است فراموش کنید که در کدام پوشه هستید و به اشتباه فایل اشتباهی را بازنویسی کنید یا فایلهایی را کپی کنید که قصدش را نداشتید.
برای حل این مشکل، برنامهنویسان از مدتها پیش سیستمهای "local VCS" را توسعه دادند؛ سیستمهایی که دارای یک پایگاه داده ساده بودند و همهی تغییرات ایجادشده در فایلهایی که تحت کنترل نسخه بودند را ثبت میکردند.
یکی از محبوبترین ابزارهای "VCS" سیستمی به نام "RCS" بود که هنوز هم همراه با بسیاری از کامپیوترها عرضه میشود. "RCS" با نگهداری مجموعهای از پچ ها (یعنی تفاوتهای بین فایلها) در یک قالب خاص روی دیسک کار میکند؛ سپس میتواند با جمعکردن تمام این پچ ها، هر نسخهای از فایل را در هر نقطهای از زمان بازسازی کند.
چالش بزرگ بعدی که افراد با آن روبرو میشوند این است که نیاز دارند با توسعهدهندگانی روی سیستمهای دیگر همکاری کنند. برای حل این مشکل، سیستمهای "Centralized Version Control" یا "CVCS" توسعه یافتند. این سیستمها (مانند CVS، Subversion و Perforce) دارای یک سرور مرکزی هستند که تمام فایلهای نسخهبندیشده را در خود نگه میدارد، و تعدادی کلاینت که فایلها را از آن مکان مرکزی دریافت (checkout) میکنند. برای سالها، این روش بهعنوان استانداردی برای "version control" شناخته میشد.
این ساختار نسبت به "local VCS"ها مزایای زیادی دارد. برای مثال، هر کسی تا حدی میداند که سایر اعضای پروژه مشغول انجام چه کاری هستند. مدیران (administrators) میتوانند بهصورت دقیق کنترل کنند که چه کسی چه کاری انجام دهد، و مدیریت یک "CVCS" بسیار آسانتر از رسیدگی به پایگاهدادههای محلی روی هر کلاینت بهصورت جداگانه است.
با این حال، این ساختار معایب جدیای هم دارد. واضحترین ایراد، نقطهی شکست واحدی است که سرور مرکزی ایجاد میکند. اگر آن سرور برای یک ساعت از کار بیفتد، در طول آن مدت هیچکس نمیتواند همکاری کند یا تغییرات نسخهبندیشدهی خود را ذخیره کند. اگر دیسکی که پایگاهدادهی مرکزی روی آن قرار دارد خراب شود و نسخههای پشتیبان مناسبی تهیه نشده باشد، همهچیز را از دست خواهید داد — کل تاریخچهی پروژه بهجز تکنسخههایی که احتمالاً بعضی افراد روی سیستمهای محلیشان دارند. "local VCS"ها هم از همین مشکل رنج میبرند — هر زمان که کل تاریخچهی پروژه فقط در یک محل متمرکز باشد، خطر از دست دادن همهچیز وجود دارد.
در اینجا است که "Distributed Version Control Systems" یا "DVCS"ها وارد عمل میشوند. در یک "DVCS" (مانند Git، Mercurial یا Darcs)، کلاینتها فقط آخرین نسخهی فایلها را دریافت نمیکنند؛ بلکه آنها کل مخزن را همراه با تمام تاریخچهی آن بهطور کامل کپی میکنند. بنابراین، اگر هر سروری از بین برود و این سیستمها از طریق آن سرور با هم همکاری میکردند، هر یک از مخازن کلاینتها میتوانند دوباره روی سرور کپی شوند و آن را بازیابی کنند. هر clone در واقع یک نسخهی پشتیبان کامل از تمام دادهها است.
علاوه بر این، بسیاری از این سیستمها بهخوبی میتوانند با چندین مخزن راه دور (remote) بهصورت همزمان کار کنند؛ بنابراین شما میتوانید در یک پروژهی واحد، بهطور همزمان با گروههای مختلف از افراد، به روشهای متفاوتی همکاری کنید. این قابلیت به شما اجازه میدهد چندین نوع جریان کاری (workflow) مختلف را پیادهسازی کنید؛ جریانهایی که در سیستمهای متمرکز ممکن نیستند، مانند مدلهای سلسلهمراتبی (hierarchical models).


