آموزش گیت – قسمت دوم

نویسنده : سید ایوب کوکبی ۱۵ اردیبهشت ۱۳۹۸

قسمت اول آموزش گیت

مقدمات

آموزش گیت - قسمت دوم

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

مثلاً اگر اشتباهی در پروژه رخ کرد به راحتی می‌توانید با یک دستور ساده به نسخه‌ای که چند دقیقه قبل ذخیره کرده‌اید یا هر نسخۀ دیگری برگردید. در واقع گیت به دیتابیسش مراجعه می‌کند و تفاوت فایل‌های پروژه در آن زمان با فایل‌های فعلی را بررسی کرده و نهایتاً فایل‌های فعلی موجود در فولدر پروژه (یا Working directory) را به نسخۀ قبلی برمی‌گرداند. این کار خیلی سریع و در کمتر از چند ثانیه اتفاق می‌افتد. روش فوق را مقایسه کنید با زمانی که باید دنبال بکاپ می‌گشتید و بعد ازکلی وقت برای اکسترکت فایل بکاپ به نسخۀ قبلی بازمی‌گشتید. آن هم در صورتی که نسخۀ درستی از بکاپ را اکسترکت کرده باشید.

در این قسمت با ساخت مخزن، استیج کردن، کامیت کردن، تنطیمات پیکربندی و گرفتن وضعیت مخزن آشنا می‌شوید. پروژه‌ای که در این بخش و بخش‌های آتی با استفاده از آن دستورات گیت را توضیح می‌دهیم صرفاً یک صفحۀ سادۀ HTML است. آشنایی مقدماتی با HTML و CSS شما را در درک بهتر توضیحات یاری می‌کند ولی ضروری نیست.

ساخت یک وب‌سایت ساده

قبل از اجرای دستورات گیت، ابتدا باید یک پروژه داشته باشیم. فولدر جدیدی به نام my-git-repo بسازید. سپس یک فایل index.html با محتوای زیر به فولدر اضافه کنید:

<!DOCTYPE html>
<html lang="en">
<head>
  <title>A Colorful Website</title>
  <meta charset="utf-8" />
</head>
<body>
  <h1 style="color: #07F">A Colorful Website</h1>
  <p>This is a website about color!</p>    
  
  <h2 style="color: #C00">News</h2>
  <ul>
    <li>Nothing going on (yet)</li>
  </ul>
</body>
</html>

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

ساخت مخزن

اکنون همه چیز برای ساخت مخزن گیت (git repository یا به اختصار repo) آماده است. برنامۀ cmd (یا git bash برای کاربران ویندوز) را باز کنید و با دستور cd مسیر فولدر my-git-repo را بدهید:

cd /path/to/my-git-repo

به جای /path/to/my-git-repo مسیر فولدری که در مرحلۀ قبل ایجاد کردید را وارد کنید. مثلاً اگر فولدر را در دسکتاپ ایجاد کرده باشید باید چنین مسیری وارد نمایید:

cd ~/Desktop/my-git-repo

حالا cmd در فولدر پروژه قرار دارد و هر دستوری وارد کنید روی این فولدر اجرا می‌شود. دستور پایین را وارد کنید تا مخزن پروژه ساخته شود:

git init

git init در واقع به گیت می‌گوید خود را برای ردیابی تغیرات این فولدر آماده کن. این کار باعث ساخته شدن یک فولدر مخفی به نام git. در دایرکتوری my-git-repo خواهد شد. تمام داده‌ها و تغییرات ردیابی شده در داخل این فولدر ذخیره می‌شوند. در واقع قلب تپندۀ گیت همین فولدر است، به همین خاطر هم مخفی شده تا به صورت اتفاقی حذف نشود. تنها تفاوت یک پروژۀ معمولی با پروژه‌ای که زیر نظر گیت قرار دارد همین فولدر است. با حذف آن دوباره به مجموعه‌ای از فایل‌های معمولی خواهید رسید. فایل‌هایی که تغییرات آن ردیابی نشده و نسخه‌های مختلف آن ذخیره نمی‌شود.

نمایش وضعیت مخزن

قبل از نسخه‌برداری از پروژه بهتر است وضعیت مخزن جدید را بررسی کنیم. این دستور را در خط فرمان وارد کنید:

git status

این خروجی را دریافت می‌کنید:

# On branch master
#
# Initial commit
#
# 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)

فعللاً با قسمت On branch master کاری نداریم. پیام دریافتی می‌گوید که روی کامیت اولیه هستیم و هنوز چیزی برای کامیت کردن وجود ندارد ولی یک سری از فایل‌ها ردیابی نشده‌اند (untracked files). یک فایل untrack شده، فایلی است که در فولدر پروژه وجود دارد ولی هنوز تحت نظر گیت نیست و باید خودمان دستور ردیابی‌شان را به گیت بدهیم. شاید پیش خودتان بگویید چرا گیت فایل‌های جدید را به صورت خودکار ردیابی نمی‌کند.

بخوانید  آموزش گیت - قسمت سوم

دلیلش این است که نسخه‌برداری تعدادی از فایل‌های پروژه ممکن است ضروری نباشد. مثلاً خروجی کامپایل شدۀ پروژه که به صورت باینری است (در ویندوز فایل‌هایی با پسوند exe)؛ یا فایل‌های آزمایشی و موقت؛ یا فایل‌هایی که اطلاعات حساس داخلش هست و فقط مربوط به ما می‌شود. در واقع بسیاری از فایل‌ها وجود دارند که نسخه‌برداری و زیر نظر گرفتن تغییراتشان غیر ضروری است. برای حفظ تمییزی پروژه فقط باید سورس پروژه را نگه‌داری کنیم و به همین دلیل گیت زیرنظر گرفتن فایل‌ها و تغییرات را بر عهدۀ ما گذاشته است.

استیج کردن اسنپ‌شات

برای اینکه به گیت بگوییم فلان فایل را زیرنظر بگیر باید از دستور add استفاده کنیم. یعنی باید فایل index.html را اضافه کنیم:

git add index.html
git status

اگر بعد از add کردن، status بگیریم خروجی زیر را خواهیم دید:

# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   index.html

کاری که دستور add انجام می‌دهد، اضافه کردن index.html به snapshot برای کامیتی است که در آینده می‌گیریم. اسنپ‌شات‌ها در واقع وضعیت پروژه در زمان‌های مختلف هستند. در مثال ما، اسنپ‌شات فقط حاوی یک فایل index.html است. اگر از گیت بخواهیم به اسنپ‌شات برگردد، فایل‌هایی پروژه را با این تک فایل جایگزین می‌کند. ساخت اسنپ‌شات در فرهنگ گیت اصطلاحاً staging گفته می‌شود چرا که می‌توانیم قبل از کامیت گرفتن، یک یا چند فایل را به stage اضافه یا از آن حذف کنیم.

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

کامیت کردن اسنپ‌شات

تا الان اسنپ‌شات را استیج کرده‌ایم ولی برای ثبت شدن عکس باید دکمۀ شاتر را بزنیم. دکمۀ شاتر در فرهنگ گیت commit گفته می‌شود. این کار اسنپ‌شات را به تاریخچه اضافه می‌کند تا هر زمانی بتوانید به آن برگردید:

git commit

با اجرای دستور بالا، ادیتوری باز می‌شود و از شما پیغامی برای کامیت می‌پرسد. پیام Create index page را وارد کنید و چون در ادیتور vim هستید برای ذخیره کردن، ابتدا دکمۀ esc را بزنید، سپس دوبار کلیدهای Shift+Z را بزنید. بعد از این کار به خط فرمان برمی‌گردید و پیغام file changed را مشاهده می‌کنید که یعنی کامیت با موفقیت ثبت شده است

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

  1. staging: به گیت می‌گوید این فایل‌ها را در کامیت بعدی لحاظ کن؛
  2. committing: اسنپ‌شات استیج شده را با پیغامی ذخیره می‌کند.

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

عملکرد کلی گیت

دیدن تاریخچۀ مخزن

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

git log

با اجرای دستور log، گیت تمام کامیت‌هایی را که گرفته‌ایم به همراه پیام هر یک نمایش می‌دهد و اینجا چون ما فقط یک کامیت داریم همین یکی را نشان می‌دهد:

commit b650e4bd831aba05fa62d6f6d064e7ca02b5ee1b
Author: unknown <user@computer.(none)>
Date:   Wed Jan 11 00:45:10 2012 -0600

    Create index page

در خروجی این دستور روبروی commit یک رشتۀ تصادفی و طولانی (…b650e4b) آمده است. این کد درواقع checksumای از نوع SHA-1 از محتویات کامیت است که اطمینان می‌دهد گیت از کوچکترین خرابی کامیت مطلع خواهد بود. البته تمامی چک‌سام‌های شما فرق می‌کند چون تاریخ و مالک آن فرق می‌کند. در قسمت بعدی خواهیم دید که چک‌سام چگونه به عنوان یک ID منحصر به فرد عمل می‌کند.

بخوانید  آموزش گیت - قسمت اول

در خط بعدی نام شخصی که کامیت را ثبت کرده آمده است که چون هنوز به گیت اسم‌مان را نگفته‌ایم واژۀ unknown به همراه یک نام کاربری ساختگی نمایش داده می‌شود. در خط بعدی تاریخ، زمان و منطقۀ زمانی جایی که از آنجا کامیت صورت گرفته، نمایش داده می‌شود. سرانجام پیغام کامیت را در آخرین خط مشاهده می‌کنیم.

پیکربندی گیت

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

git config --global user.name "Your Name"
git config --global user.email your.email@example.com

به جای Your Name و ایمیل، نام و ایمیل واقعی خود را وارد کنید. سوئیچ global– به گیت دستور می‌دهد تنظیمات فوق را برای تمام مخزن‌ها استفاده کند؛ چه مخزن پروژۀ فعلی و چه مخزنی که برای سایر پروژه‌ها خواهیم ساخت. در صورتی که بخواهید تنظیمات فقط برای مخزن فعلی باشد این سوئیچ را حذف کنید.

ساخت یک فایل جدید

بیایید کمی وب‌سایت تازه تاسیس خود را توسعه دهیم. فایل دیگری به نام orange.html با محتویات زیر ایجاد کنید:

<!DOCTYPE html>
<html lang="en">
<head>
  <title>The Orange Page</title>
  <meta charset="utf-8" />
</head>
<body>
  <h1 style="color: #F90">The Orange Page</h1>
  <p>Orange is so great it has a
  <span style="color: #F90">fruit</span> named after it.</p>
</body>
</html>

سپس فایلی دیگری تحت عنوان blue.html اضافه نمایید:

استیج کردن فایل‌های جدید

همانند قبل فایل‌های جدید را استیج کنید:

git add orange.html blue.html
git status

دقت کنید در دستور add بیشتر از یک فایل را هم می‌توانیم اضافه کنیم. بعد از add کردن، دستور status خروجی زیر را به ما نشان میدهد:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   blue.html
#       new file:   orange.html

با وارد کردن دستور git log فقط کامیت اولی که گرفته بودیم نمایش داده می‌شود؛ یعنی هنوز فایل‌های blue.html و orange.html به تاریخچۀ مخزن اضافه نشده‌اند. دقت کنید که تغییرات ناحیۀ stage را فقط می‌توانیم با git status ببینیم. git log فقط بعد از کامیت کردن تغییرات کاربرد دارد.

تفاوت خروجی دستور status با log

کامیت کردن فایل‌های جدید

با دستور git commit، اسنپ‌شات استیج شده را کامیت می‌کنیم:

git commit

این بار پیام Create blue and orange pages را وارد کنید. حالا اگر git log بزنید کامیت جدید را هم مشاهده می‌کنید. و البته چون نام و ایمیل وارد کرده‌ایم، کامیت دوم به همراه نام و ایمیل وارد شده نمایش داده می‌شود. تاریخچۀ نسخه‌های مختلف پروژه اکنون مشابه تصویر پایین است:

تاریخچۀ فعلی پروژه

هر دایره یک کامیت را نشان می‌دهد. دایرۀ قرمز کامیتی را نشان می‌دهد که در حال حاضر روی آن هستیم. و دایرۀ خاکستری کامیت قبلی است.

بخوانید  راهنمای مقدماتی گیت (git)

ویرایش صفحات

دستور git add فقط برای فایل‌های جدید نیست. ممکن است تغییری در فایلی داده باشیم که هنوز استیج نشده باشند. با دستور یاد شده می‌توان تغییرات اعمال شده را استیج کرد. کدهای پایین را به ادامۀ index.html درست قبل از تگ <body/> اضافه کنید:

<h2>Navigation</h2>
<ul>
  <li style="color: #F90">
    <a href="orange.html">The Orange Page</a>
  </li>
  <li style="color: #00F">
    <a href="blue.html">The Blue Page</a>
  </li>
</ul>

همچنین لینک صفحۀ ایندکس را به انتهای صفحۀ orange.html و blue.html اضافه کنید. قبل از تگ
<body/> :

<p><a href="index.html">Return to home page</a></p>

اکنون بین صفحات می‌توانید پیمایش کنید.

استیج کردن و کامیت اسنپ‌شات

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

git status
git add index.html orange.html blue.html
git status
git commit -m "Add navigation links"

خط اول، سه فایل index, orange و blue را به رنگ قرمز و با برچسب modified نمایش می‌دهد. این یعنی سه فایل یاد شده تغییراتی دارند که هنوز استیج نشده‌اند. طبق روال با دستور add سه فایل را استیج می‌کنیم و دوباره status می‌گیریم. این بار نام سه فایل به رنگ سبز و با برچسب new file نمایش داده می‌شود. از نگاه گیت هر تغییری در فایل، آن را به یک فایل جدید تبدیل می‌کند. در دستور آخر تغییرات را کامیت کرده‌ایم. البته این بار از سوئیچ m- استفاده کرده‌ایم تا به جای باز کردن ادیتور، مستقیماً پیام را ثبت کنیم. این یک میانبر مرسوم است و دقیقاً همان تاثیر ادیتور را دارد. اکنون کامیت جدیدی به کامیت‌های قبلی اضافه شده و چنین نمای بصری خواهیم داشت:

نمای فعلی تاریخچۀ پروژه

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

نمایش تاریخچۀ مخزن

دستور git log آپشن‌های مختلفی برای قالب‌بندی خروجی دارد. تعدادی از آن‌ها را در این سری آموزشی به مرور معرفی می‌کنیم. مثلاً سوئیچ oneline– هر کامیت را به صورت کوتاه در یک خط نشان می‌دهد و از ذکر جزئیات (صاحب آن کامیت، تاریخ و زمان) خودداری می‌کند. این کار برای داشتن یک دید کلی از وضعیت مخزن مفید است:

git log --oneline

مورد بعدی ارسال یک فایل بخصوص به دستور log است:

git log --oneline blue.html

این دستور فقط تاریخچۀ فایل blue.html را نشان می‌دهد. توجه داشته باشید کامیت اول یعنی Create index page در خروجی وجود ندارد چون فایل blue.html در آن اسنپ‌شات حضور نداشته است. این دستور هر اسنپ‌شاتی که فایل فوق در آن وجود داشته را فهرست می‌کند.

جمع‌بندی

در این قسمت با یک گردش کار(Workflow) معمول در گیت آشنا شدیم: فایل‌هایی را ویرایش کردیم؛ اسنپ‌شات‌ها را استیج کردیم و نهایتاً آن‌ها را کامیت نمودیم.

اساس گردش کار در گیت

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

چکیدۀ دستورات

  • git init : ساخت مخزن در فولدر جاری؛
  • git status : نمایش وضعیت هر فایل در مخزن؛
  • <git add <file : استیج کردن یک یا چند فایل برای کامیت بعدی؛
  • git commit : کامیت کردن فایل‌های استیج شده با یک پیغام مناسب؛
  • git log : نمایش تاریخچۀ کامیت‌های مخزن؛
  • “<git config –global user.name “<name : تعریف نام شخص برای کامیت‌ها در همۀ مخازن گیت؛
  • <git config –global user.email <email : تعریف ایمیل شخص برای همۀ مخازن گیت.

سید ایوب کوکبی

نویسنده و مترجم...

1 دیدگاه

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




    سید محمد

    یکشنبه ۰۵ خرداد ۱۳۹۸

    آقا به خدا نمونه‌ای شما ، عزیز جان ممنونم ازت .