پرش به مطلب اصلی

Git

مقدمه

VCS یا کنترلِ نسخه، سیستمی است که تغییرات را در فایل یا دسته‌ای از فایل‌ها ذخیره می‌کند و به شما این امکان را می‌دهد که در آینده به نسخه و نگارش خاصی برگردید.

اگر شما یک گرافیست یا طراح وب هستید و می‌خواهید نسخه‌های متفاوت از عکس‌ها و قالب‌های خود داشته باشید، استفاده از یک Version Control System یا سیستمِ کنترلِ نسخه انتخاب درستی است. VCS به شما این امکان را می‌دهد که فایل‌های انتخابی یا کل پروژه را به یک حالت قبلی خاص برگردانید، روند تغییرات را بررسی کنید، ببینید چه کسی آخرین بار تغییری ایجاد کرده که احتمالاً مشکل آفرین شده، چه کسی و چه وقت مشکلی را اعلام کرده و موارد کاربردی دیگر.

همچنین استفاده از VCS به این معناست که اگر شما در حین کار چیزی را خراب کردید و یا فایل‌هایی از دست رفت، به سادگی می‌توانید کارهای انجام شده را بازیابی نمایید. همچنین مقداری سربار به فایل‌های پروژه‌تان افزوده می‌شود.

هر چیزی در گیت قبل از اینکه ذخیره شود چک‌سام و سپس متعاقباً با آن چک‌سام فراخوانی می‌شود. این بدان معناست که غیرممکن است که محتوای فایل یا پوشه‌ای را بدون اینکه گیت متوجه شود ویرایش کنید. این کارکرد درون گیت و در پایین‌ترین مرتبه‌ها ساختار یافته و با تاروپود فلسفه‌اش همراه است. ممکن نیست که شما اطلاعات را حین انتقال یا بر اثر خرابی از دست بدهید بدون اینکه گیت آن را تشخیص دهد.

وقتی که کاری در گیت می‌کنید، تقریباً تمام آن افزودن به اطلاعات درون پایگاه‌داده گیت است. به بیان دیگر، انجام کاری که سیستم نتواند آن را بازگردانی کند یا اجبار آن به پاک‌سازی کامل اطلاعات به هر نحو بسیار دشوار است. اما در هر VCS دیگر، شما می‌توانید تغییراتی که هنوز کامیت نکرده‌اید بهم بریزید یا از دست بدهید، اما بعد از اینکه یک اسنپ‌شات به گیت کامیت کردید، از دست دادن آن بسیار مشکل است، بخصوص اگر به طور منظم پایگاه‌داده‌تان را به مخزنی دیگر پوش (Push) کنید.

برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید:


نصب

برای استفاده از امکانات Git در محیط Terminal یا CMD، باید برنامه‌ی Git را دانلود و نصب کنید که برخی از IDEها نیز برای اینکه امکانات این ابزار را در قالبی گرافیکی در اختیار کاربر بگذارند، به‌عنوان پیشنیاز به این برنامه نیاز دارند، پس پیشنهاد می‌شود فارغ از ترجیحات، این نرم‌افزار را نصب کنید.

ابزار دیگری که امکانات Git را در قالبی گرافیکی در اختیار شما می‌گذارد نرم‌افزار GitHub Desktop می‌باشد که با داشتن اکانت GitHub می‌توانید از امکانات آن بهره‌مند شوید.

برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید:


یادگیری

وضعیت داده‌ها در گیت

اطلاعات درون گیت می‌توانند سه وضعیت داشته باشند: ویرایش شده، استیج شده و کامیت شده.

  • ویرایش‌شده یا Modified به این معناست که شما تغییری در فایل ایجاد کرده‌اید اما هنوز آن را به پایگاه داده خود کامیت نکرده‌اید.
  • استیج‌شده یا Staged به این معناست که شما ویرایشی در نسخه حال فایل را علامت‌گذاری کرده‌اید تا به اسنپ‌شاتِ کامیت بعدی شما اضافه شود.
  • کامیت‌شده یا Committed به این معناست که اطلاعات با امنیت کامل در پایگاه‌داده محلی شما ذخیره شده‌اند.

The lifecycle of the status of your files

البته وضعیت «دنبال نشده» نیز داریم که به معنی عدم حضور داده در Git می‌باشد، ولی این وضعیت از دیدگاهی میان «وضعیت داده‌ها در گیت» طبقه‌بندی نمی‌شود.

برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید:


ایجاد پروژه

برای ایجاد پروژه می‌توان یکی از دو مسیر زیر را دنبال کرد:

تبدیل یک پوشه محلی به مخزن گیت

  1. یک پوشۀ جدید ایجاد کنید
  2. Terminal یا CMD را باز کرده و به پوشه مورد نظر وارد شوید
  3. با اجرای دستور git init در داخل پوشه، یک فولدر به نام .git ایجاد می‌شود و از این به بعد گیت تغییرات درون این پوشه را دنبال خواهد کرد
cd "/your/project/path"
git init

نسخه برداری(clone) از یک مخزن موجود

  1. وارد یکی از سرورهای گیت (Github، Gitlab، Microsoft Azure یا ...) شوید
  2. لینک یک مخزن را کپی کنید
  3. یک پوشه جدید در سیستم خود ایجاد کنید
  4. Terminal یا CMD را باز کرده و به پوشه مورد نظر وارد شوید
  5. از اتصال به اینترنت اطمینان حاصل کنید و دستور git clone را اجرا کنید تا فایل‌های روی سرور به پوشۀ شما منتقل شوند
cd "/your/project/path"
git clone https://example.come/repository

برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید:


اعمال تغییرات

برای آگاهی از وضعیت فایل‌ها از دستور زیر استفاده می‌شود که فایل‌های ویرایش شده و استیج شده را به شما نمایش می‌دهد:

git status

برای استیج کردن فایل‌های ویرایش شده مطابق دستورات زیر، هم می‌توان از نام فایل استفاده کرد و هم می‌توان از کاراکتر نقطه برای انتخاب تمامی فایل‌های تغییر کرده استفاده کرد:

git add <some-file-name.ext>
git add .

در نهایت برای کامیت کردن فایل‌های استیج شده می‌توانید از دستور زیر استفاده کنید که اسنپ‌شاتی از فایل‌ها تهیه کرده و در پایگاه دادۀ محلی ذخیره می‌کند:

git commit -m "some brief description about changes you have made"

برای مشاهده لیست کامیت‌های انجام شده روی مخزن خود نیز می‌توانید از دستور زیر استفاده کنید:

git log

همچنین می‌توانید گزارش بالا با دستور زیر به صورت خلاصه‌تر مشاهده کنید:

git log --oneline

برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید:


بازگرداندن تغییرات

همانگونه که پیشتر گفته شد یکی از مزایای استفاده از ابزارهای کنترل نسخه امکان بازگشت به عقب و اصلاح اشتباهات است، در این قسمت به راه‌حل‌های موجود می‌پردازیم.

amend

یکی از برگشت‌های معمول زمانی صورت می‌گیرد که زودتر از آن‌چه که باید تغییرات را کامیت کرده‌اید یا بعد از کامیت کردن متوجه مشکلی در فایل‌های کامیت شده یا تگ کامیت می‌شوید. در این حالت با استفاده از گزینۀ amend-- می‌توانید فایل‌های استیج شده را به کامیت قبلی اضافه کنید و توضیحات کامیت را نیز ویرایش کنید:

git commit -m "new description" --amend

restore

برداشتن داده از حالت استیج شده یکی دیگر از امکانات مورد نیاز می‌باشد:

git restore --staged <some-file-name.ext>

بازگرداندن فایل به وضعیتی که در آخرین کامیت داشته است یکی از راه‌های معمول برای درست کردن چیزی است که خراب کرده‌ایم؛ با این کار تمام تغییراتی که از آخرین کامیت بر روی یک فایل صورت گرفته است برگردانده می‌شوند و فایل به وضعیت سابق خود باز می‌گردد:

git restore <some-file-name.ext>

برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید:


gitignore

در بسیاری از تکنولوژی‌ها برای نگهداری اطلاعات حساس مانند اطلاعات مربوط به پایگاه داده، برخی اطلاعات هویتی و داده‌های وابسته به پلتفرم، از فایل‌های محلی در مسیر پروژه استفاده می‌شود که باید از انتشار این فایل‌ها پرهیز کرد. همچنین بسیاری از تکنولوژی‌ها برای اجرای کدها علاوه بر کامپایلر یا مفسر به تعدادی کتابخانه و فایل‌های اضافه نیاز دارند که عموما حجم بالایی را اشغال می‌کنند بنابراین پیشنهاد می‌شود از قرار دادن این داده‌ها در گیت پرهیز کنید.

گیت امکانی برای نادیده گرفتن برخی داده‌ها فراهم کرده است تا کاربر قادر باشد برخی فایل‌ها را از دید گیت مخفی کند. برای انجام این کار کافی است در پوشه‌ای که می‌خواهید در آن فایل‌هایی را از دید گیت مخفی کنید یک فایل با پسوند gitignore ایجاد کنید و نام فایل‌ها یا مسیر منتهی به آن‌ها را در این فایل متنی بنویسید. در صورتی که فایل‌های مورد نظر در گیت ذخیره نشده باشند از این پس نیز توسط گیت دنبال نمی‌شوند.

در سطح وب ابزارهایی برای ایجاد محتوای فایل gitignore با توجه به تکنولوژی‌هایی که در پروژه خود استفاده کرده‌اید وجود دارند که ما لینک زیر را پیشنهاد می‌کنیم:


ریموت

برای اینکه بتوانید در هر پروژهٔ گیت همکاری کنید، دانستن شیوهٔ مدیریت مخزن‌های ریموت لازم است. مخازن ریموت یک نسخه از پروژهٔ شما هستند که در اینترنت یا جایی دیگر در شبکه قرار دارند. می‌توانید چند تا از آن‌ها داشته باشید که معمولاً هر کدام برای شما یا فقط قابل خواندن یا خواندنی/نوشتی هستند. همکاری با دیگران شامل درگیری با مدیریت این مخازن ریموت و پوش/پول کردن داده از/به آن‌ها است.

مدیریت مخازن ریموت به مفهوم دانستن نحوۀ افزودن مخازن ریموت، حذف کردن ریموت‌های منقضی، مدیریت شاخه‌های گوناگون ریموت و تعریف آن‌ها به‌عنوان دنبال‌شده یا دنبال‌نشده و ... است. در این بخش ما درباره برخی از مهارت‌‌های مدیریت ریموت صبحت خواهیم کرد.

remote

مشاهدۀ ریموت‌های پروژۀ محلی به سادگی با دستور زیر امکان‌پذیر است:

git remote

remote add

مخازنی که به وسیله دستور git clone بر روی سیستم خود کپی کردید، همواره یک ریموت دارند؛ اما برای اضافه کردن ریموت جدید به یک مخزن محلی می‌توانید از دستور زیر استفاده کنید، که یک ریموت با آدرس نوشته شده و نام دلخواه به مخزن شما اضافه می‌کند:

git remote add <any-name-that-you-want> <remote-url>

معمولاً نام ریموت را origin می‌گذارند.

fetch & pull

دستور fetch تمام اطلاعات ریموت را به سیستم محلی شما کپی می‌کند، اما دستور pull علاوه بر کپی کردن اطلاعات از سرور، این اطلاعات را با اطلاعات محلی شما نیز ادغام می‌کند:

git fetch <remote-name>
git pull <remote-name>

push

در مرحله‌ای شما نیاز دارید که تغییرات اعمال شده روی نسخه محلی (کامیت‌ها) را به ریموت خود ارسال کنید، این کار با دستور زیر صورت می‌گیرد که در آینده به موضوع branch خواهیم پرداخت:

git push <remote-name> <branch-name>

rename & remove

با دستور rename به سادگی می‌توانید نام ریموت را تغییر بدهید و با دستور remove می‌توانید ریموت و تمام شاخه‌های پیگیر و پیکربندی‌های مربوط به ریموت را پاک کنید:

git remote rename <old-name> <new-name>
git remote remove <name>

برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید:


شاخه

شاخه یا branch و شعبه‌سازی یا Branching به این معناست که شما از مسیر اصلی توسعه جدا شده و بدون ایجاد تغییر در مسیر اصلی، به ادامهٔ کار بپردازید.

commit tree

دستور کامیت چه کاری انجام می‌دهد؟

وقتی یک کامیت می‌سازید، گیت یک آبجکت کامیت را که شامل یک نشانگری به اسنپ‌شات دربرگیرندهٔ اطلاعات صحنهٔ شماست، ذخیره می‌کند. این آبجکت همچنین شامل نام نویسنده، آدرس ایمیل او، پیغامی که وارد کرده و یک نشانگر به کامیت یا کامیت‌هایی که مستقیماً قبل این کامیت (والد یا والدین) آمده‌اند، است؛ به طوری که صفر والد برای کامیت اولیه، یک والد برای کامیت معمولی و چند والد برای کامیت مرج وجود خواهد داشت.

وقتی کامیتی را با اجرای دستور git commit می‌سازید، گیت تمام زیرپوشه‌ها را چک‌سام می‌کند و آن‌ها را به‌عنوان یک آبجکت درخت در مخزنش ذخیره می‌کند. سپس یک کامیت آبجکت، شامل متادیتا و نشانگری به ریشۀ درخت پروژه، می‌سازد تا بتواند اسنپ‌شات پروژه را هنگامی که نیاز بود بازسازی کند.

برنچ در عمل چیست؟

برنچ یک نشانگر سبک‌وزن قابل انتقال به یکی از کامیت‌هاست. نام پیش‌‌فرض برنچ در گیت master یا main است. همچنان که کامیت می‌سازید، یک برنچ master برایتان ساخته می‌شود که به آخرین کامیتی که ساخته‌اید اشاره می‌کند. هر بار که کامیت می‌کنید نشانگر برنچ master به طور خودکار به جلو حرکت می‌کند.

چگونه گیت می‌داند که روی چه شاخه‌ای کار می‌کنید؟

گیت نشانگر خاصی به نام HEAD را در خود دارد. HEAD نشانگری است که به برنچ محلی که روی آن هستید اشاره می‌کند.

ساختن برنچ جدید

برای ساخت یک برنچ جدید (اشاره‌گر به مکان کنونی HEAD) کافی است از دستور زیر استفاده کنید تا یک برنچ جدید با نام دلخواه برای شما ساخته شود:

git branch <branch-name>

تعویض برنچ‌ها

برای تعویض یا جابه‌جایی به یک برنچ از پیش ساخته شده، می‌توانید دستور زیر را اجرا کنید:

git checkout <branch-name>

مزیت استفاده از برنچ‌ها

عموماً از برنچ‌ها برای مدیریت دسترسی و حفاظت از شاخۀ اصلی استفاده می‌شود.

ادغام برنچ‌ها

برای ادغام first-branch با second-branch ابتدا به second-branch میرویم و سپس با استفاده از دستور merge، محتویات شاخۀ first-branch را به شاخۀ second-branch نیز منتقل می‌کنیم:

git checkout second-branch
git merge first-branch

برای آشنایی بیشتر با این مفهوم می‌توانید از لینک‌های زیر استفاده کنید: