Version Control System (VCS) یک نرمافزار است که به برنامهنویسان کمک میکند تا در کنارهم فعالیت کنند و تاریخچه کارهایشان را با هم به اشتراک بگذارند و به خوبی با یکدیگر تعامل داشته باشند.
اهداف اصلی یک VCS:
در زیر انواع VCS:
در این فصل، ما تنها در توزیع سیستم کنترل نسخه و به خصوص در تمرکز Git. Git تحت توزیع سیستم کنترل نسخه.
اگر همه افراد، کدهایشان را برروی یک سرور قرار دهند و روی آن سرور همه فعالیتها و تغییرات را انجام دهند، در صورتی که سرور از دسترس خارج شود، یا فرد دسترسیاش به اینترنت را از دست بدهد و ... امکان ادامه فعالیت از بین خواهد رفت. در صورتی که سرور دچار مشکل شود و نسخه پشتیبان مناسبی از اطلاعات فراهم نشدهباشد، فعالیتهای بسیاری باید از ابتدا تکرار شوند، حتی ممکن است پروژه به دلیل محدودیت زمانی از بین برود.
یک DVCS علاوه بر یک سرور، به رایانههای کاربران هم امکان انبار کردن ورژنهای مختلف کدها را میدهد، در واقع هر کاربری یک نسخه پشتیبان از همه مطالب به اشتراک گذاشتهشده روی سرور مرکزی را دارد، در صورتی که مشکلاتی که قبلا گفته شده، واقع شوند، به راحتی میتوان کار را ادامه داد.
اگر همه افراد، کدهایشان را برروی یک سرور قرار دهند و روی آن سرور همه فعالیتها و تغییرات را انجام دهند، در صورتی که سرور از دسترس خارج شود، یا فرد دسترسیاش به اینترنت را از دست بدهد و ... امکان ادامه فعالیت از بین خواهد رفت.
در صورتی که سرور دچار مشکل شود و نسخه پشتیبان مناسبی از اطلاعات فراهم نشدهباشد، فعالیتهای بسیاری باید از ابتدا تکرار شوند، حتی ممکن است پروژه به دلیل محدودیت زمانی از بین برود.
یک DVCS ، علاوه بر یک سرور، به رایانههای کاربران هم امکان انبار کردن ورژنهای مختلف کدها را میدهد، در واقع هر کاربری یک نسخه پشتیبان از همه مطالب به اشتراک گذاشتهشده روی سرور مرکزی را دارد، در صورتی که مشکلاتی که قبلا گفته شده، واقع شوند، به راحتی میتوان کار را ادامه داد.
دستگاه گوارش تحت مجوز منبع باز GPL منتشر شد. آن را آزادانه از طریق اینترنت در دسترس است. شما می توانید از Git برای مدیریت پروژه های اختصاصی بدون پرداخت یک پنی تک استفاده کنید. آن را به عنوان منبع باز است، شما می توانید کد منبع آن را دانلود کنید و همچنین تغییرات انجام با توجه به نیاز خود را.
انجام کارها به صورت محلی 5 باعث سریع شدن کارها میشود، هسته اصلی GIT با استفاده از زبان C نوشته شده است، از این رو بسیار سریعتر و سبکتر از زبانهای سطح بالاتر کار میکند.
نسخههای پشتیبان التزامی 1 از آنجا که هر کاربری یک نسخه از کل اطلاعات را دارد، در صورتی که مشکلی برای سرور پیش بیاید، نسخههای پشتیبان متعدد خوبی در دسترس هستند
GIT از الگوریتم رمزنگاری معمول HASH استفاده میکند، و قابلیت ایجاد کلیدواژه 2 را برای کاربر فراهم آورده است، همچنین از Checksum استفاده میکند،و با اینکار تمام فایلها و Commit ها به شکلی ذخیره میشوند، که بدون آشنایی با GIT ، امکان تغییر یا دستکاری آنها وجود نخواهد داشت.
بدلیل اینکه هر کاربر به صورت محلی فعالیتهایش را انجام داده و ثبت کرده، سپس روی سرور هل 3 میدهد، امکان ایجاد تنگنا 4 کمتر میشود و با سخت افزار ضعیفتری فعالیتها قابل انجام هستند.
در یک CVCS ، با ایجاد یک شاخه تمام اطلاعات قبلی در آن کپی میشود، اینکار زمانبر و پرهزینه است، اما GIT روشی بهینهتر را فراهم آوردهاست.
هر VCS یک فضای کاری شخصی، برای هر کاربر ایجاد میکند که بر روی رایانه شخصی کاربر قرار دارد، فرد میتواند انبار شخصی خود را داشته باشد و تمام فعالیت هایش را بدون اتصال به اینترنت انجام دهد.
در CVCS ها افراد فایلها را دستکاری 6 میکنند و تغییرات همان لحظه ثبت میشوند، اما در GIT در سه مرحله فعالیتها و دستکاریها انجام میشوند:
Let us see the basic workflow of Git.
فایلها را دستکاری میکنیم
فایلها را به Staging area یا Index منتقل میکنیم.
یک Commit انجام میدهیم و حالا فایلهای Commit شده، میتوانند به سرور اصلی منتقل شوند.
دقت داشته باشیم، برای مثال اگر بخواهیم دو فایل را با دو Commit متفاوت دستکاری کنیم، ابتدا باید یکی را به 1SA منتقل کنیم، Commit را انجام دهیم، سپس این کار را برای فایل دیگر، تکرار کنیم.
# First commit [bash]$ git add sort.c # adds file to the staging area [bash]$ git commit –m “Added sort operation” # Second commit [bash]$ git add search.c # adds file to the staging area [bash]$ git commit –m “Added search operation”
مخفف Binary Large Object است، هر نسخه از فایلها در انبار 2 با یک BLOB شناخته میشود، یک BLOB یک فایل باینری است، که اطلاعات یک فایل را به صورت باینری و نه Meta data نگهداری میکند، که با SH1 Hash آدرسدهی میشود، در GIT database تمام فایلها اینگونه آدرس دهی میشوند.
درختها BLOB ها را با همان سطحبندی و آدرسدهی Directory هایی که فایلها در آنها ذخیره شدهاند، به صورت SHA1 نگهداری میکند.
وضعیت جاری یک انبار را در خود نگهداری کرده و نمایش میدهد،در واقع هر دستکاری که روی DVCS انجام دهیم، یک Commit انجام دادهایم، Commit هم با SHA1 نامگذاری میشود، میتوان Commit را به عنوان یک گره 3 در لیست فعالیتهای انبار در نظر گرفت، میتوان با مراجعه به یک Commit اطلاعات یا کامنتهای درج شده در آن، نظیر تاریخ و زمان، توضیحات فردی که آن را انجام داده و یا تغییراتی که نسبت به فایل قبلی در آن Commit ایجاد شده است را مشاهده کرد
برای ایجاد خطها و شاخههای مختلف، در هنگام توسعه نرم افزار به کار میرود، به طور معمول برای ایجاد و توسعه یک ویژگی جدید در پروژه یک Branch ایجاد میشود، به صورت پیشفرض همه فعالیتها در Master انجام میشوند، میتوانیم شاخههای مختلفی ایجاد کنیم، هر با یک Branch Head شناخته میشود، به این شکل که اگر ما در یک Branch ، یک Commit انجام دهیم، آن Commit ، Head را در آن Branch ، به روز میکند.
مفهومی بسیار نزدیک به Branch دارد، با این تفاوت که یک TAG غیرقابل دستکاری 1 است، در واقع هر گاه بخواهیم Branch ای ایجاد کنیم که کسی نتواند تغییرش بدهد، یک Tag ایجاد میکنیم.
با Clone یک کپی کامل از انبار، به صورت محلی ایجاد میکنیم، میتوانیم تمام تغییرات را روی آن اعمال کنیم، و تنها هنگامی به اشتراک گذاشته میشود، که همزمانسازی 2 شود.
دریافت اطلاعات از یک Remote Directory به داخل یک Local Directory ، برای همزمان سازی انبار محلی استفاده میشود.
تغییرات یک انبار محلی را به یک Remote Directory منتقل میکند، در واقع کارهایمان را به اشتراک میگذاریم.
نمایشگر 3 آخرین تغییرات در یک Branch است، هروقت که یک Commit انجام دهیم، Head به روزرسانی میشود. Head ها در .git/refs/heads/ ذخیره میشوند.
[CentOS]$ ls -1 .git/refs/heads/ master [CentOS]$ cat .git/refs/heads/master 570837e7d58fa4bccd86cb575d884502188b0c49
Revision نمایش دهنده ویراش 4 کد منبع 5 است، Revision ها با انجام Commit ایجاد میشوند و اینها هم با SHA1 آدرس دهی میشوند.
آدرسی است که انبار در آن قرار دارد و در .git/url ذخیره میشود.
[tom@CentOS tom_repo]$ pwd /home/tom/tom_repo [tom@CentOS tom_repo]$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = gituser@git.server.com:project.git fetch = +refs/heads/*:refs/remotes/origin/*