git یک سیستم کنترل سورس توزیع شده می باشد. بر خلاف سیستم های کنترل سورس سنتی مانند SVN که شیوه ارتباطات به صورت کلاینت - سرور می باشد، در git مفهومی به عنوان سرور وجود ندارد و هر نسخه از یک پروژه در واقع نسخه کامل به همراه تمامی تاریخچه تغییرات آن می باشد. این بدان معنی است که در یک تیم هر توسعه دهنده یک نسخه کامل از سیستم کنترل سورس به همراه تاریخچه کامل تغییرات را در اختیار دارد.
مفاهیم پایه git
Repository: پایگاه داده git برای یک پروژه می باشد. کلیه تاریخچه های تغییرات، Branch ها، Tag ها و هرچیزی که مربوط به سیستم git برای یک پروژه می باشد را در خود نگه داری می کند.
Working Directory: فایلهای پروژه می باشد که توسعه دهنده برروی آن فعالیت می کند.
Commit: فایلهای تغییر داده شده که تغییرات آنها در Repository اعمال شده باشد.
Stage: فایلهای تغییر داده شده ای که در Working Directory وجود داشته اما هنوز در Repository اعمال نشده باشد.
Branch: هر Repository در git دارای حداقل یک Branch با عنوان master می باشد. Branch ها در واقع دسته ای از تغییرات مرتبط با هم می باشند.
سایر مفاهیم git
- Remote: آدرس یک Repository بیرونی می باشد.
- Push: انتقال تغییرات Commit شده از یک Repository به Repository دیگر.
- Checkout: دریافت آخرین نسخه یک Branch ِیا Commit از روی Repository برروی Working Directory
- Merge: ترکیب Commit های دو یا چند Branch.
- Fetch: دریافت آبجکت ها و رفرنس های از یک Repository دیگر.
- Pull: ترکیب عملیات fetch و Merge برای به روز آوری Repository و همچنین Working Directory استفاده می شود.
- Tag: برچسب یک وضعیت در Repository (به عنوان مثال ورژن)
- Clone: کلون کردن یک Repository در یک دایرکتوری.
- Init: ایجاد یک Repository در یک دایرکتوری.
- Revert: برگرداندن تغییرات به یک وضعیت خاص بدون از دست رفتن تاریخچه.
- Reset: برگرداندن تغییرات به یک وضعیت خاص با از دست رفتن تاریخچه.
شیوه کار با git
در git هر کاربر (توسعه دهنده) دارای یک فولدر خاص خود می باشد. در این فولدر Repository git به همراه Working Directory کاربر قرار می گیرد.
شاخه . git در بردارنده git Repository می باشد و سایر پوشه ها و فایلها Working Directory پروژه می باشند. کاربر به طور کلی در هر زمان با یک Branch از Repository در حال کار می باشد. هر Repository می تواند شامل Branch های متعددی باشد. هر Branch معمولا مجموعه ای از تغییرات مرتبط باهم می باشد. هر Repository حداقل یک Branch دارد که نام آن master می باشد. به عنوان مثال فرض کنید توسعه دهنده می خواهد یک امکان جدید به پروژه اضافه کند. برای شروع ابتدا یک Branch ساخته شده و کلیه تغییرات و توسعه ها در آن Branch صورت می پذیرد. تا زمان نهایی شدن تغییرات Branch اصلی پروژه که master می باشد بدون تغییر باقی می ماند و هر زمان که نیاز باشد وضعیت قبل از تغییرات در master Branch در دسترس می باشد. زمانیکه تغییرات نهایی شده تغییرات Branch ایجاد شده با master Branch ترکیب و یا به اصلاح merge می شود. پس از merge تغییرات می توان Branch ایجاد شده را حذف نمود.
زمانیکه توسعه دهنده فایلهایی را تغییر می دهند فایلها در وضعیت stage قرار می گیرند. این بدان معنی است که فایلها تغییر کرده ولی هنوز در Repository اعمال نشده اند. از سوی دیگر فایلهای جدید می بایست به صورت دستی به وضعیت stage اضافه شوند. پس از انجام تغییرات و نهایی شدن آن، فایلهای تغییر کرده در Repository اعمال شده و یا به عبارتی Commit می شوند. در مفاهیم پیشرفته تر امکاناتی وجود دارد که بتوان بخشی از تغییرات و یا تمامی تغییرات Commit شده را مشاهده و یا به حالت قبل برگرداند.
در صورتیکه Repositoryی دیگری از پروژه در مکان دیگری وجود داشته باشد می توان تغییرات Commit شده را به آن انتقال و یا به عبارتی Push کرد. همچنین می توان تغییرات Repository بیرونی را برروی Repository محلی دریافت و یا Fetch نمود.
همانطور که ذکر شد git یک سیستم توزیع شده می باشد و مفهومی به عنوان سرور در آن وجود ندارد. اما در یک محیط توزیع شده از لحاظ توسعه همیشه می بایست یک Repository وجود داشته باشد که با آخرین تغییرات به روز رسانی شده باشد. معمولا به این Repository، اصلی گفته می شود. هیچ گونه تغییر کدی به صورت مستقیم برروی Repository اصلی انجام نمی شود و فقط تغییرات از سایر Repository ها در آنpush و merge می شوند.