
فرض کنید که در حال کدنویسی یک برنامه، طراحی وب و یا ویرایش فایلهای متنی مختلف هستید. در این حالت، فایل و یا فایلهایی را ایجاد کرده و به طور پیوسته محتوای آنها را افزوده و یا تغییر میدهید. با زیاد شدن حجم فایلها و دایرکتوریها، دنبال کردن روند تغییرات، پیچیده خواهد شد. مثلا اگر در حین کدنویسی، باگ پیشبینی نشدهای، روند توسعهی نرمافزار را مختل سازد، بازگشت به مرحلهی با ثبات پیش از تغییرات، میتواند باعث سردرگمی گردد. کنترل ورژن یا VCS (Vesion Control System) و یا revision control روشی نظاممند، در مدیریت ثبت و تغییر فایلها میباشد. در کنترل ورژن، میتوانیم تاریخچهی تغییرات را، در هر مرحله دنبال نماییم. تغییرات معمولا با یک شمارهی ورژن، ثبت میشوند. قابلیتهای کنترل ورژن، در فایلهایی که با مشارکت گروهی افراد، ویرایش میشوند، اهمیت ویژهای پیدا مینماید. از نرمافزارهای کنترل ورژن، میتوان به: cvs, svn و git اشاره نمود. در حال حاضر، git، رایجترین کنترل ورژن میباشد و آشنایی با این نرمافزار، ابزارهای بسیاری را برای مدیریت تغییرات فایلها، برای توسعهدهندگان نرمافزار فراهم میسازد.
git، یک کنترل ورژن توزیع شده میباشد، بنابراین، مخزن فایلهای git را، علاوه بر ذخیرهسازی محلی و بصورت آفلاین، بر روی سرور شبکه، جهت مشارکت گروهی نیز، میتوان استفاده نمود. Github، سایتی پرطرفدار، برای بارگذاری پروژههای ایجاد شده توسط نرمافزار git، بر بستر اینترنت میباشد. طبق گزارش گیتهاب، در ژانویهی 2020، بیش از 40 میلیون کاربر، دارای افزون بر 190 میلیون repository، یا مخزن، بر روی Github میباشند. در ادامه برای آشنایی با git و github با ما همراه باشید.
تاریخچهی git
در ابتدا جهت آشنایی با Git، اشارهای به نحوهی پیدایش این نرمافزار داریم. Git یک پروژهی open source میباشد که توسط لینوس توروالدز، خالق کرنل لینوکس، ابداع گردیده است. فلسفه طراحی گیت، از آنجا پیدا شد که تعداد زیادی برنامهنویس از سرتاسر جهان در پروژهی توسعهی هسته (کرنل) سیستم عامل لینوکس مشارکت داشتند. ضرورت مدیریت تغییرات در کدها و فایلها، منجر به ظهور کنترل ورژن Git در سال 2005 گردید.
آشنایی خط فرمان در git
نرمافزار git، دارای دو محیط متنی و گرافیکی میباشد. برای کار حرفهای در محیط گیت، لازم است که با محیط دستورات متنی یا خط فرمان، در لینوکس آشنایی داشته باشید. نرمافزار گیت، علاوه بر محیط لینوکس، در محیط ویندوز و osx نیز، قابلیت کار در محیط متنی را برای کاربران فراهم ساخته است. برای کسب اطلاعات بیشتر، در زمینهی خط فرمان در لینوکس به پست آشنایی با خط فرمان در لینوکس در سایت آپگریدیت مراجعه فرمایید.
نصب git
Git در سیستم عاملهای ویندوز، مک و لینوکس قابل نصب میباشد. برای نصب گیت میتوانید به وب سایت رسمی گیت رفته و با توجه به سیستم عامل مورد نظر، نسبت به نصب git، اقدام نمایید.
نصب بر روی لینوکس
جهت نصب گیت بر روی سیستم عامل لینوکس بسته به توزیع لینوکسی که استفاده میکنیم میتوانیم گیت را از روی مخزن(repository) آن توزیع نصب نماییم. مثلا برای نصب گیت بر روی توزیع دبیان و توزیعهای مبتنی بر دبیان به روش زیر عمل مینماییم:
|
1 2 3 |
kazemian@upgradeit:~$ sudo apt-get install git |
برای توزیع فدورا و توزیعهای مبتنی بر ردهت داریم:
|
1 2 3 |
kazemian@upgradeit:~$ yum install git |
نصب بر روی macOS
با استفاده از پکیج منیجر homebrew میتوانیم نرمافزار git را بر روی osx نصب نماییم.
|
1 2 3 |
$ brew install git |
نصب بر روی ویندوز
برای نصب بر روی ویندوز، با مراجعه به سایت رسمی git و دانلود نرمافزار نصب بر روی ویندوز میتوانید نسبت به نصب git اقدام نمایید. بر روی سایت، فایلهای نصب git، برای ویندوز 32 بیتی و 64 بیتی، موجود میباشد.
تنظیمات git
در ابتدا برای تنظیمات اولیه باید نام خود و آدرس ایمیلتان را در گیت ثبت نمایید. با این کار تغییراتی که در فایلهای پروژه انجام میدهید به نام شما ثبت خواهد گردید.
|
1 2 3 4 |
kazemian@upgradeit:~$ git config --global user.name kazemian kazemian@upgradeit:~$ git config --global user.email kazemian@upgradeit.ir |
برای مشاهدهی تنظیمات انجام شده در گیت از دستور زیر استفاده نمایید:
|
1 2 3 4 5 6 |
kazemian@upgradeit:~$ git config --list user.name=kazemian user.email=kazemian@upgradeit.ir kazemian@upgradeit:~$ |
مخزن یا Repository
به پروژههایی که از گیت به عنوان کنترل ورژن استفاده میکنند، مخزن یا repository میگویند. تمام فایلهای پروژه، تغییرات کد و تنظیمات گیت، در مخزن نگهداری میشوند. در سیستمهای توزیع شده، هر یک از اعضای پروژه، که مجوز دسترسی به مخزن اصلی را دارا میباشد، میتواند یک نسخه از مخزن را، به صورت محلی ذخیره نماید. اعضای گروه میتوانند تغییرات لازم را در کدهای پروژه اعمال کرده و به مخزن اصلی اضافه نمایند.
شروع یک پروژه
برای شروع، در ابتدا یک فولدر در مسیر مورد نظر ایجاد مینماییم. سپس مسیر دایرکتوری جاری را به مسیر دایرکتوری فولدر پروژهی مورد نظر، تغییر داده و دستور git init را اجرا مینماییم، یا این که مسیر فولدر پروژه را، جلوی دستور قید نموده و <مسیر فولدر پروژه> git init اجرا نمایید. با اجرای این دستور، گیت، یک فولدر به نام git. ایجاد نموده و آمادهی ثبت تغییرات و تاریخچهی تغییرات فایلهای مورد نظر میگردد. حالا دیگر، پروژهی مورد نظر شما، تبدیل به یک مخزن گیت محلی گردیده است. پوشهی git. یک پوشهی مخفی در دایرکتوری مورد نظر است که توسط git ساخته میشود. لازم به ذکر است، در صورتیکه چندین فولدر جداگانه برای پروژههای مختلف داشته باشیم، در هر فولدر پروژه، لازم است دستور git init به طور جداگانه اجرا شده و یک فولدر git. جداگانه ایجاد میشود. در زیر اجرای مراحل ذکر شده را مشاهده مینمایید:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
kazemian@upgradeit:~$ mkdir MyProject kazemian@upgradeit:~$ cd MyProject kazemian@upgradeit:~/MyProject$ ls -al total 8 drwxrwxr-x 2 kazemian kazemian 4096 Jun 13 14:54 . drwxr-xr-x 24 kazemian kazemian 4096 Jun 13 14:54 .. kazemian@upgradeit:~/MyProject$ git init Initialized empty Git repository in /home/kazemian/MyProject/.git/ kazemian@upgradeit:~/MyProject$ ls -al total 12 drwxrwxr-x 3 kazemian kazemian 4096 Jun 13 14:55 . drwxr-xr-x 24 kazemian kazemian 4096 Jun 13 14:54 .. drwxrwxr-x 7 kazemian kazemian 4096 Jun 13 14:55 .git kazemian@upgradeit:~/MyProject$ |
ایجاد فایل و اضافه کردن آن به repository
در این مرحله به عنوان مثال سه فایل به نامهای file3. file2, file1 را با فرمان touch اجرا مینماییم. دستور touch، فایلهای خالی و با ظرفیت صفر ایجاد میکند. برای اینکه git تغییرات هر فایلی را دنبال نماید، باید آن را، در محیط staging قرار دهیم. بنابراین، با دستور git add فایلهای مورد نظر را، در محیط staging قرار میدهیم. سپس وقتی که تغییرات فایلها، به نقطهی مطلوب مورد نظر ما رسیدند، میتوانیم با commit کردن سوابق تغییرات با عنوان یک ورژن یا نسخهی جدید، در repository ذخیره نماییم. توجه داشته باشید که آپشن A- تما فایلهای موجود در دایرکتوری جاری را در مرحلهی stage قرار میدهد. با اجرای دستور git status میتوانیم از وضعیت فایلهای موجود در stage ، گزارشی داشته باشیم.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
kazemian@upgradeit:~/MyProject$ touch file1 file2 file3 kazemian@upgradeit:~/MyProject$ ls -l total 0 -rw-rw-r-- 1 kazemian kazemian 0 Jun 13 15:11 file1 -rw-rw-r-- 1 kazemian kazemian 0 Jun 13 15:11 file2 -rw-rw-r-- 1 kazemian kazemian 0 Jun 13 15:11 file3 kazemian@upgradeit:~/MyProject$ git add file1 kazemian@upgradeit:~/MyProject$ git add -A kazemian@upgradeit:~/MyProject$ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: file1 new file: file2 new file: file3 kazemian@upgradeit:~/MyProject$ |
پس از اضافه کردن فایلها به محیط stage، هر تغییری که در فایلها اعمال شود، این تغییرات، توسط git، دنبال خواهد شد. مثلا ما در فایل file1 یک خط اضافه کردیم. حال با اجرای دستور git status میتوانید فایلهای تغییر یافته را مشاهد نمایید.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
kazemian@upgradeit:~/MyProject$ vi file1 kazemian@upgradeit:~/MyProject$ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: file1 new file: file2 new file: file3 Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: file1 kazemian@upgradeit:~/MyProject$ |
آشنایی با ثبت تغییرات در git
وقتی که تغییرات لازم در فایل(ها) انجام پذیرفت، با اجرای commit، تغییرات، ذخیره شده و به عنوان یک وضعیت یا ورژن جدید،در تاریخچهی پروژهی ما ثبت میگردد. در ضمن در هنگام ثبت تغییرات با آپشن m- متنی حاوی اطلاعاتی در بارهی تغییرات مینویسیم. نکتهی بسیار مهم این است که مرحلهی commit کردن یا ثبت تغییرات در پروژه، در جاهای مناسبی صورت پذیرد. همچنین برای هر مرحله از commit، توضیحات مناسب و کافی باعث دنبال کردن آسان روند تغییرات، توسط کاربران دیگر میباشد. توضیحات میتواند مثلا شامل این عبارت باشد که، در این مرحله امکانات جدید به برنامه اضافه شده و یا یک باگ در برنامه رفع شده است. در ادامه، به عنوان نمونه این مرحله نمایش داده شده است:
|
1 2 3 4 5 6 7 |
kazemian@upgradeit:~/MyProject$ git commit file1 -m "Your Message" [master (root-commit) 0b32c1f] Your Message 1 file changed, 1 insertion(+) create mode 100644 file1 kazemian@upgradeit:~/MyProject$ |
نمایش تغییرات
برای مشاهدهی تغییرات صورت گرفته پس از ثبت آخرین تغییرات یا تغییرات کامیت نشده، میتوان از دستور git diff استفاده نمود:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
kazemian@upgradeit:~/MyProject$ echo This is a test line. >> file1 kazemian@upgradeit:~/MyProject$ git diff diff --git a/file1 b/file1 index 76cc3bf..4663621 100644 --- a/file1 +++ b/file1 @@ -1 +1,2 @@ This is a Test. +This is a test line. kazemian@upgradeit:~/MyProject$ |
گزارش از وضعیت commitها با log
برای اطلاع از مستندات و تاریخچهی تغییرات انجام شده از دستور git log استفاده میکنیم:
|
1 2 3 4 5 6 7 8 9 |
kazemian@upgradeit:~/MyProject$ git log commit 0b32c1f2e8d2bf728da0c88f38ed73f9faca3307 (HEAD -> branch1, master) Author: kazemian <kazemian@upgradeit.ir> Date: Sun Jun 13 15:28:28 2021 +0430 Your Message kazemian@upgradeit:~/MyProject$ |
ایجاد شاخه یا branch
گاهی میخواهید علاوه بر مسیر اصلی پروژه، همزمان پروژه را با ایدهها و تغییرات متفاوت ادامه دهید واین تغییرات، ممکن است روند عادی پروژه را مختل نماید. در این حالت از امکان branch یا شاخه در گیت استفاده مینماییم. با دستور git branch میتوانیم یک شاخهی جدید برای پروژه ایجاد نماییم. در این حالت یک کپی جداگانه از تمام فایلهای شاخهی اصلی، در اختیار داریم. در برنچ، تمام تغییرات بصورت جداگانه ذخیره خواهد شد. پس از آنکه این تغییرات در شاخهی ایجاد شده به نقطهی مطلوب رسید، میتوان با عمل merge کردن این تغییرات را با شاخهی اصلی پیوند داد. برای سویچ کردن به شاخهی مورد نظر از git checkout استفاده میگردد.
|
1 2 3 4 5 6 7 8 |
kazemian@upgradeit:~/MyProject$ git branch branch1 kazemian@upgradeit:~/MyProject$ git checkout branch1 A file2 A file3 Switched to branch 'branch1' kazemian@upgradeit:~/MyProject$ |
merge
در صورتی که بخواهیم شاخهی ایجاد شده را با شاخهی اصلی یکی نماییم، از دستور merge استفاده میگردد:
|
1 2 3 4 5 |
kazemian@upgradeit:~/MyProject$ git merge branch1 Already up to date. kazemian@upgradeit:~/MyProject$ |
ریموت در git
در پروژههایی که، با مشارکت گروهی افراد انجام میشود، معمولا مخزن git را بر روی سرور یک شبکه قرار میدهند. با این روش، تغییراتی که در مخزن اعمال میشود، در دسترس همهی افراد پروژه قرار دارد. این سرور میتواند توسط خودتان راهاندازی شده باشد. همچنین میتوان از سرورهایی بر روی اینترنت از قبیل: sourceforge ,gitlab ,bitbucket و github به همین منظور استفاده نمود.
Github
تا این قسمت آشنایی با git، مخزن ساخته شده از نوع محلی(Local) است. در صورتی که بخواهیم از مخزنی بر روی شبکه استفاده نماییم، از remote برای ارتباط با سروری که مخزن پروژه بر روی آن قرار دارد، استفاده میکنیم. برای مشاهدهی مخزنهای ریموت از دستور git remote استفاده میشود:
|
1 2 3 4 |
kazemian@upgradeit:~/MyProject$ git remote kazemian@upgradeit:~/MyProject$ |
همانطور که مشاهده میشود، هنوز مخزن ریموتی برای این پروژه ثبت نگردیده است. برای اضافه کردن یک مخزن ریموت به گیت، از دستور git remote add استفاده مینماییم. در جلوی دستور، نام ریموت و آدرس url مخزن را، میآوریم. مثلا برای اضافه کردن مخزنی در github، به روش زیر عمل نمایید. لازم به ذکر است که، در ابتدا، باید مخزن مورد نظر را در github، از طریق اکانتی که در سایت گیتهاب در اختیار دارید، ایجاد کرده باشید.
|
1 2 3 |
kazemian@upgradeit:~/MyProject$ git remote add origin https://github.com/kazemian/test.git |
push
برای ارسال تغییرات commit شده، در مخزن local به مخزن ریموت از git push استفاده میشود:
|
1 2 3 |
kazemian@upgradeit:~/MyProject$ git push origin master |
pull
برای دریافت تغییرات اعمال شده در مخزن ریموت، و بروزرسانی مخزن محلی، از git pull استفاده میشود:
|
1 2 3 |
kazemian@upgradeit:~/MyProject$ git pull origin master |
بازگردانی تغییرات
در صورتی که بخواهیم یک فایل را به آخرین وضعیت commit شده برگردانیم و تغییرات اعمال شده را نادیده بگیریم از دستور زیر استفاده میکنیم:
|
1 2 3 |
kazemian@upgradeit:~/MyProject$ git reset HEAD file1 |
