Git یک سیستم کنترل نسخه است که توسعهدهندگان در سراسر جهان برای پیگیری نسخههای مختلف کد و همکاری با دیگران از آن استفاده میکنند. هنگام توسعه یک پروژه، سیستم کنترل نسخه گیت کمک میکند تا مشخص شود چه تغییراتی، توسط چه کسی و در چه زمانی انجام شدهاند؛ موضوعی که هنگام مواجهه با باگها و خطاها اهمیت زیادی دارد. بااینحال، یادگیری Git در ابتدای کار ممکن است کمی ترسناک و گیجکننده به نظر برسد. به همین دلیل، در این مقاله Git با زبانی ساده و قابلدرک معرفی میشود و موضوعاتی مانند مخزنها (Repositories)، کامیتها (Commits) و شاخهها (Branches) بررسی خواهند شد.
گیت چیست؟
Git یک سیستم کنترل نسخه است که روی رایانه نصب میشود و برای همکاری روی پروژههای کدنویسی یا مدیریت پروژههای شخصی کاربرد دارد. برای بررسی نصب بودن سیستم کنترل نسخه گیت، میتوان دستور git --version را در ترمینال وارد کرد. در صورت نصب نبودن، میتوان نسخه مناسب سیستمعامل را از وبسایت Git دانلود و نصب نمود.

تصویر(1)
GitHub چیست؟
GitHub سرویسی است که امکان میدهد پروژههای Git روی یک سرور راه دور، یا به عبارت دیگر در فضای ابری، میزبانی شوند.
نکته مهم این است که GitHub همان Git نیست. GitHub صرفاً یک سرویس میزبانی است. شرکتهای دیگری مانند Bitbucket و GitLab نیز خدمات میزبانی مشابهی ارائه میدهند.
چگونه باید کار با سیستم کنترل نسخه گیت را شروع کرد؟
ترمینال یا رابط گرافیکی؟
میتوان Git را از طریق ترمینال و وارد کردن دستورات یا توسط رابطهای گرافیکی مانند Sourcetree و GitKraken به کار برد. در روش ترمینال، نیازی به حفظ همه دستورات نیست و بهجز دستورات پرکاربرد، سایر موارد را میتوان هنگام نیاز جستوجو کرد. در رابط گرافیکی نیز اقدامات بهصورت گرافیکی نمایش داده میشوند. بااینحال، در هر دو روش، درک اصول اولیه نحوه عملکرد سیستم کنترل نسخه گیت برای استفاده مطمئن از آن ضروری است.
در ادامه این مقاله، مثالها با استفاده از Git در ترمینال ارائه میگردند. بااینحال، مراحلی که توضیح داده میشوند، در صورت استفاده از رابط گرافیکی نیز بسیار مشابه خواهند بود.
چگونه باید پوشه پروژه را برای استفاده از سیستم کنترل نسخه گیت آماده کرد؟
برای استفاده از سیستم کنترل نسخه گیت، باید پروژهای داشته باشید که قصد دارید نسخههای مختلف آن را مدیریت کنید. این پروژه میتواند جدید یا از قبل موجود باشد.
اگر پروژه جدید باشد، ابتدا باید یک پوشه جدید برای آن ایجاد شود (نکته: میتوان از دستور mkdir استفاده کرد) و سپس در ترمینال وارد آن پوشه شد.
اگر پروژه از قبل وجود داشته باشد، کافی است در ترمینال به پوشه همان پروژه بروید.
در این مثال، یک پوشه پروژه جدید با نام novel ایجاد میشود.

تصویر(2)
چگونه باید یک مخزن Git ایجاد کرد؟
پس از ورود به پوشه پروژه، برای شروع کار با سیستم کنترل نسخه گیت باید توسط دستور git init یک مخزن (Repository) ایجاد یا اصطلاحا Initialize کنید.
پس از اجرای این دستور در ترمینال و فشردن کلید Enter، ممکن است ابتدا به نظر برسد که اتفاق خاصی رخ نداده است. اما نباید فریب این ظاهر را خورد؛ Git گاهی بیسروصدا عمل میکند و بسیاری از اقدامات را در پسزمینه انجام میدهد.
برای مشاهده اقداماتی که Git در پسزمینه انجام داده است، باید نمایش فایلهای مخفی را فعال کنید. ابتدا مطمئن شوید پوشه پروژه در سیستم فایل باز است. اگر از Mac استفاده میشود، میتوان کلیدهای Command + Shift + Dot را فشار داد تا فایلهای مخفی نمایش داده شوند. در سیستمعامل Windows نیز میتوان تنظیمات نمایش را تغییر داد تا فایلهای مخفی قابل مشاهده باشند.
برای مشاهده فایلهای مخفی در ترمینال نیز میتوان از دستور ls -a استفاده کرد.
در این مرحله باید یک پوشه با نام git. در داخل پوشه پروژه مشاهده شود. این پوشه در واقع همان چیزی است که معمولاً مخزن Git را تشکیل میدهد.

تصویر(3)
Repository یا مخزن گیت چیست؟
Repository همان پوشه git. است که داخل پوشه پروژه قرار دارد و تمام تغییرات فایلها و تاریخچه آنها را در طول زمان نگهداری میکند. مخزن موجود روی رایانه، مخزن محلی (Local Repository) نام دارد. با Push کردن آن روی سرویسهایی مانند GitHub، GitLab یا Bitbucket، یک مخزن راه دور (Remote Repository) ایجاد میشود. مخزن راه دور برای همکاری با دیگران و تهیه نسخه پشتیبان از پروژه اهمیت زیادی دارد و در صورت بروز مشکل برای رایانه، اطلاعات پروژه همچنان قابل دسترسی خواهد بود.
چگونه می توان توسط سیستم کنترل نسخه گیت با سایر توسعهدهندگان همکاری کرد؟
اگر توسعهدهنده دیگری بخواهد در پروژه همکاری کند، میتواند مخزن راه دور را از سرویس میزبانی که پروژه در آن آپلود شده است، Clone یا به عبارت دیگر دانلود کند و آن را روی رایانه خود قرار دهد.
به این ترتیب، پروژه روی رایانه او نیز در دسترس خواهد بود. مخزن موجود روی رایانه او نیز مخزن محلی (Local Repository) نامیده میشود.
در پروژههایی که چند توسعهدهنده روی آنها کار میکنند، هر توسعهدهنده یک مخزن محلی روی رایانه خود خواهد داشت. در کنار آن، یک مخزن راه دور نیز وجود دارد که همه توسعهدهندگان تغییرات خود را در آن به اشتراک میگذارند و از طریق آن روی پروژه با یکدیگر همکاری میکنند.
Git چگونه تغییرات را پیگیری میکند؟
برای ذخیره نسخههای مختلف پروژه در سیستم کنترل نسخه گیت، باید Commit ایجاد شود.
Git Commit چیست؟
Commit یک نسخه از پروژه است. هر Commit یک نسخه مستقل از پروژه را نشان میدهد و شامل ارجاعی به تمام فایلها و پوشههایی است که در آن نسخه قرار دارند.
چگونه باید در Git یک Commit ایجاد کرد؟
برای درک نحوه ایجاد یک Commit، ابتدا باید با سه فضای مختلف در Git آشنا شد:
- دایرکتوری کاری (Working Directory)
- ناحیه Staging
- تاریخچه Commit ها (Commit History).
دایرکتوری کاری (Working Directory) در واقع همان محتوای پوشه پروژه است. (نکته: Directory همان Folder یا پوشه است.) این بخش را میتوان مانند یک میز کار در نظر گرفت که در آن امکان افزودن، ویرایش و حذف فایلهای پروژه وجود دارد.
ناحیه Staging و تاریخچه Commit ها بخشی از مخزن Git هستند.
ناحیه Staging را میتوان فضایی شبیه به پیشنویس در نظر گرفت. در این بخش میتوان نسخههای بروزشده فایلها را اضافه یا حذف کرد تا مشخص شود کدام تغییرات باید در Commit بعدی (نسخه بعدی پروژه) قرار گیرند. در پوشه .git، ناحیه Staging با فایلی به نام index نشان داده میشود.
در نهایت، تاریخچه Commit ها (Commit History) محلی است که Commit های ایجادشده در آن نگهداری میشوند. در پوشه .git، تاریخچه Commit ها با پوشهای به نام objects نمایش داده میشود.
یک گردشکار معمول در سیستم کنترل نسخه گیت
مرحله ۱ — ویرایش فایلها
اگر پروژه جدید باشد، ابتدا باید نخستین فایل در پروژه ایجاد گردد. در پوشه پروژه novel، یک فایل متنی ساده با نام chapter1 ایجاد میشود. این کار را میتوان با استفاده از یک ویرایشگر متن یا مستقیماً توسط ترمینال انجام داد. در این مثال، فایل مستقیماً درون ترمینال و با وارد کردن دستور touch chapter1.txt ایجاد میشود.
اگر پروژه از قبل وجود داشته باشد، میتوان برخی از فایلهای موجود را ویرایش کرد، فایلهای جدید افزود یا فایلهایی را حذف نمود.
در مرحله بعد، میتوان از دستور git status استفاده کرد. این دستور وضعیت دایرکتوری کاری و ناحیه Staging را نمایش میدهد و مشخص میکند که آیا تفاوتی میان این دو وجود دارد یا خیر.
در این مثال، تنها یک فایل جدید به پروژه اضافه شده است. هنگامی که از دستور git status استفاده میشود، Git اعلام میکند که یک فایل ردگیرینشده (Untracked) در دایرکتوری کاری وجود دارد و برای قرار دادن آن در Commit بعدی، باید از دستور git add استفاده شود. به این ترتیب، وارد مرحله ۲ میشوید.
مرحله ۲ — افزودن فایلها به ناحیه Staging
برای افزودن فایلهای جدید یا بروزشده به ناحیه Staging، میتوان از دستور git add استفاده کرد. اگر قرار باشد برخی از فایلهای تغییرکرده در Commit بعدی قرار نگیرند، کافی است آن فایلها به ناحیه Staging اضافه نشوند.
در این مثال، تنها فایل موجود در پروژه با استفاده از دستور git add و وارد کردن نام فایل، به ناحیه Staging اضافه میشود. سپس با اجرای دستور git status، Git نشان میدهد که فایل موردنظر به ناحیه Staging اضافه شده است.

تصویر(4)
همچنین نکته مهم این است که فایلها از دایرکتوری کاری به ناحیه Staging منتقل نمیشوند؛ بلکه از دایرکتوری کاری کپی شده و در ناحیه Staging قرار میگیرند.
مرحله ۳ — ایجاد Commit
در نهایت، برای ایجاد Commit از دستور git commit به همراه گزینه -m استفاده میگردد و یک پیام برای Commit وارد میشود. به عنوان مثال:
git commit -m "this is the first commit"
سپس میتوان از دستور git log برای فهرست کردن تمام Commit های موجود در پروژه، بهترتیب زمانی معکوس، استفاده کرد. در این مثال، تنها یک Commit وجود دارد.
اکنون نخستین Commit در پروژه ایجاد شده است؛ به عبارت دیگر، نخستین نسخه از پروژه ذخیره شده است.
هر Commit دارای یک Commit Hash شامل ۴۰ کاراکتر است. Commit Hash ترکیبی از حروف و اعداد بوده که برای نام Commit یا راهی جهت ارجاع به آن استفاده میشود.
همچنین اطلاعاتی مانند نام فردی که Commit را ایجاد کرده، زمان ایجاد آن و پیام مربوط به Commit نیز قابل مشاهده است.
تاریخچه Commit در گیت چیست؟
یک Repository از چندین Commit تشکیل میشود و در سادهترین حالت، هر Commit دارای یک Commit والد (Parent Commit) می باشد؛ یعنی Commit قبلی که پیش از آن ایجاد شده است. بنابراین، در تصویر زیر هر Commit به Commit قبلی خود اشاره میکند.

تصویر(5)
حالتهای پیچیدهتری نیز در هنگام کار با چندین Branch و انجام Merge وجود دارد، اما بررسی آنها خارج از محدوده این مقاله است.
Branch در گیت چیست؟
Branch یک اشارهگر (Pointer) به Commit است و شاخه پیشفرض در سیستم کنترل نسخه گیت معمولاً master یا main نام دارد. هر Branch با یک Hash به Commit مشخصی اشاره میکند و با ایجاد Commit های جدید، این اشارهگر به جدیدترین Commit منتقل میشود. جهت مشاهده Branch های موجود میتوان از دستور git branch و برای بررسی Commit ها git log را استفاده کرد. Branch ها اهمیت زیادی دارند، زیرا همکاری با دیگران و کار همزمان روی قابلیتها یا بخشهای مختلف پروژه را آسانتر میکنند.
جمع بندی
در این مقاله با مفاهیم پایه سیستم کنترل نسخه گیت و نقش آن جهت مدیریت و کنترل نسخه پروژههای نرمافزاری آشنا شدید. تفاوت Git و سرویسهایی مانند GitHub، نحوه ایجاد Repository و Commit و همچنین مفهوم Working Directory، Staging و Branch نیز بررسی شد. درک این مفاهیم، پایهای مناسب برای شروع کار با Git و همکاری مؤثرتر در پروژههای نرمافزاری فراهم میکند.