انواع سیستم‌های ورژن کنترل


در این آموزش قصد داریم تا دو سیستم ورژن کنترل معروف که عبارتند از Subversion و Git را مقایسه کنیم. Subversion که به اختصار SVN نیز خوانده می شود یک سیستم کنترل نسخه ی اصطلاحاً Centralized یا «متمرکز» است. به عبارت دیگر، تمامی اعضای تیم توسعه ی نرم‌افزار روی یک نسخه ی واحد که روی سروری خاص قرار دارد کار می کنند. وقتی توسعه‌دهنده ای اقدام به دریافت یک نسخه از پروژه از روی سرور می کند، اس وی ان آخرین نسخه از پروژه را در اختیار وی قرار خواهد داد.

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

ساختار Repository و URL
Repository (ریپازیتوری یا منبع) در سیستم ورژن کنترل اس وی ان از یکسری دایرکتوری هایی تشکیل شده است که آشنایی با آن‌ها خالی از لطف نیست. Trunk به دایرکتوری اصلی پروژه اطلاق می شود، Branch (برنچ یا شاخه)برای مشخص سازی نسخه های مختلف در نظر گرفته می‌شود و Tag هم به منظور برچسب زدن روی برخی نسخه های خاص مورد استفاده قرار می گیرد. برای دستیابی به این بخش‌های مختلف یک ریپازیتوری، از آدرس‌های URL به شکل زیر استفاده می شود:

svn+ssh://svn@example.com/svn/trunk

ریپازیتوری های سیستم ورژن کنترل گیت صرفاً از یک فولدر تحت عنوان git. تشکیل شده‌اند که داخل فولدر اصلی یک پروژه قرار می گیرد. به منظور دستیابی به Branch ها یا Tag های مختلف یک پروژه، به جای آدرس URL می بایست از Command (کامند یا دستور) های گیت استفاده کنیم. یو آر ال یک پروژه در سیستم ورژن کنترل گیت به شکل زیر خواهد بود:

ssh://git@example.com/path/to/git-repo.git

برنچ
معنی لغوی Branch «شاخه» است و برای درک بهتر این موضوع، می‌توان پروژه ی اصلی را به مثابه ی یک درخت تلقی کرد که روی هر شاخه ی آن می‌توان هر چیزی که تمایل داشته باشیم ایجاد کرده و این در حالی است که هر شاخه مجزا از سایر شاخه ها می‌تواند مورد استفاده قرار گیرد. همان‌طور که قبلاً توضیح داده شد، در سیستم ورژن کنترل اس وی ان، دایرکتوری هایی که دارای معنای خاصی هستند -مثلا به زمان یا تغییرات خاصی اشاره می کنند- تحت عنوان برنچ شناخته می شوند. زمانی که یک برنچ جدید می سازیم، ما یک کپی از کل پروژه در یک فولدر جدید ساخته ایم.

در سیستم ورژن کنترل گیت، برنچ معنای متفاوتی نسبت به اس وی ان دارا است. در گیت، برنچ به بخش خاصی از یک نسخه اشاره می‌کند بنابراین، به هیچ وجه هیچ گونه کپی جدید از پروژه، دایرکتوری های جدید و فایل‌های جدیدی از روی پروژه ی اصلی ساخته نخواهد شد. در سیستم گیت، به محض ایجاد یک پروژه، یک برنچ هم به صورت پیش‌فرض تحت عنوان Master یا «اصلی» ایجاد می‌گردد و شما به عنوان یک توسعه دهنده، همواره روی یک برنچ در گیت کار می کنید. پروژه ای که روی آن کار می کنید، حاوی فایل‌هایی است که متعلق به برنچ فعال اصلی که اصطلاحاً Head نامیده می‌شود می‌باشند و کلیه ی نسخه ها و برنچ های دیگر در ریپازیتوری لوکال -سیستم خودتان- ذخیره خواهند شد.

آشنایی با مفهوم Commit در ورژن کنترل
زمانی که در سیستم اس وی ان چیزی را Commit (کامیت به معنی سپردن) می کنیم، شرایطی خاصی برقرارند که عبارتند از:

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

کامیت کردن در گیت تا حدودی متفاوت است. برخی خصوصیات کامیت در گیت عبارتند از:
- برای کامیت کردن، شما اصلاً نیازی به آنلاین بودن و داشتن ارتباط با ریپازیتوری اصلی نخواهید داشت چرا که نسخه ی کامل و جامعی از پروژه روی سیستم لوکال شما قرار دارد. لذا کامیت ها در ریپازیتوری لوکال شما ثبت شده و صرفاً زمانی که خودتان تصمیم بگیرید، به ریپازیتوری اصلی یا آنلاین انتقال خواهند یافت.
- صرفاً به این خاطر که یک فایل تغییر کرده است بدان معنا نیست که فایل مد نظر به صورت خودکار می بایست در کامیت بعدی در نظر گرفته شود. خود توسعه‌دهنده می بایست تغییراتی که مد نظرش هستند را مشخص کند تا در کامیت در نظر گرفته شوند.
- از آنجا که کامیت ها در ریپازیتوری لوکال توسعه‌دهنده که آفلاین است اعمال می شوند، سیستم گیت قادر نخواهد بود تا مشخص کند مثلاً کامیت شماره 5 متعلق به کدام توسعه‌دهنده است. لذا شماره های نسخه های مختلف در گیت اصطلاحاً Hash یا «رمزنگاری» می‌شوند تا هر کامیت دارای یک شناسه منحصر به فرد باشد.

به اشتراک گذاری
در اس وی ان، پروژه ی شما زمانی که آن را کامیت می کنید به صورت خودکار به سرور مرکزی انتقال داده خواهد شد و کامیت کردن صرفاً زمانی امکان‌پذیر است که شما با سرور مرکزی ارتباط آنلاین داشته باشید اما در گیت هیچ چیزی به صورت خودکار به سرور اصلی سپرده نخواهد شد و این توسعه‌دهنده است که تصمیم می‌گیرد که برنچ با اعضای تیم به اشتراک گذاشته شود یا خیر!

علاوه بر این، به اشتراک گذاری پروژه کاملاً ایمن است، Conflict (کانفلیکت یا تداخل) صرفاً روی سیستم لوکال توسعه‌دهنده ایجاد می‌شود و هرگز اتفاق بدی برای پروژه ی قرار گرفته روی سرور نخواهد افتاد! همین مسأله منجر می‌گردد که برنامه نویسان مبتدی با خیال راحت کار کنند و هرگز نگران این نباشند که سهواً پروژه ای که روی ریپازیتوری اصلی قرار گرفته است را خراب کنند.


لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
minever
minever
۱۳۹۵/۰۱/۱۸
salam, mamnoon babate site khobeton
khate dovom Centralized be mani motemarkez mibashad na Certralized
جناب سرهنگ
جناب سرهنگ
۱۳۹۴/۱۱/۲۹
سلام در قسمت به اشتراک گذاری پاراگراف اول خط آخر نوشته : //این توسعه‌دهنده است که تصمیم می‌گیرد که برنچ با اعضای تیم به اشتراک گذاشته شود یا خیر! //فک کنم منظور از برنچ کامیت باشه که اشتباهی نوشته شده درسته ؟؟؟
امیر
امیر
۱۳۹۴/۱۱/۲۶
سلام آیا میتونیم نتیجه بگیریم که حجم اطلاعاتی روش git از روش svn به مراتب بیشتره ؟
کاوه
کاوه
۱۳۹۴/۱۱/۱۱
دو خط بالا تر از Title اشتراک گذاری به جای کلمه لذا نوشتید لذت لطفا اصلاح کنین.باتشکر از آقای مرادی عزیز بابت آ»وزش روان
کاربر میهمان
yazdanمن یک کاربر مهمان هستم
۱۳۹۴/۱۰/۲۲
سلام
تو خط سوم به جای "هم" نوشته شده "هب"
کاربر میهمان
MHDمن یک کاربر مهمان هستم
۱۳۹۴/۱۰/۲۰
سلام کلون به معنای کپی کردنه نه دریافت کردن-ممنون از آموزشهای فوقالعادتون.
soroush.8 nazari
soroush.8 nazari
۱۳۹۴/۰۹/۰۳
سلام. در زیر عکس دو سیستم ورژن کنترل : در سیستم ورژن کنترل Git که یک سیستم اصطلاحاً Distributed یا «نامتمرکز» است، شرایط تا حدود متفاوت تر است.
اون حدود ، فک کنم حدودی بوده که اتفاقی (ی) تایپ نشده.
در پاراگراف آخر هم خط : علاوه بر این، به اشتراک گذاری پروژه کاملاً ایمین است، Conflict (کانفلیکت یا تداخل)....
((ایمین)) اشتباه نوشته شده که احتمالا ((ایمن)) بوده. با تشکر