وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

راهنمای استفاده از gitlab و آموزش git

گیت چیست و چطور از آن استفاده کنیم

10 28,646
زمان لازم برای مطالعه: 8 دقیقه

گیت چیست ؟!

گیت یک ورژن کنترل است!

گیت (به انگلیسی: Git) یک نرم‌افزار کنترل نسخه و از مدل نرم‌افزارهای آزاد و متن‌باز برای بازنگری کد منبع توزیع شده و مدیریت منبع کد است که برای دنبال کردن تغییر فایلهای کامپیوتری و دنبال کردن کردن کارهای انجام شده روی آنها توسط افراد مختلف است. هدف اولیه این نرم‌افزار برای استفاده در پروژه‌های نرم‌افزاری بوده است ولی می‌توان از آن تنها برای دنبال کردن تغییر فایل‌ها هم استفاده کرد. [ ویکی پدیا ]

راهنمای استفاده از gitlab و آموزش git

نصب و فعال سازی گیت

برای نصب و دانلود گیت به وب سایت git-scm.com مراجعه کنید و مراحل نصبش را طی کنید و برای نصب گیت هاب هم در صورتی که وارد وبسایت گیت هاب شوید می توانید نرم افزار مربوط به گیت هاب را دانلود کنید و به راحتی ریپازیتوری هایی که ایجاد میکنید را مدیریت کنید.

راهنمای استفاده از gitlab و آموزش git

با توجه به اینکه برای پروژه ها بیشتر از گیت لب استفاده میکنم بیشتر در این رابطه صحبت میکنم هرچند دستورات و کامندهای گیت هاب هم شبیه به گیت لب است و تفاوت زیادی ندارد.

دانلود گیت برای سیستم عامل مک

دانلود گیت برای سیستم عامل ویندوز

دانلود گیت برای لینوکس

ایجاد SSH key برای گیت‎لب

برای دسترسی به پروژه ها باید یک کلید SSH در پروفایل خود ایجاد کنید که مدیریت و بررسی دسترسی شما به پروژه برای استفاده از گیت است، مطابق تصویر زیر وقتی وارد پروفایل گیت لب خود می شوید لینک Generate برای ایجاد کلید اختصاصی گیت لب برای پروفایل شما نمایش داده می شود که با کلیک روی آن و طی مراحل آن به راحتی کلید را ایجاد میکنید و در کادر مربوطه در پروفایل خود قرار می دهید.

profile settings ssh keys gitlab

برای فعالسازی ابتدا در مسیر موردنظر ترمینال را باز میکنیم و س‍پس کد زیر را وارد میکنیم :

ssh-keygen -t rsa -C "yourname@yourdomain.ext"

۲ – کد تولید شده را در باکس تصویر فوق که با دستور زیر ک‍پی میشود قرار میدهیم و ایجاد میکنیم :

pbcopy < ~/.ssh/id_rsa.pub

البته دستور آخر برای سیستم عامل های مختلف متفاوته که من برای مک نوشتم پ برای سایر سیستم عامل ها به صورت زیر است :

SSH KEY

دستورات مدیریت گیت ( git)

دستورات گیت به صورت زیر هستند :

git init [project name]

ایجاد یک ریپازیتوری جدید بر روی سیستم خود

git clone MY_URL

دانلود از یک ریپازیتوری موجود (url) بر روی سیستم خود

git status

لیست تغییرات و یا فایل های جدیدی که هنوز commit نشدند.

git add .

افزودن همه فایلهای جدید به stage و آماده بودن برای commit

git add [file name]

افزودن فایل موردنظر به stage و آماده برای commit کردن

git commit -m "Description "

commit کردن همه فایلهای موجود در stage

git commit am "Commit Description "

به طور همزمان، هم فایل ها را add میکنیم و هم commit  میکنیم و توضیحی برای commit قرار می دهیم.

git commit -a automatically stage all tracked, modified files before the commit If you think the git add stage of the workflow is too cumbersome, Git allows you to skip that part with the -a option. This basically tells Git to run git add on any file that is “tracked” – that is, any file that was in your last commit and has been modified. This allows you to do a more Subversion style workflow if you want, simply editing files and then running git commit -a when you want to snapshot everything that has been changed.

git push 

آپلود و ارسال فایلهای جدید به سرور زیر نظر branchی که در آن هستیم.

git push origin master

آپلود و ارسال فایلهای جدید به سرور زیر نظر branch اصلی master که معمولا اینکار انجام نمی شود و ترجیحا روی branch دیگری push میکنیم و سپس merge میکنیم.

git pull 

دریافت آخرین تغییرات از سرور و merge.

نکته : وقتی به صورت تیم روی پروژه ای کار می‌کنید مثلا شما روی branchی به نام example هستید و تغییراتی اخیرا روی پروژه روی برنچ تست پروژه به نام برنچ dev انجام شده، شما بدون اینکه نیاز باشه که مرج رکوستی ارسال کنید میتوانید آخرین تغییرات را از برنچ dev دریافت کنید به صورت زیر:

git pull origin dev

——–

git branch

مشخص شدن این موضوع که در کدام branch هستیم و کدها را در کدام branch تغییر و یا دریافت میکنیم.

git fetch

و یا 

git fetch --all

دریافت آخرین تغییرات از origin branch. ( no merge )

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

( در صورتیکه در Branchی هستیم و میخواهیم تغییر branch دهیم، اگر branch را جدیدا ایجاد کرده باشیم باید کد فوق را وارد کنیم تا branch ها و تغییرات شناسایی شوند. )

git branch --all

و یا

git branch

نمایش لیست همه branch

git checkout Develope

تغییر branch مثلا به شاخه Develope

git branch New_Branch 

ایجاد Brnach جدید با نام New_Branch.

git branch -av 

نمایش لیست تمام Branchها، Local and Remote

git branch -d My_Branch 

حذف My_Branch از لیست Branchها.

git checkout Branch_A
git merge Branch_B 

Merge کردن Branch_B داخل Branch_A.

git diff 

نمایش تغییرات فایلهایی که هنوز وارد stage نشدند.

git diff --cached 

نمایش تغییرات فایلهایی که وارد stage شدند.

git diff HEAD 

نمایش تمام تغییرات فایلهایی که وارد stage شدند و فایل هایی که هنوز وارد stage نشدند (Unstage).

git diff commit1 commit2 

تفاوت تغییرات بین دو commit را نمایش میدهد.

git blame [File Name] 

لیست تمام تغییرات فایل موردنظر را همراه با تاریخ و نام دولوپری که تغییرات را ایجاد کرده است نمایش می دهد.

git log

نمایش لیست تمام تغییرات فایل ها.

git log --decorator

نمایش تاریخچه تمام تغییرات به همراه اطلاعات تگ

git log -p [file/directory[

نمایش تاریخچه لیست تغییرات فایل file/directory با نمایش لیست تغییرات آنها (diff) در جریان کامیت ها.

git reset [file[

unstage  کردن فایل مورد نظر و اعمال تغییرات جدید.

git reset --hard

بازگردانی ( Revert ) تمام تغییرات از آخرین commitی که انجام شده است.

 

git tag

نمایش لیست تگ‌های موجود

git tag TagName

افزودن تگ به آخرین فایلها و تغییرات انجام شده

git push --delete origin TagName

حذف تگ روی ریپازیتوری

git tag -d TagName

حذف تگ ایجاد شده روی لوکال

git push --tags

ارسال همه تگ‌های ایجاد شده روی ریپازیتوری

git tag -a TagName

افزودن تگ به همراه توضیحات. وقتی از این دستور استفاده میکنید صفحه جدیدی باز می‌شود تا توضیحات تگ را وارد کنید.

git tag -am "Description" TagName

ایجاد تگ به همراه توضیحات

git tag -n 

نمایش لیست تگ‌ها به همراه توضیحات هر تگ
 نکته ۱ :  درصورتیکه بخواهیم پروژه را از  گیت‌لب clone کنیم و روی سیستم خود راه اندازی نمائیم همانطور که می‌دانیم دستور زیر را وارد میکنیم :

git clone git@gitlab.com:user/project-name.git

در این حالت پروژه با فولدری به نام project-name که روی گیت قبلا ساختیم بر روی سیستم ما ایجاد می‌شود، وقتی ما مثلا می‌‌خواهیم پروژه را روی سرور pull کنیم و قبلش باید پروژه را clone کنیم به احتمال زیاد نمی‌خواهیم با اسمی که روی گیت وجود دارد روی سرور باشد و فقط میخواهیم محتویات آن را داخل فولدری با نامی که ما میسازیم مثلا example ایجاد نماییم. برای اینکار کد زیر را به جای کد فوق وارد می‌کنیم:

git clone [repository] [local path]

یا

git clone git@gitlab.com:user/project-name.git example

همچنین میتوانیم وارد فولدر مورد نظر شویم و دستور زیر را وارد کنیم :

git clone git@gitlab.com:user/project-name.git . 

علامت dot آخر دستور بسیار مهم است اگر آن را ننویسیم با اسم ریپازیتوری پروژه clone میشود.

تجربه ۱ : در پروژه‌ای که اخیرا انجام شد فایلی به نام composer.json به صورت کاملا اتفاقی توسط یکی از اعضای تیم روی سرور تغییر داده شده بود و وقتی آخرین تغییرات را روی سرور pull میکردیم اجازه داده نمیشد چراکه اول باید تغییرات روی سرور تکلیفش مشخص میشد! 

git checkout file before commit

همانطور که در تصویر می‌بینید تا وقتی این فایل که تغییر داده شده بود revert نشد اجازه pullکردن آخرین تغییرات به ما داده نشد. برای اینکه فایل رو به حالت قبل و بدون تغییر برگردانیم با توجه به اینکه فایل commit نشده بود از دستور زیر استفاده کردیم.

git checkout -- filename

قرار دادن پروژه روی گیت‌لب

وقتی توی گیت‌لب پروژه ای ایجاد می‌کنید مطابق توضیحات بالا به راحتی با clone کردن آن میتوان پروژه را روی لوکال خودمون ایجاد کنیم. ولی اگر قبلا فولدر پروژه ایجاد شده بود و میخواستیم روی گیت ارسال کنیم چگونه باید اقدام کنیم؟! 

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

gitlab instalation

همانطور که در توضیحات بالا ذکر شده یا پروژه را clone میکنیم و اگر فولدر قبلا وجود داشت و خواستیم روی گیت‌لب قرار دهیم به صورت توضیحات Existing folder  اقدام می‌کنیم. به ترتیب کدهای زیر را اجرا می‌کنیم.

cd existing_folder
git init
git remote add origin git@gitlab.com:xxxxxxxxxxx
git add .
git commit -m "Initial commit"
git push -u origin master

برون کشی (checkout) یک مخزن

یک کپی از یک مخزن محلی (local) با دستور زیر به وجود می آید.
git clone /path/to/repository
زمانی که سرور راه دور(remote) است از دستور زیر استفاده کنید.
git clone username@host:/path/to/repository

گردش کار در git چطور است ؟

مخزن محلی شما، شامل 3 درخت (tree) می باشد که توسط گیت نگهداری می شود. اولین درخت Working Directory می باشد که شامل فایل های واقعی است. دومین درخت شاخص (Index) می باشد که رد فایل هایی که تغییر یافته یا اضافه و کم شده را در بر خواهد داشت و در نهایت head که به آخرین commitای که شما انجام داده اید اشاره می کند.
گردش کار git

پیشنهاد می‌کنیم بخوانید:  روش نصب Git بر روی CentOS 7

اضافه کردن و نهایی کردن (add & commit) در git چطور است ؟

شما می توانید تغییرات را با دستور زیر به درخت شاخص (Index) اضافه کنید. git add <filename>
git add *
این اولین گام در یک گردش کاری با گیت است. برای نهایی کردن تغییرات باید آنها را commit کنید.
git commit -m "Commit message"
حال تغییرات در HEAD قرار دارد اما سرور راه دور شما هنوز تغییرات را ندارد و همه تغییرات محلی و روی کامپیوتر شما است.

اعمال تغییرات (pushing changes) در git

اگر بخواهید تغییراتی که انجام داده اید و هم اکنون در HEAD قرار دارد به سرور راه دور ارسال شود دستور زیر را اجرا کنید.
git push origin master
این دستور تغییراتی که انجام داده اید را به سرور راه دور شاخه master اعمال می کند.

اگر مخزن را clone نکرده باشید و بخواهید به مخزن، خود در یک سرور راه، دور متصل شوید از دستور زیر استفاده کیند.
git remote add origin <server>
حال با دستور push می توانید تغییرات خود را اعمال کنید.

شاخه branch در گیت چیست و چطور یک branch ایجاد کنیم ؟

شاخه مکانیزمی است که برای برای توسعه ویژگی های (features) سیستم به صورت جداگانه استفاده می شود. زمانی که یک مخزن را به وجود می آورید شاخه اصلی (master) شاخه پیش فرص می باشد. برای توسعه سیستم از شاخه ها مختلف استفاده کنید و آنها را زمانی که کامل شدند با شاخه اصلی ادغام کنید.
دستور زیر شاخه ای با نام “feature_x” می سازد و به آن شاخه می رود.
git checkout -b feature_x
برای بازگشتن به شاخه اصلی
git checkout master
برای حذف کردن شاخه feature_x
git branch -d feature_x
توجه کنید که یک شاخه برای دیگران قابل دسترسی نیست مگر اینکه شما آن را به سرور راه دور push کنید.
git push origin <branch>
برنچ در گیت

به روز رسانی و ادغام (update & merge) در git

برای به روز رسانی مخزن محلی خود با جدیدترین commit ای که صورت گرفته از دستور زیر استفاه کنید.
git pull
این دستور تغییرات سرور راه دور را واکشی(fetch) و با فایل های محیط کار شما ادغام(merge) می کند.
برای ادغام شاخه ای دیگر به شاخه ای که الان مشغول کار بر روی آن هستید (مثلا شاخه اصلی) از دستور زیر استفاه کنید.
git merge <branch>
در هر دو فرمان بالا گیت سعی می کند ادغام را به صورت خودکار اعمال کند. این کار همیشه امکانپذیر نیست و گاهی اوقات ناسازگاری (conflicts) صورت می گیرد. در این حالت این وظیفه شما است که این ناسازگاری ها را به صورت دستی و با ویرایش فایل هایی که ناسازگاری دارند رفع کنید. این فایل ها توسط گیت به شما نمایش داده می شوند. بعد از تغییرات شما باید آنها را به عنوان فایل های ادغام شده علامت گذاری کنید.
git add <filename>
قبل از ادغام تغییرات برای مشاهده(preview) می توانید از دستور زیر استفاده کنید.
git diff <source_branch> <target_branch>

بر چسب گذاری (tagging) در گیت

توصیه می شود که برای انتشار نرم افزار آن را برچسب گذاری کنید. این مفهومی شناخته شده است که در SVN نیز وجود دارد. برای به وجود آوردن برچسبی با نام 1.0.0 باید دستور زیر را اجرا کنید.
git tag 1.0.0 1b2e1d63ff
در واقع عدد 1b2e1d63ff ده رقم اول id ی commit شما می باشد. برای به دست آوردن commit id می توانید از دستور log که در بخش بعدی آمده استفاده کنید.

مشاهده تاریخچه مخازن git با دستور لاگ (log)

git log
ساده ترین دستوری است که شما می توانید تاریخچه یک مخزن را داشته باشید. به این دستور ساده شما می توانید پارامتر های مختلفی را اضافه کنید تا خروجی دستور به شکلی که شما دوست دارید باشد.
برای دیدن commit های یک شخص مشخص:
git log --author=bob
برای دیدن حالت فشرده شده دستور لاگ که هر خط نشانگر یک commit باشد:
git log --pretty=oneline
برای مشاهده درخت ASCII تمامی شاخه ها در یک خط به همراه نام برچسب ها و شاخه ها:
git log --graph --oneline --decorate --all
برای دیدن نام فایل هایی که در هر commit تغییر یافته اند:
git log --name-status
برای دیدن پارامتر های بیشتر این دستور می توانید دستور زیر را اجرا کنید. git log --help

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

در صورتی که چیزی را اشتباه انجام دادید و بخواهید که تغییرات را بازگردانید از دستور زیر استفاده کنید.
git checkout -- <filename>
با این دستور شما تغییراتی که داده اید را با آخرین محتویات HEAD تغییر می دهد. نیز فایل های جدید که تازه ساخته شده اند دست نخورده باقی خواهند ماند.
اگر قصد پاک سازی تمامی تغییرات و commit های محلی خود را دارید می توانید آخرین تاریخچه را از سرور راه دور واکشی کنید و با دستور های زیر شاخه master محلی خود را به آن اشاره دهید.
git fetch origin
git reset --hard origin/master

جطور میتوان خروجی دستورات گیت را زیباتر کرد ؟

استفاده از دستور گیت به صورت گرافیکی
gitk
بکارگیری خروجی های رنگی برای گیت با دستور زیر
git config color.ui true
هر خط در لاگ برای یک commit در نظر گرفته شود.
git config format.pretty oneline
از حالت interactive فرمان add استفاده کنید.
git add -i

4.8/5 (65 رای)
10 دیدگاه‎‎ها
  1. آواتار امید امامی
    امید امامی می‎گوید

    ممنون از زحمات شما.
    گیت دنیایی وسیعی است و هنوز ریزه کاریهای بسیاری دارد

    1. آواتار مهران
      مهران می‎گوید

      با تشکر از شما ، بله در صورت نیاز به راهنمایی بیشتر و یا هرگونه سوال آن را مطرح کنید تا در حد وسع خود پاسخ را ارائه دهیم

  2. آواتار علی
    علی می‎گوید

    سلام و خسته نباشید
    تاجایی که میدونم عموما دیتابیس رو به gitignore اضافه کنن و بین کامیت هامون ثابته. اگر بخوایم فقط موقعی که برنچ جدید ایجاد میکنیم، برای هر برنچ یه دیتابیس مجزا داشته باشیم که تداخل پیش نیاد چیکار باید کرد؟

  3. آواتار Alireza Ahmadi
    Alireza Ahmadi می‎گوید

    سلام خسته نباشید،

    چگونه می‌توان بدون پاک کردن پرونده از گیت آن را محو کرد ؟

    تشکر

    1. آواتار مهران
      مهران می‎گوید

      هدف دقیق خود را قدری بیشتر توضیح بدهید

  4. آواتار داریوش
    داریوش می‎گوید

    سلام و روز بخیر
    سوال :
    ایا میتونیم از گیت لب مانند tfs خروجی بگیریم برای گزارشات؟
    برای نمودار ها چطور؟

  5. آواتار هانا
    هانا می‎گوید

    با سلام . ببخشید یه سوال داشتم پروژه ایی که رو گیت لب باشه چزور میشه تو کولب بازش کرد

  6. آواتار محسن
    محسن می‎گوید

    مشخص هست که مطلب کامل و خوبی هست و نویسنده زحمت فراوون کشیده . ولی متاسفانه
    طراحی ضعیف سایت باعث عدم نمایش درست مطالب میشه . و همینطور امکان ساخت PDF برای این آموزش وجود نداره..

  7. آواتار فاطمه موسوی
    فاطمه موسوی می‎گوید

    امکانش هست در مورد نحوه انتقال یک issue به پروژه دیگر در گیت لب توضیح بدید؟ انتقال ایشو بدون اینکه ایشو مورد نظر close بشه. استفاده از گزینه move مد نظرم نیست

  8. آواتار علی
    علی می‎گوید

    سلام
    یه سوال داشتم
    میخواستم بدونم نحوه سینک کردن Gitlab با LDAP به چه صورت هست؟
    ممنون از سایت خوبتون

دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید