هرآنچه باید در مورد Git و Github بدانید/ قسمت اول

سلام

به عنوان اولین نوشته تصمیم گرفتم در مورد git و github بنویسم.

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

گیت یک سرویس مدیریت سورس کد (source code) هست. بر همین اساس هر فرآیند/فعالیت یا ویژگی که بشه روی کدها انجام داد رو گیت ساپورت میکنه. بعضی از اونها مثل نسخه بندی، تگ گذاری، ادغام و ایجاد و مدیریت شاخه ها هستند.

اما مهم ترین دلیل استفاده از git نگهداری و به اشتراک گذاری سورس کد هست، در حالی که چندین نفر بتونن همزمان روی اون سورس کد کار کنند و بتونن ورژن های مختلفی از کد رو کنار هم بدون قاطی شدن ? نگهداری کنند.

اگر تا الان با گیت کار نکردید باید بگم اصلا جای نگرانی نداره. فقط با یک خط دستور میتونید اولین گیت لوکال خودتون رو ایجاد کنید. اما قبل از اون باید آخرین نسخه گیت رو دانلود و نصب کنید.

بعد از نصب برای کار با گیت در ویندوز کافیه cmd رو باز کنید و دستوراتی که با git شروع می شوند رو تایپ کنید. مثل git --version یا git init و ...

لازمه که قبل از شروع به کار با گیت یک سری از تئوری های اون رو بدونید. مثل اینکه گیت چند مرحله کاری داره و هر مرحله چه اسمی.

گیت 4 مرحله داره

1- working directory

2- staging area

3- local repo

4- remote repo

قبل از توضیح این 4 مرحله باید بدونید:

گیت از نوع سورس کنترل های توزیع شده (distributed) هست به این معنی که کد ها علاوه بر نگهداری در یک مخزن کلود (مثلا در اینترنت) به صورت لوکال (مثلا کامپیوتر شما) هم نگهداری می شوند.

نوع دیگر سورس کنترل، مرکزی (centralized) هست که کد ها فقط روی یک سرویس کلود (مثلا اینترنت) نگهداری می شوند. یک نمونه از این سورس کنترل TFVC هست.

خب برگردیم به توضیح مراحل بالا.

مرحله اول یا working directory جایی هست که فایل ها و فولدر ها و خلاصه پروژه شما در اون قرار داره. هر فایل و فولدری که در این قسمت قرار داشته باشه و توسط گیت کنترل نشده باشه (خودمون بگیم کنترلش نکن یا اینکه تازه ایجاد کرده باشیم) به صورت unstaged یا untracked شناخته میشه.

مرحله دوم staging area یک وضعیت انتزاعی هست (انتزاعی یعنی یک تعریف) که به فایل ها و فولدر هایی گفته میشه که تحت کنترل git هستند و هر تغییر در آنها رصد میشه.

مرحله سوم local repo هست. لوکال ریپوزیتوری در واقع مخزن محلی گیت در کامپیوتر شماست. میتونه کنار پروژتون باشه اما اگر کنار پروژتون نباشه چی؟ فایل ها بعد از مرحله دوم با یک commit میرن تو لوکال ریپو.

مرحله چهارم remote repo هست. همون مخزن کدی که کنار پروژه شما نیست و به قول معروف شما بهش ریموت زده اید. برای فرستادن فایل ها از لوکال ریپو به ریموت ریپو باید از دستوری push استفاده کنید.

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

مهم اینه که شما میخواید کد هاتون رو در چند جا نگهداری کنید.

دقت کنید همه این مخازن چه محلی و چه ریموت قراره یک کد واحد رو نگهداری کنند

برای همینه که بهش میگن توزیع شده (distributed)

برای ایجاد یک مخزن لوکال میتونید کنار فایل های پروژتون، cmd رو باز کنید و بنویسید:

git init

این کار باعث ایجاد یک مخزن لوکال در کنار فایل های شما میشه. اما باعث نمیشه که کد های شما در این مخزن قرار بگیرن.

برای قرار دادن کد ها در مخازن به صورت لوکال اول باید اونها رو به گیت معرفی کنید (git add) و بعد اونها رو در مخزن قرار بدیم (git commit). اگر مخزن ریموت هم داشته باشیم یک مرحله در انتها به کار ما اضافه میشه (git push) و اگر بخواید کد ها رو از مخزن ریموت واکشی کنید باید از (git pull) استفاده کنید. تصویر زیر گویای همه چیز است و خود ناچیز ?

دقت کنید که هر دستور کد های شما رو از چه مرحله ای به چه مرحله ای میبره.

در هر سورس کنترلر توزیع شده ای همراه آخرین نسخه کده ها باید در یکی از مخازن قرار داشته باشد. که معمولا در مخزن ریموت آنلاین مثلا در خوده گیت یا گیت هاب قرار میگیره. و در شاخه اصلی (master Branch).

بله شاخه! مثل شاخه و برگ. تنه ی اصلی یک درخه رو در نظر بگیرید، همواره ثابت هست و این شاخه ها هستن که به درخت اضافه میشن و شاید هم قطع بشن شاید هم میوه بدن اما تنه ی درخت همیشه هست. در سورس کنترلر گیت ما تنه یا مثلا تنه ی درخت نداریم اما یک شاخه اصلی داریم به اسم master و کد هایی که بی عیب و نقص هستن و مشکلی ندارند (تست شده هستند) تو شاخه master قرار میگیرن. ما میتونیم از شاخه master یا همون (master branch) شاخه های دیگه ای هم بسازیم. نکته اینجاست که محتوای شاخه جدید دقیقا برابر شاخه والد هست. اما از این به بعد هر تغییری در شاخه جدید در همون شاخه جدید باقی میمونه و به شاخه مستر منتقل نمیشه. برای انتقال اطلاعات شاخه جدید به مستر باید دو تا شاخه ها با دستور (git merge) باهم ادغام بشن.

بریم چندتا دستور ببینیم و نکاتش رو بگیم:

دستور git init برای ایجاد یک مخزن خالی.

نکته 1: مخزنی که با دستور git init ساختید به صورت لوکال هست و نمیشه اون رو به اشتراک گذاشت.

نکته 2: برای اینکه بتونید مخزنی که ساختید رو مثل یک مخزن کلود (اما بدون قرار دادن در گیت) در اختیار دیگران قرار بدید (مثلا دوستاتون در شبکه داخلی) میتونید از پرچم (flag) --bare استفاده کنید.

git init --bare [name ending with .git]

تفاوت ساخت این نوع مخزن با حالت معمولی در این هست که این مخزن مثل یک مخزن کلود برای شما رفتار میکنه و میتونید توش push و pull انجام بدید و اگرچه لوکال هست اما میتونید اون رو با دیگران به اشتراک بگذارید (باز هم میگم در شبکه داخلیتون به اشتراک بگذارید)

بنابر این در مخزنی که پرچم bare رو نداره نمیشه push و pull انجام داد و برای پوش و پول باید به یک مخزن خارجی دیگه remote بزنید.

ریموت remote زدن به یک مخزن خارجی:

برای ریموت زدن به یک مخزن دیگه باید آدرسش رو داشته باشید. میتونید یکی از مخازن آماده در github رو استفاده کنید. مثلا این مخزن فوق العاده در مورد دات نت:

https://github.com/quozd/awesome-dotnet

یا اینکه برای خودتون یک مخزن بسازید:

در سایت گیت هاب ثبت نام کنید و یک repository جدید بسازید.

خب مخزنی که من ساختم با آدرس زیر در دسترس هست

https://github.com/armin-git/world-public

برای ریموت زدن به یک مخزن باید از دستور زیر استفاده کنم

git remote add [name] [URL]

و برای مشاهده مخزن هایی که قبلا به اونها ریموت زدیم باید از پرچم -v استفاده کنید

نکته 1: اسم مخزن ریموت هرچی میخواد باشه، من براش یه اسم به نام origin در نظر گرفتم تا از این به بعد با اسم origin صداش بزنم.

نکته 2: یادتون نره قبل از ریموت زدن به یک مخزن خارجی با دستور git init برای خودتون یک مخزن بسازید.

خب وقتشه چندتا فایل به مخزن لوکالمون اضافه کنیم. مراحل به این صورت:

1- اضافه کردن فایل به working directory

2- با دستور git add به گیت بگیم فایل های اضافه شده رو تحت کنترل و بررسی بگیر

3- با دستور git commit فایل ها رو به مخزن لوکال بفرستیم

4- با دستور push تغییرات رو به مخزن ریموت بفرستیم.

همونطور که میبینید مراحل بالا به ترتیب انجام شده و فایل رو بعد از ایجاد به گیت اضافه کردم (از پرچم -A برای اضافه کردن همه تغییرات در همه فولدرها) و سپس کامیت و در نهایت پوش کردیم. در همه مراحل هم از دستورات (git log) و (git status) برای مشاهده لاگ و وضعیت جاری استفاده کردیم.

نکته 1: اگر دقت کنید بعد از کامیت یه رشته هش شده ی زرد رنگ تولید میشه که توسط اون میشه کامیت ها رو رهگیری کرد.

نکته 2: اگر دقت کرده باشید بعد از کامیت جلوی همون رشته هش شده نوشته HEAD -> master

اما هد (HEAD) چی هست؟ هد اشاره گیری هست که به یک کامیت اشاره میکنه و در هر شاخه (branch) متفاوت هست. چون ما تنها یک کامیت داشتیم، در حال حاضر هد به آخرین کامیت در شاخه مستر اشاره میکنه.

نکته 3: بعد از push کردن جلوی هش عبارت HEAD -> master, origin/master نوشته شده به این معنی که همین کامیت در ریموت origin در شاخه مستر هم وجود داره.

میتونید از دستور زیر برای مشاهده آخرین لاگ ها استفاده کنید (یه ذره جمع و جور تر)

git log --abbrev-commit --pretty=oneline
یا
git log --oneline

نکته 4: کاراکتر های زرد رنگ ابتدایی دستور بالا کوتا شده ی "هش کامیت" هستند و به آنها Short SHA-1 گفته میشه و بین 8 تا 10 کاراکتر هست. هر کامیتی هش متفاوتی داره که 40 کاراکتر و البته یکتا هم هست و برای پیدا کردن کامیت ها به کار میره. هش کامیت های کوتاه شده هم تا جایی که یکتایی هش ها ازبین نره میتونن بین 8 تا 10 کاراکتر باشن.

در قسمت بعدی در مورد pull و branch ها و انواع merge و کامیت ها و ورک فلو و اکشن و قسمت های باقی مونده مفصل صحبت میکنم. امیدوارم که این آموزش تونسته باشه به شما یک شروع سریع داده باشه.

برای مطالعه بیشتر میتونید از این کتاب مرجع استفاده کنید.

شاد باشید ?