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

بعد از مطالعه این مقاله جواب پرسشهای زیر را خواهید دانست. آشنایی مقدماتی با git برای فهم مطالب این مقاله لازم است.

  • کلمه origin که خیلی از دستورات گیت ازش استفاده میکنند یعنی چی؟
  • مفاهیم staging area ،working tree و local repo هنگام استفاده از گیت به چه معنایی هستند؟
  • (remote repo (repository در گیت به چه معنی است؟
  • کاراکترهای ^ و ~ هنگام استفاده از گیت چه استفاده ای دارند؟
  • HEAD به چه معنایی است؟
  • Tag ها چی هستند و چه کاربردی دارند؟
  • وضعیت detached head به چه معنی است؟
  • آیا گیت garbage collector دارد؟
  • انواع مرج ها چی هستند؟

ساختار کلی استفاده از دستورات گیت

[Git <command> [options] [argument

آنچه بین علامت <> گذاشته شده یعنی اجباری است و آنچه بین علامت [] گذاشته شده یعنی اختیاری است.

دستور git config

[<Git config [–local | –global | –system] <key> [<value

system یعنی کانفیگ برای هر ریپو و هر یوزری که روی سیستم وجود دارد ست بشه

global یعنی کانفیگ برای هر ریپویی که یوزر فعلی(current) دارد ست بشه

local یعنی کانفیگ برای این ریپو فقط اعمال بشه. در نتیجه از این فلگ باید موقعی استفاده بشه که مسیر جاری کامنت پرامپ (cmd) ما یه ریپو گیت باشه.

اگه این فلگ ها ست نشه پیشفرض میشه local. موقع اعمال این کانفیگ ها به گیت. اولویت از local به system است. یعنی اگه local ست شده باشه اون اولویت داره و دیگه دو تای دیگه لحاظ نمیشن. اگه کانفیگ local ست نشده باشه. Global لحاظ میشه و اگه اون هم ست نشده باشه system لحاظ میشه.

گیت یه کانفیگی داره که با اون میتونیم بگیم که چه ادیتوری موقع کار با گیت باز بشه

Git config core.editor nano

مفاهیم Working tree ،local repo و staging area

در گیت چند تا مفهموم داریم. Working tree ،local repo و staging area .
وقتی از دستور add استفاده میکنیم فایلهایی که تغییر کردند و همینطور فایل های جدید به staging area یا index اضافه میشوند.
Working tree در واقع میشه محتوای دایرکتوری که گیت رو اونجا init کردیم. مثلا برای پروژه اندروید شما داخل فولدری که پروژه تون اونجاست git init رو میزنید که به کل محتوای اون پوشه میگن working tree. به عبارت دیگه محتویات فولدر پروژه شما میشه working tree.
داخل فولدر پروژه علاوه بر فایل های پروژه که بهش میگن working tree. بعد از init کردن گیت یه پوشه پنهان به اسم git. بوجود میاد که local repo و staging area داخل اون هستند.
Local repo شامل همه کامیت ها است و هر کامیت یک snapshot از کل پروژه است.
ساختار درختی زیر ۳ مفهوم توضیح داده شده را نشان میدهد.

  • Your Project directory
    • Working tree
    • git.
      • Local repo
      • Staging Area

remote repo در گیت

یک پروژه گیت میتواند فقط به صورت لوکال روی سیستم خودتون وجود داشته باشه و روی ریپوزیتوری ریموتی قرار داده نشه . ولی خب قطعا این کار خوب نیست چون هم باعث میشه که شما هیچ بک آپی از پروژتون خارج از سیستمتون نداشته باشید و هم باعث میشه که چند نفر نتونن روی پروژه کار کنند. برای گیت ۲ تا گزینه برای ریپوزیتوری ریموت وجود داره یکی github و دیگری bitbucket.

در remote repo، باید بگم که staging area و working tree وجود ندارد. با دستور git remote میتوانیم اطلاعاتی درباره remote repo ای که local repo ما بهش وصل شده به دست بیاریم. اگه v- استفاده کنید اطلاعات کاملتری بهتون میده. کلمه origin که کنار url مربوط به remote repo نوشته میشه در واقع اسم مستعار اون url است که به جای url استفاده میشود. اگه یه local repo ای داشته باشیم که بخوایم به remote repo وصلش کنیم اول یه remote repo باید درست کنیم. که یا توی گیت هاب یا توی بیت باکت این کار رو انجام میدیم.
کلمه origin هنگام کار کردن با گیت جایگزین اون url طولانی مربوط به remote repo است. اگه یه local repo ای داشته باشین و بخواین که اون رو به یه remote repo وصل کنید میتونید از دستور <git remote add <name> <url استفاده کنید.
قبلش remote repo رو در گیت هاب یا بیت باکت درست میکنید و بعد از دستور استفاده میکنید. موقع استفاده از دستور add اون قسمت name رو معمولا origin  میزارن که البته اختیاری است و هر اسمی میتوانید برای جایگزین url به عنوان نام مستعار انتخاب کنید.

مفهوم گراف در گیت

در گراف گیت هر نود یک کامیت است که با فلش جهت دار به پدر خود وصل میشود. این گراف تاریخچه پروژه رو نشان میدهد . اگر یه نود ۲ تا پدر داشته باشد یعنی در آنجا merge اتفاق افتاده است و اگر یک نود دو تا بچه داشته باشد یعنی در آنجا برنچ جدیدی ایجاد شده است.

مفهوم رفرنس و HEAD در گیت

در گیت یه مفهوم به اسم رفرنس وجود دارد. هر رفرنس نامی است که به یک کامیت اشاره میکند و علاوه بر آن هر رفرنس میتواند به جای کامیت به رفنس دیگری اشاره کند. گیت به صورت پیشفرض یه سری رفرنس درست میکند به اسم branch label. هر برنچ لیبل یک رفرنسی است که به آخرین کامیت برنچ اشاره میکند. برنچ لیبل هر برنچ، نامش با اسم برنچ یکی است. در گیت مفهومی وجود دارد به اسم HEAD که رفرنسی است به کامیت جاری یا به عبارت دیگه آخرین کامیت برنچ جاری اشاره میکند. در هر ریپو یک HEAD بیشتر وجود ندارد. وقتی شما بین برنچ ها جا به جا میشوید این HEAD هم تغییر میکند. در داخل فولدر git. یک فولدر به اسم refs وجود دارد که تمام رفرنس ها آنجا وجود دارند. برنچ لیبل ها داخل فولدر refs/heads قرار دارند. به ازای هر برنچ یک فایل در این فولدر وجود دارد. گیت به صورت پیشفرض برای هر برنچ یک رفرنس به اسم آن برنچ درست میکند و آن را داخل فولدر refs/head قرار میدهد. محتوای هر کدام از این فایل ها یک رشته sha1 است که شناسه همان کامیتی است که رفرنس به آن اشاره دارد. داخل فولدر git.  فایلی به اسم HEAD وجود دارد که محتوای آن مشخص میکند که HEAD الان به کجا اشاره میکند.

استفاده از کاراکترهای ^ و ~ در گیت

در گیت دو کاراکتری که همراه شناسه کامیت ها و یا رفرنس ها استفاده میشوند. ~ و ^ هستند. اگه یک دونه ~ استفاده شود معادل ۱~ است یعنی از این کامیتی که اسمش یا رفرنسش رو گفتیم یک کامیت قبل تر. ۲~ یعنی ۲ تا کامیت قبل تر و همینطور الی آخر. به جای ۲~ اگه نوشته بشه ~~ هم درسته. کاراکتر ^ همراه شناسه و یا رفرنس کامیت از نوع مرج استفاده میشود. ^ که معادل ۱^ است یعنی پدر اول کامیت. ۲^ یعنی پدر دوم کامیت که با ^^ فرق دارد. ^^ یعنی پدر اول پدر اول کامیت. کاراکترهای ^ و ~ میتوانند با هم ترکیب بشن و با هم استفاده بشن.

استفاده از تگ در گیت

رفرنس هایی که توسط کاربر ساخته میشند رو بهشون tag میگن. دو مدل تگ میتونیم استفاده کنیم. یکی تگ lightweight و دیگری annotated tag. اگه بخوایم تگ lightweight درست کنیم صرفا یک اسم بهش اختصاص میدیم ولی تگ annotated میتواند اطلاعات بیشتری مثل پیام و اسم سازنده آن و … رو هم همراه خودش داشته باشه. به خاطر اینکه annotated tag قابلیت های بیشتری داره توصیه میشود که از آن استفاده کنیم.
برای گرفتن تگ های جدید از سرور از دستور git fetch میتوانید استفاده کنید. برای دیدن لیست تگ ها از دستور git tag استفاده کنید. تگ ها از آنجاییکه نوعی رفرنس هستند میتوانند در دستورات گیت به جای شناسه کامیت و یا رفرنس استفاده شوند.
برای ایجاد تگ میتوانید از دستور <git tag <tag_name استفاده کنید. اگه بعد از tag_name شناسه کامیتی که میخواین تگ به آن اشاره کند را وارد نکنید پیشفرض HEAD در نظر گرفته میشود. برای ایجاد annotated tag میتوانید از دستور <git tag -a -m “message” <tag_name استفاده کنید. اگر قسمت m- را ننویسید ادیتور برای وارد کردن مسیج باز میشود. برای پوش کردن تگ به سرور از دستور <git push origin <tag_name استفاده کنید و اگه میخواهید یک دفعه همه تگ ها به سرور پوش شوند از دستور git push origin –tags استفاده کنید.

آشنایی با وضعیت detached head در گیت

در گیت یه وضعیتی داریم به اسم detached head که وقتی اتفاق می افتد که ما به یک کامیتی که عقب تر از کامیت جاری است برویم. به طور پیشفرض HEAD همیشه به کامیت جاری یا در واقع همون branch label اشاره میکند. حال اگر با دستور <git checkout <commit_name به یه کامیت دیگه برویم وضعیت detached head ایجاد میشود. اگر در وضعیت detached head باشید و بخواهید تغییری ایجاد کنید و کامیت کنید باید اول برنچ جدیدی بسازید و بعد تغییرات خود را در برنچ جدید کامیت کنید. در وضعیت detached head نمیتوان چیزی را کامیت کرد. برای حذف یک برنچ از دستور <git branch -d <branch_name استفاده میشود. اگه برنچی که میخواهید پاک کنید مرج نشده باشد باید از D- استفاده کنید. در این صورت کامیت های برنچ پاک شده به حالت dangling میروند و توسط garbage collector گیت پاک میشوند.

Garbage collector گیت هر چند وقت یکبار اجرا شده و کامیت های dangling رو پاک میکند. اگر اشتباهی یه برنچی که مرج نشده رو پاک کنید میتونین با کمک دستور reflog اون رو برگردونین البته اگه هنوز توسط garbage collector پاک نشده باشه. وقتی دستور git reflog رو اجرا کنید لیست کامیت هایی که اخیرا head بهشون اشاره کرده رو میاره. از اون لیست میتونین شناسه کامیت مورد نظر رو پیدا کنید و با دستور git checkout -b <branch_name> commit_id یه برنچ جدید با اون کامیت بسازید.

انواع مرج ها در گیت

در گیت ۴ نوع مرج داریم.

  • fast-forward
  • merge commit
  • squash merge
  • rebase

به طور پیشفرض وقتی ما از دستور merge استفاده میکنیم گیت دنبال اجرا کردن مدل fast forward است. البته اجرای این مدل مرج، فقط موقعی امکان پذیر است که برنچی که میخواهیم برنچ فیچر را با آن مرج کنیم بهش کامیت جدیدی اضافه نشده باشد. مرج fast forward به این صورت انجام میشود که فقط اشاره گر جا به جا میشود. در این روش مرج، کامیتی بوجود نمیاد که بیشتر از ۱ پدر داشته باشد. اصلا بعد از مرج fast forward کامیت جدیدی بوجود نمیاد. وقتی که مرج قابلیت اجرا شدن به روش fast forward رو نداشته باشد وقتی دستور مرج رو اجرا میکنید یک ادیتوری باز میشود که از شما درباره پیام مربوط به کامیت مرج سوال میکند. شما میتوانید دیفالت رو بپزیرید و یا آن را ادیت کنید. در این صورت بعد از مرج یک کامیت جدید ایجاد میشود که ۲ تا پدر خواهد داشت. بعضی وقت ها ممکن است سیاست شرکت طوری باشد که بخواهد همیشه بعد از مرج برنچ ها یک کامیت ایجاد شود تا بتواند از روی گراف، برنچ هایی که ایجاد شده اند رو ببیند. در این شرایط موقع استفاده از دستور مرج یه فلگی رو استفاده میکنیم که یعنی ما مرج fast forward رو نمیخواهیم و میخواهیم که حتما یه کامیت جدید ایجاد شود. دستور مرج به صورت زیر خواهد بود.


<Git merge –no-ff <branch_name

دستورات گیتی که با سرور ریموت ارتباط برقرار میکنند

دستورات گیتی که با سرور ریمتوت ارتباط برقرار میکنند Clone-fetch-pull-push هستند. دستور clone برای گرفتن دیتا از سرور ریموت استفاده میشه. Fetch شبیه pull است با این تفاوت که فقط دیتا رو از سرور میگیره ولی لیبل برنچ لوکال رو آپدیت نمیکنه. یعنی لیبل برنچ که همیشه به آخرین کامیت برنچ اشاره میکند بعد از گرفتن کامیت های جدید از سرور به آخرین کامیتی که از سرور اومده اشاره نمیکنه و شما بعد از fetch دوباره باید دستور pull رو اجرا کنید تا کار مرج کامیت هایی که از سرور اومده با کامیت های لوکال انجام بشه. دستور pull ترکیب fetch است با مرج کامیت هایی که از سرور اومده. یعنی علاوه بر گرفتن کامیت های جدید از سرور مرج کردن آنها با کامیت های لوکال برنچ رو هم انجام میدهد. یک مفهومی در گیت وجود دارد به اسم tracking branch. وقتی کامیت های جدیدی از سرور گرفته میشه tracking branch آپدیت میشه و به آخرین کامیت گرفته شده از سرور اشاره میکنه. هر برنچی که از سرور گرفته میشه یک tracking branch براش ساخته میشه. 


درباره نویسنده

پست های مرتبط

2 نظر

    1. فهیمه قاسمی
      فهیمه قاسمی

      سلام. بستگی داره که چقدر سوال وجود داشته باشه. اگه دوستان سوال داشته باشن و درخواست باشه براش ادامه ای هم برای سری آموزشهای گیت میتونم در نظر بگیرم.

      پاسخ

پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

18 + 18 =