مقدمهای بر کنترل نسخه و اهمیت آن
اگر به تازگی وارد دنیای برنامهنویسی شدهاید، احتمالاً با چالش مدیریت تغییرات کد مواجه شدهاید. تصور کنید روی یک پروژه کار میکنید و پس از چندین ساعت کدنویسی، متوجه میشوید که تغییرات اخیر باعث بروز خطا شده و نمیدانید دقیقاً کدام بخش را باید به حالت قبل برگردانید. اینجاست که سیستمهای کنترل نسخه (Version Control Systems) به کمک شما میآیند. کنترل نسخه به شما امکان میدهد هر تغییر در فایلهای پروژه را ثبت کنید، به نسخههای قبلی بازگردید، تاریخچهی کامل تغییرات را مشاهده نمایید و با سایر توسعهدهندگان بهصورت هماهنگ همکاری کنید. بدون یک سیستم کنترل نسخه، توسعهی نرمافزار بهسرعت به هرجومرج تبدیل میشود.
در میان تمام سیستمهای کنترل نسخه موجود، Git بدون شک محبوبترین و پرکاربردترین آنهاست. گیت یک سیستم کنترل نسخهی توزیعشده (Distributed) است، به این معنا که هر توسعهدهنده یک نسخهی کامل از مخزن را روی سیستم خود دارد. این ویژگی باعث میشود سرعت عملیات بسیار بالا باشد و حتی بدون اتصال به اینترنت نیز بتوانید به کار خود ادامه دهید. گیت توسط لینوس توروالدز، خالق سیستمعامل لینوکس، در سال ۲۰۰۵ ساخته شد و از آن زمان تاکنون به استاندارد طلایی صنعت نرمافزار تبدیل شده است.
گیت (Git) چیست و چگونه کار میکند؟
گیت یک نرمافزار متنباز و رایگان است که تغییرات فایلها را در طول زمان دنبال میکند. برخلاف سیستمهای قدیمیتر که تغییرات را بهصورت فایلبهفایل ذخیره میکردند، گیت از یک ساختار عکسفوری (Snapshot) استفاده میکند. هر بار که شما تغییری را ثبت میکنید (Commit)، گیت یک عکس فوری از وضعیت تمام فایلهای پروژه در آن لحظه ذخیره میکند. اگر فایلی تغییر نکرده باشد، گیت بهجای ذخیرهی مجدد آن، تنها یک ارجاع به نسخهی قبلی ایجاد میکند. این روش باعث میشود گیت بسیار سریع و کمحجم عمل کند.
گیت دارای سه ناحیهی اصلی است: دایرکتوری کاری (Working Directory) که همان پوشهی پروژه روی سیستم شماست، ناحیهی آمادهسازی (Staging Area) که تغییرات را قبل از ثبت نهایی در خود نگه میدارد، و مخزن محلی (Local Repository) که تاریخچهی کامل پروژه در آن ذخیره میشود. درک این سه ناحیه برای استفادهی صحیح از گیت ضروری است. فرآیند معمول کار با گیت به این صورت است: ابتدا فایلها را در دایرکتوری کاری ویرایش میکنید، سپس تغییرات مورد نظر را به ناحیهی آمادهسازی اضافه میکنید، و در نهایت آنها را با یک پیام توصیفی در مخزن محلی ثبت مینمایید.
نصب و راهاندازی گیت
برای شروع کار با گیت، ابتدا باید آن را روی سیستم خود نصب کنید. نصب گیت بسیار ساده است و برای تمام سیستمعاملهای اصلی نسخهی مناسب وجود دارد. در سیستمعامل ویندوز، میتوانید نصبکنندهی رسمی را از وبسایت git-scm.com دانلود کرده و مانند هر نرمافزار دیگری نصب کنید. در سیستمعامل مک، گیت معمولاً بهصورت پیشفرض نصب شده است، اما میتوانید با نصب Xcode Command Line Tools یا از طریق Homebrew آخرین نسخه را دریافت کنید. در لینوکس نیز با استفاده از مدیر بستهی توزیع خود (مانند apt برای اوبونتو یا dnf برای فدورا) میتوانید گیت را نصب نمایید.
پس از نصب، پنجرهی ترمینال (Command Prompt در ویندوز یا Terminal در مک و لینوکس) را باز کنید و دستور زیر را اجرا نمایید تا از نصب صحیح گیت اطمینان حاصل کنید:
git --version
خروجی این دستور باید نسخهی نصبشدهی گیت را نمایش دهد، برای مثال:
git version 2.42.0. حالا باید تنظیمات اولیهی گیت را انجام دهید.
مهمترین تنظیمات شامل نام کاربری و ایمیل شماست که در تاریخچهی commitها ثبت میشود.
دستورات زیر را با نام و ایمیل خود اجرا کنید:
git config --global user.name "نام و نام خانوادگی شما"
git config --global user.email "your.email@example.com"
با این کار، هویت شما برای تمام مخازن گیت روی سیستم تنظیم میشود.
میتوانید با دستور git config --list تمام تنظیمات را مشاهده کنید.
ایجاد اولین مخزن گیت
برای شروع یک پروژهی جدید با گیت، ابتدا یک پوشه برای پروژهی خود بسازید
و وارد آن شوید. سپس با اجرای دستور git init یک مخزن گیت
در آن پوشه ایجاد کنید. این دستور یک پوشهی مخفی به نام .git
میسازد که تمام اطلاعات مربوط به تاریخچه، شاخهها و تنظیمات گیت در آن
ذخیره میشود. از این لحظه به بعد، پوشهی شما تحت کنترل نسخه قرار دارد.
mkdir my-first-project
cd my-first-project
git init
خروجی دستور git init چیزی شبیه به این خواهد بود:
Initialized empty Git repository in /path/to/my-first-project/.git/.
اکنون میتوانید فایلهای پروژهی خود را در این پوشه ایجاد کنید.
برای بررسی وضعیت مخزن در هر لحظه، از دستور git status استفاده کنید
که فایلهای تغییر یافته، فایلهای آمادهشده برای ثبت و فایلهای ردیابینشده را نشان میدهد.
ثبت تغییرات با Commit
فرض کنید یک فایل به نام index.html در پوشهی پروژه ایجاد کردهاید.
با اجرای git status خواهید دید که این فایل در بخش
Untracked files (فایلهای ردیابینشده) قرار دارد.
برای اینکه گیت این فایل را دنبال کند، باید آن را به ناحیهی آمادهسازی اضافه کنید.
از دستور git add برای این کار استفاده میشود:
git add index.html
اگر میخواهید تمام فایلهای تغییر یافته را یکجا به ناحیهی آمادهسازی اضافه کنید،
میتوانید از git add . استفاده کنید (نقطه به معنی تمام فایلهای
موجود در پوشهی جاری است). پس از آمادهسازی، نوبت به ثبت تغییرات در مخزن
با دستور git commit میرسد. هر commit باید یک پیام توصیفی
داشته باشد که توضیح میدهد چه تغییراتی انجام شده است:
git commit -m "ایجاد فایل index.html با ساختار اولیه"
پیام commit باید کوتاه، مفید و توصیفی باشد. عادت کنید
پیامهایی بنویسید که چند ماه بعد هم بتوانید بفهمید چه تغییری انجام دادهاید.
برای مشاهدهی تاریخچهی commitها از دستور git log استفاده کنید
که لیست تمام commitها را به همراه نویسنده، تاریخ و پیام نمایش میدهد.
با اضافه کردن فلگ --oneline میتوانید خلاصهای فشرده از تاریخچه را ببینید.
شاخهبندی (Branching) در گیت
یکی از قدرتمندترین ویژگیهای گیت، شاخهبندی است.
شاخهها به شما امکان میدهند بدون تأثیرگذاری روی کد اصلی،
ویژگیهای جدید را توسعه دهید، باگها را برطرف کنید یا آزمایشهای
مختلف انجام دهید. شاخهی پیشفرض گیت معمولاً main
یا master نام دارد. برای ایجاد یک شاخهی جدید
از دستور git branch استفاده کنید:
git branch feature-login
این دستور یک شاخهی جدید به نام feature-login ایجاد میکند،
اما شما همچنان روی شاخهی اصلی هستید. برای جابهجایی به شاخهی جدید
از git checkout یا git switch استفاده کنید:
git checkout feature-login
# یا در نسخههای جدیدتر گیت:
git switch feature-login
همچنین میتوانید با یک دستور هم شاخه را ایجاد کنید و هم به آن سوئیچ نمایید:
git checkout -b feature-login یا
git switch -c feature-login.
اکنون هر commitی که انجام دهید روی شاخهی feature-login
ثبت میشود و شاخهی اصلی دستنخورده باقی میماند.
برای مشاهدهی لیست تمام شاخهها از git branch
بدون هیچ آرگومانی استفاده کنید. شاخهی فعلی با یک ستاره مشخص میشود.
ادغام شاخهها با Merge
پس از اینکه کار روی یک شاخهی فرعی به پایان رسید، نوبت به ادغام (Merge) آن با شاخهی اصلی میرسد. برای این کار، ابتدا به شاخهی مقصد (مثلاً main) سوئیچ کنید و سپس دستور merge را با نام شاخهی مبدأ اجرا نمایید:
git checkout main
git merge feature-login
گیت بهصورت خودکار تغییرات را با یکدیگر ترکیب میکند. اگر تغییرات دو شاخه با یکدیگر تداخل (Conflict) نداشته باشند، ادغام با موفقیت انجام میشود و یک commit ادغام ایجاد میگردد. ام