در این آموزش قصد داریم تا دو سیستم ورژن کنترل معروف که عبارتند از 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 (کانفلیکت یا تداخل) صرفاً روی سیستم لوکال توسعهدهنده ایجاد میشود و هرگز اتفاق بدی برای پروژه ی قرار گرفته روی سرور نخواهد افتاد! همین مسأله منجر میگردد که برنامه نویسان مبتدی با خیال راحت کار کنند و هرگز نگران این نباشند که سهواً پروژه ای که روی ریپازیتوری اصلی قرار گرفته است را خراب کنند.