گیت، یک سیستم کنترل ورژن اوپن سورس یا VCS (مخفف Version Control System) است. یک فناوری ارزشمند که امکان ردیابی نسخههای قدیمیتر فایلها را در اختیار شما قرار داده و امکان مقایسه همزمان نسخههای مختلف فایلها را در اختیار شما قرار میدهد.
در گذشته، پیش از پیدایش گیت از SVN و CVS که سیستمهای محبوب کنترل ورژن آن دوران بودند، استفاده میشد. لینوس توروالد، خالق لینوکس برای اولین بار گیت را توسعه داد و امروزه برای کسانی که با نرمافزارهای متن باز سر و کار دارند، ابزاری غیر قابل چشمپوشیست.
پیشنهاد مقاله: شروع آموزش برنامهنویسی
VCS توزیع شده
گیت، یک سیستم توزیع شده است که خیل عظیمی از توسعهدهندگان نرمافزار از آن استفاده میکنند. توسعهدهنده نرمافزار میتواند منبع کد مدنظر خود را (که اصطلاحاً به آن ریپازیتوری گفته میشود)، از یک موقعیت مرکزی دریافت (اصطلاحاً کلون) نماید و به طور مستقل روی قسمتی از کدهای آن کار کند. بعد از انجام تغییرات، توسعه دهنده میتواند تغییرات خود را به موقعیت مرکزی، باز ارسال (اصطلاحاً کامیت) کند. این تغییرات در کنار تغییرات توسعه دهندگان دیگر، نگهداری میشود تا بعداً در مورد بهترین نسخه، تصمیمگیری صورت گیرد.
یکی از سرویسهای محبوبی که گیت را به طور خاص برای نرمافزارهای متنباز، میزبانی میکند، گیتهاب (GitHub) نام دارد ولی سرویسهای دیگری مثل BitBucket، GitLab و موارد بسیار دیگر هم وجود دارد که تیمهای نرمافزاری سراسر جهان برای به اشتراکگذاری اختصاصی کدها از آنها استفاده میکنند.
نصب گیت
نصب گیت در تمام پلتفورمها فرایندی بسیار ساده است:
OSX (مک):
توسط Homebrew، فرمان زیر را اجرا کنید:
ویندوز:
برنامه Git را از اینترنت دانلود کرده و نصب کنید.
لینوکس:
از Package Manager خود برای نصب گیت استفاده کنید.
یا
شروع یک ریپازیتوری
بعد از این که گیت را روی سیستم خود نصب کردید، با استفاده از خط فرمان و دستور git میتوانید به آن دسترسی پیدا کنید.
بعد از باز کردن پوشه پروژه خود، با استفاده از دستور زیر میتوانید ریپوزیتوری خود را آغاز کنید:
گیت، یک سیستم کنترل ورژن اوپن سورس یا VCS (مخفف Version Control System) است. یک فناوری ارزشمند که امکان ردیابی نسخههای قدیمیتر فایلها را در اختیار شما قرار داده و امکان مقایسه همزمان نسخههای مختلف فایلها را در اختیار شما قرار میدهد.
در گذشته، پیش از پیداییش گیت از SVN و CVS که سیستمهای محبوب کنترل ورژن آن دوران بودند، استفاده میشد. لینوس توروالد، خالق لینوکس برای اولین بار گیت را توسعه داد و امروزه برای کسانی که با نرمافزارهای متن باز سر و کار دارند، ابزاری غیر قابل چشمپوشیست.
بوتکمپهای برنامهنویسی مجتمع دانش و فناوری بامداد
VCS توزیع شده
گیت، یک سیستم توزیع شده است که خیل عظیمی از توسعهدهندگان نرمافزار از آن استفاده میکنند. توسعهدهنده نرمافزار میتواند منبع کد مدنظر خود را (که اصطلاحاً به آن ریپازیتوری گفته میشود)، از یک موقعیت مرکزی دریافت (اصطلاحاً کلون) نماید و به طور مستقل روی قسمتی از کدهای آن کار کند. بعد از انجام تغییرات، توسعه دهنده میتواند تغییرات خود را به موقعیت مرکزی، باز ارسال (اصطلاحاً کامیت) کند. این تغییرات در کنار تغییرات توسعه دهندگان دیگر، نگهداری میشود تا بعداً در مورد بهترین نسخه، تصمیمگیری صورت گیرد.
یکی از سرویسهای محبوبی که گیت را به طور خاص برای نرمافزارهای متنباز، میزبانی میکند، گیتهاب (GitHub) نام دارد ولی سرویسهای دیگری مثل BitBucket، GitLab و موارد دیگر هم وجود دارد که تیمهای نرمافزاری سراسر جهان برای به اشتراکگذاری اختصاصی کدها از آنها استفاده میکنند.
نصب گیت
نصب گیت در تمام پلتفورمها فرایندی بسیار ساده است:
OSX (مک):
توسط Homebrew، فرمان زیر را اجرا کنید:
ویندوز:
برنامه Git را از اینترنت دانلود کرده و نصب کنید.
لینوکس:
از Package Manager خود برای نصب گیت استفاده کنید.
یا
شروع یک ریپازیتوری
بعد از این که گیت را روی سیستم خود نصب کردید، با استفاده از خط فرمان و دستور git میتوانید به آن دسترسی پیدا کنید.
بعد از باز کردن پوشه پروژه خود، با استفاده از دستور زیر میتوانید ریپوزیتوری خود را آغاز کنید:
این فرمان، چه کار میکند؟ یک فولدر به نام .git را داخل فولدری که سورسکد پروژه شما داخل آن است، ایجاد میکند و از حالا به بعدی میتوانید فرامین گیت را اجرا کنید. اگر این پوشه را نمیبینید، علتش آن است که این پوشه، از نوع hidden است و باید با استفاده از تنظیمات سیستم عامل خود، فولدرهای hidden را در حالت قابل رؤیت قرار دهید.
در ریپازیتوری جدیدی که ساختهاید، تمام اطلاعات مرتبط با Gitدر پوشه .git ذخیره میشوند.
افزودن فایل به یک ریپازیتوری
در ادامه میخواهیم ببینیم چه طور میشود یک فایل را به گیت اضافه کرد. فرمان زیر را تایپ کنید:
در حال حاضر، همانطور که خروجی فرمان git status در تصویر بعد نشان میدهد، فایل readme.text داخل دایرکتوری پروژه قراردارد ولی هنوز از گیت نخواستهاید این فایل را به ایندکس خود اضافه کند:
افزودن فایل به ناحیه staging
با استفاده از فرمان زیر، فایل خود را اضافه میکنید:
برای این که فایل شما برای gıt قابل دسترسی باشد، باید آن را به ناحیه staging اضافه کنید:
بعد از این که که فایل شما در مرحله staging قرار گرفت، با تایپ فرمان زیر میتوانید آن را از این ناحیه حذف کنید:
توضیح: در مرحله staging، هنوز فایل شما ردیابی نشده و در کامیت بعدی، ردیابی میشود و تغییرات انجام شده در آن، توسط دیگران قابل ردیابیست.
معمولاً بعد از اضافه کردن فایل به مرحله staging، میخواهید آن را کامیت کنید.
کامیت کردن تغییرات
بعد از این که یک یا چند تغییر در ناحیه staging صورت دادید، با استفاده از فرمان زیر، آن تغییرات را کامیت میکنید:
با اجرای این فرمان، ناحیه staging شما خالی میشود. با استفاده از فرمان git status (تصویر زیر) میتوانید از خالی بودن ناحیه staging اطمینان حاصل کنید:
همچنین، در این مرحله، تغییراتی که روی فایل خود صورت دادهاید، به طور دائمی ذخیره و نگهداری میشوند که با استفاده از فرمان git log: میتوانید از این موضوع اطمینان حاصل کنید:
شاخهها (Branches)
وقتی فایلی را به گیت، ارسال (کامیت) میکنید، این فایل به شاخه جاری ارسال میشود.
گیت این امکان را به شما میدهد که به طور همزمان روی چند شاخه جداگانه کار کنید. این شاخهها، خطوط کاری مختلف فرایند توسعه هستند که مثل شاخههای منشعب از شاخه اصلی درنظر گرفته میشوند.
گیت، بسیار انعطافپذیر است: میتوانید به طور همزمان، بینهایت شاخه را در اختیار داشته باشید و هر شاخه را به طور مستقل از بقیه شاخهها توسعه دهید و در نهایت، همه آنها را با هم ادغام کنید.
گیت به طور پیشفرض از شاخهای به نام master استفاده میکند. این شاخه، هیچ تفاوتی با شاخههای دیگر ندارد، به جز این که اولین شاخهایست که پیش از شاخههای دیگرف ایجاد شده است.
با تایپ فرمان زیر میتوانید شاخه جدیدی با نام develop ایجاد کنید:
فرمان git branch، فهرست شاخههایی که در ریپازیتوری شما وجود دارد را نشان میدهد.
هنگام ساخت یک شاخه جدید، این شاخه به آخرین کامیت ساخته شده روی شاخه جاری، اشاره دارد. اگر با استفاده از فرمان git checkout develop، به شاخه جدید (در این مثال، شاخه develop) سوییچ کنید و فرمان git log را اجرا کنید، همان گزارشی را مشاهده میکنید که در شاخه قبلی (در این مثال، شاخه master) مشاهده میکردید.
پوش و پول
در گیت، شما همیشه کامیتهای خود را به صورت محلی ارسال میکنید. در مقایسه با SVN و CSV که در آنها کامیتها باید از طریق یک سرور منتقل میشدند، مزیت بزرگی محسوب میشود.
شما همه کارهای خود را به صورت آفلاین انجام میدهید و هر تعداد کامیت که بخواهید ایجاد میکنید. بعد از این که برای ارسال به سرور (اصطلاحا push کردن) آماده شدید و ریپازیتوری خود را به GitHub پوش کردید، اعضای تیم شما میتوانند به آخرین و بهترین کدهای تولیدی شما دسترسی داشته باشند.
اما برای این که بتوانید با push و pull کار کنید، باید یک نسخه دوردست (اصطلاحاً ریموت) برای پروژه خود ایجاد کنید.
پوش، تغییرات شما را ارسال میکند.
پول، تغییرات دوردست را در نسخه کاری شما دانلود میکند.
ایجاد ریموت
ریموت پروژه شما، نسخهای از ریپازیتوری شماست که در یک کامپیوتر دوردست نگهداری میشود.
بیایید یک مثال را با گیتهاب، بررسی کنیم. اگر یک ریپازیتوری ساخته شده را در اختیار داشته باشید، میتوانید آن را در گیتهاب منتشر کنید. این فرایند، مستلزم ساخت یک ریپازیتوری در پلتفورم گیتهاب است که از طریق رابط کاربری تحت وب گیتهاب ساخته میشود. بعد از انجام این کار میتوانید آن ریپازیتوری را به عنوان ریموت خود اضافه کرده و کدهای خود را به آنجا پوش کنید.
برای افزودن یک ریموت، فرمان زیر را تایپ کنید.
روش دیگری که برای انجام این کار وجود دارد، این است که یک ریپازیتوری خالی در گیتهاب خود ایجاد کنید و سپس نسخه محلی آن را در دستگاه خود ایجاد کنید. در این حالت، ریموت به طور اتوماتیک برای شما ساخته میشود.
پوش (push)
بعد از اتمام مراحل قبل، آمادهاید که کدهای خود را با استفاده از فرمان git push <remote> <branch> به ریموت خود پوش کنید. به عنوان مثال:
از آنجا که به لحاظ فنی ممکن است بیش از یک ریموت داشته باشید، در کد بالا، نسخه اولیه را به عنوان ریموت درنظر گرفتهایم.
پول (Pull)
برای فرایند Pull نیز از سینتکس مشابهی استفاده میشود:
فرمان فوق از گیت میخواهد که شاخه master را از مبدا دریافت (pull) کند و آن را با شاخه محلی ما ادغام کند.
ناسازگاریها
هم در پوش و هم در پول، مشکلی وجود دارد که باید مدنظر قرار دهیم: اگر در ریموت شما تغییراتی وجود داشته باشد که با مجموعه کامیتهای شما سازگار نباشند، عملیات ناموفق، خاتمه مییابد.
این اتفاق، زمانی رخ میدهد که در ریموت شما تغییراتی وجود داشته باشد که درآخرین پول قبلی، هم وجود داشتهاند و در کدهایی که روی آنها کار کردهاید، نیز تأثیر میگذارند.
در وضعیت پوش، با پول کردن تغییرات و انالیز ناسازگاریها و سچس ایحاد یک کامیت جدید برای حل آنها این مشکل حل میشود.
در وضعیت پول، نسخه کاری شما (نسخهای که در حال کار روی آن هستید)، تغییرات ناسازگار، به طور اتوماتیک، ویرایش شده و باید با ایجاد یک کامیت جدید، کاری کنید که کد مبنای شما حاوی تغییرات مشکل سازی باشند که در ریموت خود ایجاد کردهاید.
خط فرمان یا رابط گرافیکی، مسأله این است
تمام مطالبی که تا اینجا گفتیم، با خط فرمان برنامه Git انجام شد.
این روش، برای توضیح نحوه کارکرد گیت، مفید است ولی در کارکردهای روزمره، احتمالاً از برنامهای استفاده خواهید کرد که در آن تمام این فرامین از طریق یک رابط گرافیکی زیبا قابل انجامند. اما توسعهدهندگان حرفهای، استفاده از CLI (خط فرمان) را ترجیح میدهند.
مثلاً اگر نیاز داشته باشید گیت را از طریقSSH در یک سرور دوردست تنظیم کنید، خط فرمان یا CLI، بسیار مفید واقع میشود و دانستن فرامین آن به هیچ وجه بی فایده نخواهد بود.
برنامههای مفید بسیاری وجود دارند که باعث تسهیل در عملکرد توسعهدهندگان نرمافزار میشوند و مخصوصاً اگر درگیر پیچیدگیهای یک ریپازیتوری گیت شوید، این نرمافزارها بسیار میتوانند مفید و مؤثر واقع شوند. در واقع، کارهای ساده، همه جا ساده هستند ولی با پیشرفت کارها ممکن است به جایی برسید که ببینید استفاده از CLI کم کم دارد دشوار میشود.
بعضی از برنامههای محبوب گیت عبارتند از:
GitHub Desktop
https://desktop.github.com
هنگام نوشتن این مقاله، فقط برای مک و ویندوز، رایگان است.
Tower
https://git-tower.com
برای ویندوز و مک وجود دارد و پولی است.
GıtKraken
https://gitkraken.com
برای مک، ویندوز و لینوکس وجود دارد و بسته به امکانات مورد نیاز، میتواند رایگان یا پولی باشد.
یک استراتژی خوب برای گیت
توسعهدهندگان نرمافزار و تیمهای مختلف، از استراتژیهای متفاوتی برای مدیریت مؤثر گیت بهره میبرند. در اینجا میخواهیم یکی از استراتژیهایی را که جواب خود را پس داده، به شما معرفی کنیم.
فقط از دو شاخه دائمی اصلی استفاده کنید: master و develop
سعی کنید در روتین روزانه خود قوانین زیر را رعایت کنید:
وقتی با مسأله جدیدی مواجه میشوید یا میخواهید ویژگی جدیدی را اضافه کنید، دو مسیر اصلی پیش روی شما قرار دارد:
این ویژگی جدید، به سرعت قابل پیادهسازیست
اگر کامیتهایی که میسازید باعث شکستگی کدها نمیشوند (یا حداقل امیدوارید که نشوند): میتوانید کامیت خود را در شاخه develop انجام دهید (یا شاخه سریع دیگری ایجاد کنید و بعد آن را با develop ادغام کنید).
این ویژگی جدید به بیش از یک کامیت نیاز دارد
ممکن است اتمام ویژگی جدید به چند روز زمان (و کامیت) نیاز داشته باشد: در این صورت، از یک شاخه featrue استفاده کنید و بعد از اتمام کار (که شاید هفتهها طول بکشد)، آن را با develop ادغام کنید.
پیشنهاد مقاله: بهترین زبان برنامهنویسی- مقایسه کامل #C و PHP
توسعه، فرایندی ناپایدار است. Master، آخرین نسخه پایدار محصول شماست
شاخه Develop، همیشه در وضعیت سیال قرار دارد و به همین دلیل، هنگام آمادهسازی یک نسخه جدید باید در وضعیت انجماد قرار بگیرد. بعد از آزمایش کدها و بررسی و تایید نهایی کد، آن را برای ادغام با شاخه master آماده کنید.
هر بار که میخواهید شاخه develop یا دیگر شاخههای اصلاحی را در شاخه ادغام کنید، یک شماره ورژن جدید روی آن قرار دهید تا اگر در گیتهاب نیز نسخه جدیدی ایجاد کردید و این نسخه با مشکل مواجه شد، به راحتی بتوانید نسخه قبلی را بازگردانید.