سرفصل‌های آموزشی
آموزش گیت
آشنایی با نحوهٔ‌ ساخت یک ریپازیتوری در گیت‌هاب

آشنایی با نحوهٔ‌ ساخت یک ریپازیتوری در گیت‌هاب

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

برای شروع، پس از ثبت‌نام در این سایت و مراجعه به لینک Create a new repository، به سادگی می‌توان نامی دلخواه برای ریپازیتوری خود انتخاب نموده سپس با انتخاب یکی از گزینه‌های Public یا Private می‌توانیم تصمیم بگیریم که آیا این ریپازیتوری می‌باید عمومی بوده و بالتبع برای سایر کاربران قابل‌مشاهده باشد یا یک ریپازیتوری اختصاصی باشد و سایرین برای مشاهده نیاز به پرمیشن خواهند داشت و در نهایت هم با کلیک بر روی دکمهٔ Create repository می‌توان پروسهٔ‌ ساخت ریپازیتوری را نهایی کرد.

به محض کلیک بر روی دکمهٔ‌ فوق،‌ به صفحه‌ای ارجاع داده‌ خواهیم شد که حاوی دیتای مرتبط با ریپازیتوری جدید است که پیش از هر چیز، لینک این ریپازیتوری در معرض دیدمان قرار می‌گیرد و می‌توانیم آن را کپی نماییم. حال برای آن که کلیهٔ‌ دیتای پروژه‌ای که در این دوره تکمیل نمودیم را به ریپازیتوری آنلاینی که تحت عنوان git-tutorial ساختیم پوش (آپلود) نماییم، از کامند زیر استفاده می‌‌کنیم:

/var/www/git-tutorial$ git push https://github.com/behzadmoradi/git-tutorial.git master
Username for 'https://github.com': my.email.address@gmail.com
Password for 'https://my.email.address@github.com': 
Counting objects: 23, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (23/23), 2.06 KiB | 263.00 KiB/s, done.
Total 23 (delta 8), reused 0 (delta 0)
remote: Resolving deltas: 100% (8/8), done.
To https://github.com/behzadmoradi/git-tutorial.git
 * [new branch]      master -> master

همان‌طور که ملاحظه می‌شود، ابتدا دستور git را نوشته سپس آدرس ریپازیتوری را پِیست می‌کنیم و در نهایت هم با نوشتن master دستور می‌دهیم که قصد داریم تا کدهای لوکالی که روی سیستم قرار دارند به بِرَنچ مَستر اصطلاحاً Push شوند. به محض اینتر کردن،‌ ابتدا به ساکن نام‌کاربری و رمزعبور گیت‌هاب درخواست شده و در صورتی که به درستی وارد شوند،‌ پروسهٔ پوش آغاز می‌گردد. حال اگر به سایت گیت‌هاب مراجعه کرده و ریپازیتوری خود را رِفرش کنیم، می‌بینیم که کدهای لوکال از این پس روی سرورهای گیت‌هاب نیز قرار دارند و توسط سایر توسعه‌دهندگان قابل‌روئیت هستند.

حال تغییری ساده در یکی از فایل‌های پروژه داده و آن‌ را کامیت می‌کنیم تا ببینیم که مجدد به چه شکل می‌توان تغییرات جدید را روی ریپازیتوری آنلاین‌مان در سرویس گیت‌هاب پوش کرد:

/var/www/git-tutorial$ git add index.html 
/var/www/git-tutorial$ git commit -m "a change made"
[master d2123d4] a change made
 1 file changed, 1 insertion(+)

اکنون نیاز است تا مجدد از دستور push به همراه لینک ریپازیتوری استفاده نماییم اما این در حالی است که به نظر می‌رسد هر دفعه کپی کردن آدرس ریپازیتوری کاری خسته‌کننده باشد و از همین روی می‌توانیم یک به اصطلاح Alias یا «نام مستعار» برای ریپازتوری خود به صورت زیر بسازیم:

/var/www/git-tutorial$ git remote add origin https://github.com/behzadmoradi/git-tutorial.git

همان‌طور که ملاحظه می‌شود،‌ طبق روال ابتدا دستور git را نوشته سپس از کیورد remote استفاده کرده‌ایم که به ریپازیتوری‌های ریموت (آنلاین) اشاره دارد سپس از دستور add استفاده کرده و نام مستعاری تحت عنوان origin که نام مستعار پیش‌فرض در سرویس‌های آنلاینی همچون گیت‌هاب برای ریپازیتوری‌ها است استفاده کرده و در نهایت آدرس ریپازیتوری را درج نموده و اینتر می‌‌کنیم به طوری که از این پس در پروسهٔ پوش کردن فایل‌های تغییریافته، به جای نوشتن آدرس کامل ریپازیتوری، می‌توان از نام مستعار origin به صورت استفاده نمود:

/var/www/git-tutorial$ git push origin master 
Username for 'https://github.com': my.email.address@gmail.com
Password for 'https://my.email.address@gmail.com@github.com': 
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 380 bytes | 380.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/behzadmoradi/git-tutorial.git
   46e51f6..d2123d4  master -> master

اگر در سایت گیت‌هاب به فایلی که تغییر دادیم مراجعه کنیم،‌ می‌بینیم که تغییرات قابل‌مشاهده‌ هستند.

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

آشنایی با روش Clone کردن یک ریپازیتوری

به منظور درک بهتر سازوکار کلون کردن یک ریپازیتوری، مجدد اقدام به ساخت یک ریپازیتوری جدید در سایت گیت‌هاب با نامی دلخواه همچون my-new-repo می‌کنیم. در ادامه، مجدد یوآرال اختصاصی این ریپازیتوری در معرض دیدمان قرار خواهد گرفت که به سادگی می‌توان آن را کپی نمود. حال اگر از سیستم‌عامل گنو/لینوکس استفاده کنیم، می‌توانیم در هر مسیر که تمایل داشته باشیم همچون var/www/ اقدام به Clone کردن این ریپازیتوری جدید کنیم به طوری که داریم:

/var/www$ git clone https://github.com/behzadmoradi/my-new-repo.git
Cloning into 'my-new-repo'...
warning: You appear to have cloned an empty repository.

همان‌طور که ملاحظه می‌شود، پس از دستورات git clone آدرس کامل ریپازیتوری جدید که در گیت‌هاب ساختیم را نوشته و اینتر می‌کنیم و اگر مشکلی در پروسهٔ کلونینگ پیش نیاید، خواهیم دید که در مسیر var/www/ پوشهٔ جدیدی تحت عنوان my-new-repo ساخته خواهد شد و اگر به محتویات این پوشه نگاهی بیندازیم نیز خواهیم دید:

my-new-repo
└── .git

در ادامه جهت تست، فایلی تحت عنوان index.php حاوی محتویات زیر در مسیر روت این ریپو می‌سازیم:

<?php 
echo "This is my first PHP file";

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

/var/www/my-new-repo$ git add index.php 
/var/www/my-new-repo$ git commit -m "This is my first commit for the new repo"
[master (root-commit) fe50a9b] This is my first commit for the new repo
 1 file changed, 2 insertions(+)
 create mode 100644 index.php

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

/var/www/my-new-repo$ git remote -v
origin  https://github.com/behzadmoradi/my-new-repo.git (fetch)
origin  https://github.com/behzadmoradi/my-new-repo.git (push)

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

/var/www/my-new-repo$ git push origin master 
Username for 'https://github.com': my.email.address@gmail.com
Password for 'https://my.email.address@gmail.com@github.com': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 277 bytes | 277.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/behzadmoradi/my-new-repo.git
 * [new branch]      master -> master

در این مرحله از کار چنانچه ریپازیتوری آنلاین خود را رِفرش کنیم، می‌بینیم که فایل index.php به آن افزوده شده است.

با توجه به این که این ریپو پابلیک (عمومی) است، مسلماً دیگر کاربران به آن دسترسی خواهند داشت و می‌توانند آن را کلون کرده و تغییرات خود را اِعمال کنند. همچنین لازم به یادآوری است که کاربری که یک ریپازیتوری را ایجاد کرده، از طریق اینترفیس سایت گیت‌هاب می‌تواند تک‌تک فایل‌های پروژه را آپدیت کند. به طور مثال،‌ فایل index.php را در سایت گیت‌هاب به صورت زیر تغییر می‌دهیم:

<?php 
echo "This is my first PHP file";
echo "<br>";
echo "This is a change";

در واقع، می‌توانیم این‌طور تلقی کنیم که این یک آپدیت توسط یکی از همکاران‌مان است که روی این ریپو انجام داده است و اکنون تمایل داریم تا این تغییرات را روی ریپازیتوری لوکال‌مان نیز داشته باشیم که برای این منظور می‌توان از دستور pull به صورت زیر استفاده کرد:

/var/www/my-new-repo$ git pull origin master 
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/behzadmoradi/my-new-repo
 * branch            master     -> FETCH_HEAD
   fe50a9b..8ef8dba  master     -> origin/master
Updating fe50a9b..8ef8dba
Fast-forward
 index.php | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

حال اگر به فایل index.php روی سیستم لوکال خود نگاهی بیندازیم، می‌بینیم که محتوای آن با محتوای ریپازیتوری آنلاین سینک (به‌روزرسانی) شده است.

آشنایی با انجام Pull Request در Git

پیش از این با مفهوم Pull Request آشنا شدیم و در ادامهٔ این آموزش قصد داریم نحوهٔ انجام این کار را مورد بررسی قرار دهیم. معمولاً شیوهٔ‌ اصولی انجام مشارکت در پروژه‌های اپن‌سورس بدین صورت است که به جای کار روی بِرَنچ مَستر، اقدام به ساخت یک بِرَنچ جدید اختصاصی برای خود کرده و تغییرات مد نظر را روی آن شاخه انجام داد سپس به صاحب ریپازیتوری یک پول ریکوئست داد تا چنانچه کدهای تغییریافته مورد تأییدش بودند، آن‌ها را با بِرَنچ اصلی (مَستر)‌ ادغام کند. برای درک بهتر این موضوع، با وارد کردن کامند git branch my-own-branch یک بِرَنچ جدید تحت عنوان my-own-branch می‌سازیم سپس با دستور git checkout my-own-branch به این بِرَنچ سوئیچ می‌کنیم. حال فایل index.php را به صورت زیر آپدیت می‌کنیم:

<?php 
echo "This is my first PHP file";
echo "<br>";
echo "This is a change";
echo "<br>";
echo "This is another change";

حال این تغییرات را کامیت می‌کنیم:

/var/www/my-new-repo$ git add index.php 
/var/www/my-new-repo$ git commit -m "this is another commit"
[my-own-branch 7f84a9c] this is another commit
 1 file changed, 2 insertions(+)

اکنون نوبت به پوش کردن تغییرات جدید روی ریپوی آنلاین می‌رسد:

/var/www/my-new-repo$ git push origin my-own-branch 
Username for 'https://github.com': my.email.address@gmail.com
Password for 'https://my.email.address@gmail.com@github.com': 
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 318 bytes | 318.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: Create a pull request for 'my-own-branch' on GitHub by visiting:
remote:      https://github.com/behzadmoradi/my-new-repo/pull/new/my-own-branch
remote: 
To https://github.com/behzadmoradi/my-new-repo.git
 * [new branch]      my-own-branch -> my-own-branch

همان‌طور که در متن پیام ملاحظه می‌شود، گزارهٔ Create a pull request for 'my-own-branch' on GitHub حاکی از آن است که یک پول ریکوئست ایجاد شده است؛ به عبارتی، یک درخواست برای دولوپر اصلی این ریپو ایجاد کرده‌ایم تا تغییرات مد نظرمان را مورد بررسی قرار داده سپس در صورت تأیید، آن‌ها را با ریپازیتوری مَستر ادغام کند.

اکنون اگر صفحهٔ اصلی این ریپازیتوری در سایت گیت‌هاب را رِفرش کنیم، خواهیم دید که دکمه‌ای تحت عنوان Compare & pull request ایجاد شده است که با کلیک بر روی آن سپس کلیک بر روی دکمهٔ Create pull request می‌توان چنین درخواستی را برای دولوپر اصلی این پروژه‌ ایجاد کرد.

در این مرحله، دکمه‌ای در معرض دید صاحب ریپازیتوری قرار خواهد گرفت تحت عنوان Merge pull request که با کلیک بر روی آن، می‌تواند تغییرات را با بِرَنچ اصلی ادغام کند و اگر پس از انجام این کار به فایل index.php در ریپوی آنلاین مراجعه کنیم، می‌بینیم که تغییرات قابل‌ملاحظه هستند.

در ادامه،‌ در محیط لوکال با استفاده از دستور git checkout master به شاخهٔ مَستر سوئیچ کرده سپس می‌بینیم تغییراتی که در فایل مذکور داده‌ بودیم حذف شدند و این مسئله از آنجا ناشی می‌شود که تغییرات مذکور در بِرَنچ my-own-branch داده شده بودند و اساساً قبل از انجام هر کاری،‌ می‌باید اطمینان حاصل کنیم که ریپازیتوری لوکال ما با ریپازیتوری آنلاین‌مان سینک است و از همین روی، کامند زیر را اجرا می‌کنیم:

/var/www/my-new-repo$ git pull origin master 
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From https://github.com/behzadmoradi/my-new-repo
 * branch            master     -> FETCH_HEAD
   8ef8dba..12c4369  master     -> origin/master
Updating 8ef8dba..12c4369
Fast-forward
 index.php | 2 ++
 1 file changed, 2 insertions(+)

حال می‌بینیم که تغییرات مجدد مشاهده می‌شوند چرا که ریپوی لوکال با ریپوی قرارگرفته روی گیت‌هاب به درستی سینک شده است.

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

online-support-icon