با مراجعه به وبسایت رسمی Git، بسته به نوع سیستمعامل خود میتوان اقدام به دریافت فایلهای دانلود نمود اما این آموزش مبتنی بر سیستمعامل گنو/لینوکس توزیع اوبونتو است و طبیعتاً در این بخش صرفاً نحوهٔ نصب روی این پلتفرم را آموزش خواهیم داد. اساساً نصب گیت روی اوبونتو بسیار ساده است به طوری که با استفاده از کامند زیر میتوان این کار را عملی ساخت:
$ sudo apt-get install git
پس از موفقیتآمیز بودن پروسهٔ نصب، با استفاده از کامند زیر میتوان نسخهٔ نصبی را مشاهده کرد:
$ git --version
git version 2.17.1
در این مرحله از کار گیت به درستی روی سیستم نصب شده و اکنون میتوانیم یک سری تنظیمات اولیه را انجام دهیم.
راهنمای کانفیگ کردن Git
پیش از این گفتیم که یکی از کاربردهای کلیدی سیستمهای ورژن کنترل آن است که تیموُرک (کار گروهی) را امکانپذیر میسازد و در چنین فضایی حتماً نیاز است تا مشخص گردد که کدام تغییر را چه کسی انجام داده است. در همین ارتباط، یکی از تنظیماتی که میتوان انجام داد مشخص کردن نام خود است که این کار با استفاده از کامند زیر عملی میگردد:
$ git config --global user.name "Behzad"
در توضیح کامند فوق میتوان گفت که ابتدا دستور git config
را نوشته سپس از آپشن global--
استفاده کردهایم بدان معنا که تنظیمات فوق در سراسر سیستم اِعمال خواهد شد سپس داخل علائم ""
نام خود را درج نموده و اینتر میکنیم. در ادامه، همانطور که ملاحظه میشود ایمیل خود را نیز به گیت معرفی کردهایم:
$ git config --global user.email "my.email.address@gmail.com"
حال برای اطمینان حاصل کردن از درست کانفیگ شدن نام و ایمیل، دستورات زیر را اجرا میکنیم:
$ git config user.name
Behzad
$ git config user.email
my.email.address@gmail.com
میبینیم که نام و ایمیل به درستی سِت شدهاند و از این پس هر کامیتی که انجام دهیم، با این مشخصات در سیستم ثبت خواهد شد.
ساخت اولین پروژه با استفاده از Git
در این مرحله از آموزش، به منظور درک عملی کامندهای مختلف گیت، نیاز است تا پروژهای واقعی ساخته و شروع به تمرین روی آن نماییم که برای همین منظور، در سیستمعامل اوبونتو با استفاده از کامند زیر پروژهای با نامی دلخواه همچون git-tutorial
در مسیر var/www/
یا هر مسیر دلخواه دیگری میسازیم:
$ mkdir /var/www/git-tutorial
mkdir
ارتباطی با گیت نداشته بلکه کامندی به منظور ساخت یک پوشهٔ جدید در لینوکس است با این توضیح که دستور دادهایم تا در مسیر var/www/
پوشهٔ جدیدی تحت عنوان git-tutorial
ساخته شود. پس از ورودی به این پوشه با استفاده از دستور cd
، با استفاده از کامند زیر سیستم کنترل نسخهٔ گیت را فعال میسازیم:
var/www/git-tutorial$ git init
کامند init
برگرفته از کلمهٔ Initialize به معنی «شروع کردن» است. پس از اجرای موفقیتآمیز این کامند، پوشهای تحت عنوان git.
ساخته میشود اما اگر نگاهی به محتویات پروژهٔ git-tutorial
بیندازیم، مسلماً چیزی مشاهده نخواهد شد چرا که در سیستمعامل گنو/لینوکس فایلهایی که با علامت .
نامگذاری شدهاند نمایش داده نمیشوند و مخفی هستند که برای نمایش آنها میتوان از کلیدهای ترکیبی Ctrl + H استفاده نمود که در این صورت خواهیم داشت:
git-tutorial
└── .git
آنچه حائز اهمیت است این که این فولدر مخفی میباید در مسیر روت پروژه باشد تا بتواند کلیهٔ تغییرات را رصد نماید. تا این مرحله از کار توانستهایم با موفقیت اولین ریپو (مخزن) لوکال خود را ایجاد نماییم که با استفاده از کامند زیر میتوان از وضعیت این ریپو مطلع شد:
/var/www/git-tutorial$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
همانطور که مشخص است، خط اول حاکی از آن میباشد که روی شاخهٔ مَستر قرار داریم که شاخهٔ پیشفرض و اصلی هر ریپازیتوری میباشد و در عین حال هیچ گونه کامیتی نیز تاکنون صورت نگرفته است. فرض کنیم که قرار است در این پروژه یک صفحهٔ سادهٔ اچتیامال طراحی کنیم. برای این منظور، با استفاده از کامند زیر فایلی تحت عنوان index.html
میسازیم:
/var/www/git-tutorial$ touch index.html
در لینوکس، touch
به منظور ساخت یک فایل جدید مورد استفاده قرار میگیرد به طوری که اگر مجدد نگاهی به محتویات این پروژه بیندازیم، خواهیم داشت:
git-tutorial
├── .git
└── index.html
اکنون با استفاده از ادیتور دلخواه خود، یک صفحهٔ سادهٔ اچتیامال داخل فایل index.html
به صورت زیر میسازیم:
<!DOCTYPE html>
<html>
<head>
<title>Sokan Academy Git Tutorial</title>
</head>
<body>
<h1>This is a Git tutorial</h1>
<p>In this course, we`re learn the basics the Git</p>
</body>
</html>
حال مجدد دستور git status
را اجرا میکنیم به طوری که در خروجی خواهیم داشت:
/var/www/git-tutorial$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.html
nothing added to commit but untracked files present (use "git add" to track)
نسبت به دفعهٔ اولی که این کامند را اجرا کردیم، بخش جدیدی تحت عنوان Utracked files اضافه شده و دقیقاً نام فایل جدیدی که ساختیم در این بخش آمده است. پیش از این با مفهوم اِستیج آشنا شدیم با این توضیح که پروسهٔ نسخهبندی در این فاز آغاز شده و فایلها آمادهٔ ثبت در تاریخچهٔ پروژه میشوند که برای این منظور میباید دستور زیر را اجرا نماییم:
/var/www/git-tutorial$ git add index.html
همانطور که ملاحظه میشود، کلیهٔ کامندهای گیت با دستور git
آغاز میشوند و برای مرحلهٔ اِستیج از دستور add
استفاده کرده و فایلی که قصد داریم در هیستوری ذخیره گردد را نوشتهایم و چنانچه اکنون مجدد وضعیت گیت را چک کنیم، به عنوان خروجی خواهیم داشت:
/var/www/git-tutorial$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: index.html
میبینیم که بخشی تحت عنوان Changes to be commited در معرض دیدمان قرار میگیرد بدان معنا که با استفاده از دستور add
تغییرات آمادهٔ ذخیرهسازی شدهاند اما این کار هنوز صورت نگرفته است که برای این منظور، با استفاده از دستور commit
این کار را به صورت زیر عملی خواهیم ساخت:
/var/www/git-tutorial$ git commit -m "My First Commit"
[master (root-commit) bced368] My First Commit
1 file changed, 13 insertions(+)
create mode 100644 index.html
دستور commit
یک آپشن اختیاری میگیرد تحت عنوان m-
که برگرفته از واژهٔ Message به معنی «پیام» است و همانطور که ملاحظه میشود، داخل علائم ""
پیامی دلخواه نوشته و دکمهٔ اینتر را میزنیم و در خروجی این دستور زیر میبینیم که آمده یک فایل تغییر یافته و از آنجا که داخل این فایل سیزده خط کد نوشتهایم، تعداد خطوط کد هم درج شده است. اکنون اگر مجدد وضعیت را چک کنیم خواهیم داشت:
/var/www/git-tutorial$ git status
On branch master
nothing to commit, working tree clean
میبینیم که گفته شده هیچ تغییر باقی نمانده که کامیت نشده باشد و این بدان معنا است که ما توانستهایم با موفقیت اولین ورژن از پروژهٔ خود را در سیستم کنترل نسخهٔ گیت ذخیره سازیم.
در متنی که داخل تگهای <p></p>
نوشتیم، یک اِشکال گرامری وجود دارد به طوری که کلمهٔ learn میباید به learning تغییر یابد که برای همین منظور، محتویات این فایل را به صورت زیر تغییر خواهیم داد:
<!DOCTYPE html>
<html>
<head>
<title>Sokan Academy Git Tutorial</title>
</head>
<body>
<h1>This is a Git tutorial</h1>
<p>In this course, we`re learning the basics the Git</p>
</body>
</html>
حال اگر وضعیت گیت را چک کنیم خواهیم دید:
/var/www/git-tutorial$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
میبینیم که در بخشی تحت عنوان Changes not staged for commit آمده که یک سری تغییرات صورت گرفته که هنوز کامیت نشدهاند که برای این منظور، دستور زیر را اجرا میکنیم:
/var/www/git-tutorial$ git commit
On branch master
Changes not staged for commit:
modified: index.html
no changes added to commit
در واقع از آنجا که پروسهٔ اِستیجینگ سهواً از قلم افتاده است، میبینیم که عنوان Changes not staged for commit حاکی از آن است که تغییرات آمادهٔ کامیت شدن نیستند و برای رفع این مشکل، ابتدا کامند add
را به صورت زیر اجرا میکنیم:
/var/www/git-tutorial$ git add index.html
حال مجدد دستور git commit
را اجرا کرده با این تفاوت که برخلاف گذشته، جهت تست آپشن یا سوئیچ m-
را حذف کردهایم:
GNU nano 2.9.3 /var/www/git-tutorial/.git/COMMIT_EDITMSG
I fixed the typo
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
# modified: index.html
#
میبینیم که درج یک پیام برای تکتک کامیتها در گیت الزامی است و چنانچه فراموش کنیم این کار را انجام دهیم، این ابزار به صورت خودکار ادیتور پیشفرض سیستمعامل که در مثال فوق nano است را باز کرده و ما هم پیامی همچون I fixed the typo را وارد نموده و در نهایت با فشردن دکمههای ترکیبی Ctrl + X سپس دکمهٔ Y تغییرات را ذخیره نموده و پروسهٔ کامیت را تکمیل میکنیم و در صورتی که دستور git status
را مجدد اجرا نماییم، میبینیم که هیچ گونه کامیت انجامنشدهای نداریم و تغییرات جدید نیز ذخیره شدهاند. حال فرض کنیم بنا به هر دلیلی، این فایل به صورت زیر تغییر مییابد:
<!DOCTYPE html>
<html>
<head
fsdfsf
fsdfsf
fs
s
dfs
f
sdf s
df
sdf
s
fd"
در چنین شرایطی به سادگی میتوانیم به یکی از قابلیتهای کلیدی گیت که چیزی نیست جز بکآپگیری رجوع کرده و مجدد این فایل را اصلاح نماییم:
/var/www/git-tutorial$ git checkout -- .
اگر مجدد محتویات فایل index.html
را ملاحظه کنیم، خواهیم داشت:
<!DOCTYPE html>
<html>
<head>
<title>Sokan Academy Git Tutorial</title>
</head>
<body>
<h1>This is a Git tutorial</h1>
<p>In this course, we`re learning the basics the Git</p>
</body>
</html>
میبینیم آخرین کامیتی که انجام داده بودیم را بازگردانده و فایل کامل را در دسترس داریم. همچنین برای این که به لیستی کامیتهایی که تاکنون انجام دادهایم دست یابیم، میتوانیم از دستور log
به صورت زیر استفاده کنیم:
/var/www/git-tutorial$ git log
commit 624fe7dec223591fde44c9c0578783101f4126ca (HEAD -> master)
Author: Behzad <my.email.address@gmail.com>
Date: Sat Jun 15 12:47:27 2019 +0430
I fixed the typo
commit bced3684678bf893ef111f92837ef198d7fb59b5
Author: Behzad <my.email.address@gmail.com>
Date: Sat Jun 15 12:35:59 2019 +0430
My First Commit
میبینیم لیستی از دو کامیتی که تاکنون انجام دادهایم در معرض دیدمان قرار گرفته و هر کامیت نیز از یک کد هَش به منظور شناسایی برخوردار است (چنانچه تعداد کامیتها زیاد بوده و بخواهیم گزارشی خلاصه دریافت کنیم، میتوانیم از دستور git log --oneline
استفاده نماییم.) به طور مثال، اگر بخواهیم به وضعیتی که واژهٔ learning را سهواً به صورت learn نوشته بودیم بازگردیم، میتوانیم کامند زیر را اجرا کنیم:
/var/www/git-tutorial$ git checkout bced3684678bf893ef111f92837ef198d7fb59b5
Previous HEAD position was 624fe7d I fixed the typo
HEAD is now at bced368 My First Commit
و از این پس محتویات فایل مذکور به صورت زیر خواهد بود:
<!DOCTYPE html>
<html>
<head>
<title>Sokan Academy Git Tutorial</title>
</head>
<body>
<h1>This is a Git tutorial</h1>
<p>In this course, we`re learn the basics the Git</p>
</body>
</html>
در واقع، در تفسیر کامند فوق میتوان گفت که با نوشتن کامند git checkout
و درج کد هَش مرتبط با کامیتی که مد نظر داریم، به همان نسخهای که در هیستوری پیش از این ثبت شده است باز خواهیم گشت.
جمعبندی
اساساً شروع کار با گیت چندان دشوار نیست چرا که با فراگیری کامندهای add
و commit
میتوان پایهایترین کار در گیت که چیزی نیست جز وارد کردن تغییرات در اصطلاحاً Staging Area سپس ثبت تغییرات در پوشهٔ git. را عملی ساخت.