Skip to content

Latest commit

 

History

History
208 lines (138 loc) · 14.9 KB

VCS.md

File metadata and controls

208 lines (138 loc) · 14.9 KB

‫‫سیستم کنترل نسخه، برنامه قدرتمندی است که به وسیله آن می‌توان تاریخچه‌ی تغییرات صورت گرفته روی فایل‌های یک پروژه را در طول زمان دنبال کرد و در صورت نیاز به همه‌ی نسخه‌های قبلی آن دسترسی داشت. هم‌چنین ابزار مناسبی برای توسعه گروهی پروژه‌ها با حفظ نظم کار و کنترل مسیر تغییرات اعمالی توسط هر عضو در نسخه‌ها است.‬

‫سیستم‌های کنترل نسخه بر دو نوع‌اند:‬

‫متمرکز یا ‪Centralized Version control (CVCS)‬ مانند ‪Subvertion (SVN) ،Concurrent Version System (CVS)‬ و ‪Team Foundation Server (TFS)

‫توزیع شده یا ‪Diswtributed Version Control (DVCS)‬ مانند Mercurial ،Bazaar و Git ‬

‫تفاوت این دو در نحوه ذخیره سازی و دسترسی کاربران به اطلاعات است. ‬

‫در CVCS یک نسخه مرکزی وجود دارد که همه نسخه‌ها با مراجعه و همگام‌سازی با این نسخه به روز می‌شوند و تغییرات اعمالی پس از تأیید به آن اضافه می‌گردد. هم‌چنین در صورت از بین رفتن اطلاعات سرور مرکزی، نسخه پشتیبان کاملی از آن دردست نخواهیم داشت، چون دسترسی هر یک از اعضاء به آن محدود بوده است.‬

‫اما در DVCS یک نسخه مرکزی از پروژه وجود ندارد، بلکه هر یک از اعضا همه اطلاعات و تاریخچه‌ی کاملی از تغییرات را در اختیار دارد و هر زمان که تغییراتی در نسخه محلی خود بوجود آورد می‌تواند آن را با سایر نسخه‌ها ادغام کند.‬

‫استفاده از سیستم‌های کنترل نسخه، علاوه بر برنامه‌نویسان و توسعه‌دهندگان، مورد توجه دیزاینرها و نویسندگان نیز قرار گرفته است! ( مثلا Trunk یک Version Control System برای فایل‌های گرافیکی است . یا Simul که یک سیستم کنترل نسخه برای نرم‌افزار Microsoft Word است.)‬



‫وقتی که هسته لینوکس در سال 1991 توسط لینوس توروالدز و تحت مجوز GPL منتشر شد، برنامه‌نویسان زیادی از سراسر دنیا به توسعه آن کمک کردند.‬‬

‫فایل‌های آرشیو شده‌ی ‫این پروژه عظیم ابتدا توسط Patch و E-Mail بین توسعه‌دهندگان رد و بدل می‌شد تا این‌ که در سال ۲۰۰۲، تیم توسعه لینوکس از DVCS به نام BitKeeper برای سازماندهی کدها و نسخه‌های خود استفاده می‌کردند.‬

‫در سال ۲۰۰۵، بابر هم خوردن ارتباط بین جامعه توسعه‌دهنده هسته لینوکس و شرکت تجاری BitKeeper، امتیاز استفاده رایگان از این برنامه برای تیم لینوکس لغو شد. در پی آن ‫توروالدز برای پیشبرد پروژه لینوکس به یک سیستمِ کنترلِ ورژن توزیع شده نیاز داشت، اما هیچ‌کدام از سیستم‌های کنترل ورژنِ موجود برای این کار مناسب نبودند. بنابراین توروالدز مشغول به نوشتن VCS جدیدی شد و همین موجب خلق git در سال 2005 گردید.‬

‫هم اکنون گیت یکی از قدرتمندترین و پراستفاده‌ترین سیستم‌های کنترل ورژن است، از سیستم عامل‌های لینوکس، ویندوز، مک و BSD پشتیبانی می‌کند و شرکت‌های بزرگی چون یاهو، گوگل، توییتر، مایکروسافت، اپل و… از آن استفاده می‌کنند.‬


‫برای شروع کار در git، ابتدا باید یک مخزن پروژه یا Repository (اصطلاحاً repo) درست کنیم تا تمام اسناد مربوط به پروژه را در آن قرار دهیم و git اعمال مربوط به توسعه و تغییر پروژه را در آن مدیریت کند. ‬

‫دستور راه‌اندازی local repository در دایرکتوری مورد نظر:

$ git init

‫این دستور، (initialise) آغاز به کار کردن یک ریپازیتوریِ گیت را در دایرکتوری مورد نظر صادر می‌کند. ‬


  • .git (Hidden File)

‫پس از اعمال این دستور، یک دایرکتوری مخفی با نام‪ .git ‬ در دایرکتوری اصلی پروژه ساخته خواهد شد که تمام اطلاعات و تغییرات مربوط به پروژه و نیز تنظیمات گیت در آن ذخیره می‌شود.‬

‫اگر می خواهید که پروژه خود را از گیت حذف کنید اما همچنان فایل‌های پروژه خود را داشته باشید، کافی است فقط پوشه‪ .git ‬ را حذف کنید.‬‬


  • clone

‫هم‌چنین می‌توانیم پروژه‌ای که می‌خواهیم روی آن کار کنیم را به طور مستقیم از یک remote repository مانند github یا gitlab دریافت کنیم. دستور مورد نظر پس از دریافت URL ِ ریپوی مورد نظر به این صورت است:‬

$ git clone "REPASITORY URL" 

  • stage

‫در گیت پس از اعمال هرگونه تغییر در فایل‌های پروژه، باید فایل‌های جدید و تغییر یافته در حالت stage قرار گیرند.‬

‫stage ‫وضعیتی است که در آن گیت آماده است تا تغییرات پروژه را ثبت و commit کند.‬‬‬

‫برای track کردن فایل‌هایی که هنوز توسط git شناسایی نشده‌اند (untracked files) و اضافه کردن آن‌ها به حالت statge، دستور زیر را وارد می‌کنیم: ‬

$ git add "FILE"

‫این دستور هرفایل را جدا جدا و با ذکر نام فایل اضافه می‌کند.‬

$ git add -A

‫با این دستور همه modified fileها در حالت stage قرار می‌گیرند.‬

‫اگر خواستیم فایلی را از حالت stage خارج کنیم تا در مرحله بعد commit نشود، از دستور زیر استفاده می‌کنیم:‬

$ git reset "FILE" 

‫با اعمال این دستور، تغییرات مورد نظر بعد از تنظیم مجدد unstaged می شود. ‬


  • commit

‫با دستور commit، فایل‌های تغییریافته‌ای که در حالت stage قرار گرفته‌بود، به آرشیو گیت اضافه می‌شود و جایگزین فایل‌های قبل از تغییر می‌گردد. (هرچند دسترسی به تاریخچه تغییرات و همه فایل‌های قبلی نیز میسر است.) در واقع git یک snapshot از وضعیت فعلی پروژه در این زمان را، در تاریخچه خود ثبت می‌کند.‬

‫دستور ثبت و ذخیره snapshot فعلی از repo:‬

$ git commit
$ git commit -m "COMMIT MESSAGE"

‫به جای COMMIT MESSAGE توضیح مختصری از تغیرات صورت گرفته در فایل ها درج شود.‬


  • status

‫در هر یک از مراحل فوق می‌توانیم وضعیت تغییرات فایل‌ها و قرارگیری آن‌ها در هر مرحله را با دستور زیر دنبال کنیم:‬

‍‍$ git status

  • log

‫ هر تغییری که توسط هر یک از اعضا در پروژه commit می‌شود در git ذخیره می‌شود. می‌توان با دستور زیر خلاصه‌ای از همه تغییرات را از commit اولیه تا کنون مشاهده کرد:

$ git log

‫خروجی این دستور شامل Hash Number ِ کامیت مورد نظر، تاریخ ایجاد کامیت، اطلاعاتی مثل اسم و ایمیل Author و ایجاد کننده کامیت، و توضیحاتی که به عنوان Commit Message درج شده‌است، می‌باشد.‬


  • push

‫وقتی که روی یک local repository در سیستم شخصی خود کار می‌کنیم، لازم است در نهایت پروژه را به یک remote repository که نسخه‌ای از مخزن پروژه ما بر روی شبکه است، برای همکاری بیشتر با سایر اعضا، منتقل کنیم. ‬

‫دستور انتقال و فرستادن تغییرات مخزن محلی به مخزن شبکه:‬

$ git push

  • pull

‫وقتی که روی یک local repository در سیستم شخصی خود کار می‌کنیم، برای مشارکت بهتر در پروژه، لازم است همواره به آخرین ورژن از تغییرات remote repository دسترسی داشته باشیم تا با آگاهی از آخرین تغییراتی که سایر اعضا در پروژه ایجاد کرده‌اند (remote changes)، دچار مغایرت در نسخه و merge conflict نشویم.‬

‫این مغایرت در نسخه از آن جایی حاصل می‌شود که کامیت‌های قبلی دو نسخه ازیک فایل در مخزن محلی و مخزن راه دور یکسان نباشند. یعنی پیش از اینکه تغییرات اعمالی خود را بر روی مخزن راه دور push کنیم، فرد دیگری کامیت قبلی فایل مورد نظر ما را تغییر داده و push کرده است. در اینجا برای پیشگیری از merge conflict لازم است ابتدا نسخه مخزن راه دور را pull کنیم.‬

‫دستور دریافت آخرین نسخه از remote repo و همگام‌سازی سیستم با شبکه:‬

$ git pull

  • branch

گاهی در فرآیند توسعه ‫یک پروژه لازم است که که افراد به موازات هم روی بخش‌هایی از پروژه اصلی کار کنند، و بعد آن تغییرات را با پروژه اصلی ادغام کنند. راه‌حل هوشمندانه‌ای که git در این باره درنظر گرفته‌است استفاده از مفهوم branch / شاخه است. ‬

‫پروژه اصلی روی شاخه‌ی master قرار می‌گیرد و تمام commitهای ما به طور پیش‌فرض روی شاخه master به طور خطی پیش می‌روند. اما هر فرد می‌تواند از پروژه اصلی در هر مرحله‌ای که بود، یک انشعاب جدید درست کرده و کار خود را در آن شاخه، به موازات شاخه اصلی جلو ببرد. نکته مهم این است که commitهایی که در این شاخه‌ها انجام می‌شوند کاملا از هم و از شاخه master جدا هستند و در بدنه اصلی برنامه تغییری ایجاد نمی‌کنند. در نهایت می توان این شاخه‌ها را حذف یا در صورت تأیید با بدنه اصلی برنامه ترکیب کرد تا تغییرات منتشر شوند.‬

‫دستور نشان دادن branchهای موجود:‬

$ git branch

‫در خروجی این دستور،‌ اسم شاخه‌ای را که بر روی آن قرار گرفته‌ایم با علامت * مشخص شده‌است.‬

‫دستور ساخت branch جدید:‬

$ git branch "BRANCH NAME"

‫دستور رفتن به branch دیگر:‬

$ git checkout "BRANCH NAME"

‫دستور حذف branch:‬

$ git branch -d "BRANCH NAME"

  • fork

‫در github می‌توان به پروژه‌هایی که دیگر افراد بارگذاری کرده‌اند دسترسی داشت و در آن‌ها مشارکت کرد. برای این کار از امکان fork کردن در گیت‌هاب استفاده می‌کنیم.

‫fork این اجازه را می‌دهد که روی پروژه مورد نظر در یک مخزن مجزا کار کنیم. با fork کردن یک پروژه، یک نسخه جداگانه از مخزن پروژه در اکانت ما کپی می‌شود که می‌توان با clone کردن و ساخت مخزن محلی در سیستم به توسعه آن پرداخت. پس از اعمال تغییرات لازم، چون به مخزن اصلی پروژه دسترسی نداریم که تغییرات را مستقیماً روی آن بنویسیم، باید برای آن فرد pull request فرستاد تا در صورت تأیید، نسخه تغییر یافته را با نسخه اصلی خود merge کند.‬


  • merge

‫پس از اعمال تغییرات در بخش‌های مختلف برنامه که به موازات پروژه اصلی پیش رفته‌اند، در صورت تأیید باید آن‌ها را با بدنه اصلی برنامه merge / ادغام کرد تا برای همه اعضا در دسترس باشد.‬

‫دستور ادغام شاخه‌ها با بدنه اصلی برنامه:‬

$ git merge "BRANCH NAME"

‫دستور ادغام دو شاخه با یکدیگر:‬

$ git merge "BRANCH NAME1" "BRANCH NAME2"


Mercurial

‫از Distributed VCSها است و هم‌زمان با git تولید شد. اما در مقابل محبوبیت git موفقیت کمتری کسب کرد، با این حال در توسعه پروژه‌های بزرگی مانند Open Office مورد استفاده قرار گرفت.

‫در سیستم عامل‌های Microsoft Windows و Unix-like پشتیبانی می‌شود و مفاهیمی بسیار شبیه به git دارد (مثل branching و merging ). این برنامه بیشتر از طریق خط فرمان کنترل می‌شود اما رابط‌های گرافیکی هم برای آن در نظر گرفته‌اند (مثل TortoiseHg).‬



CVS

‫از قدیمی‌ترین سیستم‌های کنترل نسخه Centralized می‌باشد که در سال 1980 منتشر شد.در بین توسعه‌دهندگان پروژه‌های متن‌باز و تجاری محبوبیت زیادی کسب کرد. هرچند امروزه تقریبا استفاده از آن منسوخ شده‌است.‬