گیت

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

این مطلب در وبسایت https://arastoonet.github.io/2018/12/14/git.html براساس لایسنس CC BY-NC-SA 4.0 منتشر شده است.

تعریف

گیت یه مجموعه دستور و امکاناته که روند تغییرات یک یا چند فایل رو مشاهده می‌کنه و به ما این قابلیت رو میده تا بتونیم نسخه‌های مختلفی از برنامه‌ای که توسعه می‌دیم رو مدیریت کنیم. اینجوری ما می‌تونیم بین نسخه‌های مختلف یه برنامه بگردیم و اونا رو restore بکنیم. این پروسه به صورت خیلی مقدماتی و پایه‌ای بهش میگن سیستم کنترل نسخه یا Version Control System. گیت رو خالق لینوکس، لینوس توروالدز نوشته 🙂.

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

هر پروژه‌‌ای که توی گیت قرار بگیره بهش میگن یه ریپازیتوری یا یه مخزن. مثلا اگه شما مشغول ساختن یه اپلیکیشن توی دایرکتوری app هستید، این دایرکتوری میشه اون مخزن شما. گیت این مخزن و تغییراتی که درش اتفاق می‌افته رو دنبال میکنه و همه اتفاقات اونجا رو پیگیری میکنه.

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

۱- نصب گیت

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

اگه مثل من از اوبونتو استفاده می‌کنید که کافیه توی ترمینال بزنید sudo apt install git اگه از مک او اس استفاده می‌کنید کافیه توی ترمینال بزنید brew install git اگر هم توی ویندوز هستید که باید این برنامه‌ رو نصب بکنید. نسخه‌های گرافیکی هم از گیت وجود داره که می‌تونید استفاده بکنید اما خب کار با محیط متنی خیلی لذت بخش تره.

۲- کانفیگ گیت

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

git config --global user.name "Arastoo"
git config --global user.email test@test.com

شما بجای Arastoo و test@test.com، از نام و ایمیل خودتون استفاده کنید.

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

۳- ایجاد یک مخزن

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

git init

بعد از اینکار پیغامی شبیه به زیر براتون ظاهر میشه:

Initialized empty Git repository in /home/me/test/.git/

حالا اگه یه دستوری مثل ls -a رو وارد کنید می‌بینید که یه دایرکتوری مخفی به اسم .git وجود داره که گیت اون رو براتون ساخته. از این به بعد تمام اطلاعات مربوط به پروژه‌تون مثل کامیت‌ها و… توی این دایرکتوری نگه داری میشه. در مورد این قضیه هم صحبت می‌کنیم.

توی اون دایرکتوری یه فایل simple.txt درست کنید.

۴- بررسی وضعیت گیت

گیت یه دستور git status داره که وضعیت گیت رو بررسی می‌کنه. مثلا میگه چه چیزهایی تغییر کردند، چه چیزهای جدیدی اضافه شده، آیا همه چیز بروزرسانی شده یا نه و چیزهایی از این دست. حالا بیایید یه بار این دستور رو وارد کنیم بببینم چی به ما برمی‌گردونه:

git status

خروجی:

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	simple.txt

nothing added to commit but untracked files present (use "git add" to track)

این خروجی داره به من میگه که روی برنچ مستر هستم (در موردش حرف میزنیم)

هنوز کامیتی ایجاد نشده (در مورد اینم حرف میزنیم)

مهم این خطه که نوشته untracked files: در واقع این خط داره میگه که یه سری فایل توی دایرکتوری test شما وجود داره که گیت دنبال‌شون نمیکنه، به تعبیری این فایل simple.txt جدیده و گیت هنوز نمیدونه که باهاش چیکار بکنه.

حالا سوالی که پیش میاد اینه که چطوری به گیت بگم که هواسش به این فایله باشه؟

۵- استیج کردن – به روی صحنه بردن

گیت یه مقوله به اسم «ناحیه استیج» داره. در واقع مثل یه اتاق خالی نگاهش بکنید که توش یه دوربین مداربسته وجود داره «اسم دوربین‌مون گیت هستش» حالا شما برای اینکه تمام رفتارهای یک آدم رو بفهمید و ببینید داره چیکار میکنه باید وارد اون اتاق‌ش بکنید. این آدم توی مثال‌مون فایل simple.txt هستش. با وارد کردنش به این چهارچوب، گیت دنبال‌ش میکنه و بیخیالش نمیشه و تمام جیک و پیکش رو براتون در میاره.

برای وارد کردن فایل simple.txt به این محیط کافیه دستور git add رو همراه با اسم فایل وارد کنید، مثل:

git add simple.txt

حالا فایل به مرحله استیج رفت. اگه چند تا فایل داشته باشید می‌تونید بجای وارد کردن اسم همشون دستور git add -A رو وارد کنید. به همین سادگی.

حالا یه بار دیگه دستور git status رو وارد کنید:

On branch master

No commits yet

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

	new file:   simple.txt

این بار بجای untracked files داره میگه که یه فایل جدید به اسم simple.txt داره ردگیری میشه و آماده‌س که کامیت‌ش بکنیم.

۶- کامیت کردن

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

برای کامیت کردن نیاز هست که یه فایل یا چندین فایل رو توی استیج قرار داده باشید. همونطور که می‌دونید ما یه فایل simple.txt رو توی قسمت استیج قرار دادیم بنابراین حالا می‌تونیم اون رو کامیت بکنید. برای اینکار دستور git commit رو به صورت زیر استفاده می‌کنیم:

git commit -m "Initial Commit"

آرگومان -m به این معناست که همراه با کامیت یه پیغام رو هم بزار که ببینم کامیت من راجع به چیه. مثلا توی کد بالا پیغام رو گذاشتم: کامیت اولیه یا Initial Commit.

۷. گیت‌هاب

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

۷-۱: ثبت نام و ساخت مخزن در گیت‌هاب

اولین کاری که باید بکنید اینه که توی گیت‌هاب ثبت نام بکنید و بعدش یه مخزن درست کنید. برای اینکار کافیه وارد این آدرس بشید و فیلدهای مربوط به مخزن رو پر کنید و در نهایت Create repository رو بزنید. بعد از اینکار وارد آدرس مخزن‌تون بشید.

۷-۲: ارتباط با گیت‌هاب

حالا نیازه که آدرس .git مخزن‌تون رو بردارید و توی ترمینال براساس کد زیر به مخزن متصل بشید:

git remote add origin https://github.com/arastoonet/sc.git

origin یک نام برای این ارتباط ریموت من با گیت هستش. می‌تونه هر چیز دیگه‌ای باشه اما اینو معمولا میزارند.

حالا که من یه ارتباط درست کردم و الان وقت این شده که گیت لوکال‌م رو بفرستم روی گیت‌هاب. برای اینکار از دستور push به صورت زیر استفاده می‌کنم.

git push origin master

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

اگه با مشکلی برخوردید می‌تونید از آرگومان -f یعنی force برای push کردن استفاده کنید که به صورت زیر این کار انجام شدنیه:

git push -f origin master

۷-۳: کلون کردن پروژه

برای دریافت محتویات داخل یک ریپازیتوری توی گیت‌هاب کافیه از دستور clone استفاده کنید:

git clone https://github.com/arastoonet/sc.git

حالا اگه من توی این مخزن گیت یه بروزرسانی ایجاد کردم. مثلا یه فایل جدیدی رو اضافه کردم، دیگه نمی‌خواد از اول بیایید کل پروژه رو کلون بکنید. می‌تونید با استفاده از دستور pull فایل‌های جدید آپدیت شده رو بیارید تو مخزن محلی‌تون:

git pull origin master

۸- برنچ‌ – شاخه

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

دلایل استفاده از برنچ:

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

۹- ایجاد یک برنچ جدید

به صورت پیشفرض گیت یه برنچ به اسم master برای ما ایجاد میکنه که پروژه اصلی ما روی اونه. برای اینکه یه برنچ جدید بسازید کافیه دستور زیر رو وارد کنید:

git branch new_feature

حالا من یه برنچ جدید با نام new_feature ساختم. با استفاده از دستور branch به صورت خالی، می‌تونید لیستی از برنچ‌های موجود رو ببینید:

git branch

اون علامت ستاره قبل از هر کدومش باشه به این معناست که ما روی اون کار می‌کنیم. حالا بزارید از روی برنچ master بریم روی برنچ جدیدی که ساختیم. برای اینکار دستور checkout رو وارد می‌کنیم:

git checkout new_feature

حالا یه بار دیگه git branch رو وارد کنید که مطمئن بشید علامت ستاره روی گزینه new_feature قرار داره.

اگه بود می‌تونیم فرایند توسعه رو ادامه بدیم. برای اینکه ببینیم دقیقا چه اتفاقاتی می افته، توی این برنچ جدید یه فایل می‌سازیم و اون رو کامیت می‌کنیم:

touch new_file.txt
git add new_file.txt
git commit -m "new file in new branch"

حالا جالبی قضیه می‌دونید کجاست؟ وقتی که برگردید سراغ برنچ master می بینید که فایل new_file.txt مخفی شده و نمی‌تونید ببینیدش. خب دلیل‌ش اینه که این فایل توی یه برنچ دیگه قرار داره نه برنچ مستر.

۱۰- Merge کردن برنچ‌ها

خب حالا که من بخوام تمام برنچ‌های ساخته شده رو به برنچ اصلی یعنی برنچ master بیارم باید چیکار کنم؟ سوال خوبیه. تنها کافیه که فایل‌های مختلف برنچ‌های مختلف رو بریزید توی master برای اینکار از دستور merge استفاده می‌کنیم.

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

git checkout master

بعد عملیات مرج کردن رو شروع می‌کنم:

git merge new_feature

خب حالا می‌تونید ببینید که فایل new_file.txt به برنچ مستر اضافه شد. حالا که کارمون با برنچ قبلی تموم شد می‌تونیم حذفش بکنیم.

git branch -d new_feature

۱۱- بررسی تفاوت‌های بین دو کامیت

هر کامیتی که شما توی مخزن‌تون می‌کنید یه آی‌دی منحصر به فرد داره که به ما قابلیت دسترسی رو میده. اگه می‌خواید لیست تموم کامیت‌هایی که تا به حال کردید رو ببینید کافیه دستور git log رو وارد بکنید.

commit 2e3e8df76377cb0a8e162892215de93a30f74b03 (HEAD -> master)
Author: Arastoo test@test.com>
Date:   Tue Nov 27 01:09:48 2018 +0330

    Second Commit

commit 6522647a9fa63906d2216d505b8c9578de30ba97
Author: Arastoo test@test.com>
Date:   Tue Nov 27 01:08:08 2018 +0330

    First Commit

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

برای هر لیست از کامیت‌ها می‌تونید اطلاعاتی مثل آی‌دی کامیت، نام کسی که کامیت کرده، تاریخ کامیت و پیغام کامیت رو مشاهده بکنید.

حالا برای اینکه جزئیات کاملتری از هر کامیت رو ببینیم کافیه از دستور git show همراه با آی‌دی کامیت مورد نظر استفاده بکنید:

git show 652264

خروجی: commit 6522647a9fa63906d2216d505b8c9578de30ba97 (HEAD) Author: Arastoo test@test.com> Date: Tue Nov 27 01:31:24 2018 +0330

Second Commit

diff –git a/index.html b/index.html new file mode 100644 index 0000000..557db03 — /dev/null +++ b/index.html @@ -0,0 +1 @@ +Hello World

یه دستور کاربردی دیگه هم که می‌تونیم ازش استفاده بکنیم دستور diff هستش که میاد تغییرات و تفاوت‌های بین دو کامیت رو بررسی می‌کنه. برای اینکار کافیه آی‌دی دو کامیت رو داشته باشیم:

git diff 6522..9a83

شاید خروجی دستور براتون پیچیده باشه، بجای اون می‌تونید از ابزاری مثال git difftool استفاده بکنید.

۱۲- بازگشت به نسخه قبلی

خب یکی از هدف‌هایی که ما از استفاده گیت داریم اینه که به ما کنترل خوبی رو روی مدیریت نسخه‌های مختلف یه پروژه بده. خب برای اینکار ما از دستور git checkout استفاده می‌کنیم. قبلا از این دستور برای کنترل برنچ‌ها هم استفاده کردیم.

حالا تصور کنید که من می‌خوام فایل index.html رو به اولین کامیتی برگردونم که کردم. یعنی همون کامیت inital … برای اینکار کافیه آی‌دی کامیت و آدرس index.html رو داشته باشم:

git checkout 6522 index.html

حالا اگه محتویات index.html رو بررسی کنیم می‌بینیم که خالیه یا همون چیزی داخلش قرار داره که توی کامیت اول نوشتیم.

حالا موضوع مهم اینه که اگه من git log رو وارد کنم هنوز هم با کامیت‌های جدیدتر برخورد می‌کنم و می‌تونم به اونا برگردم. گیت فوق العاده‌س 🙂

۱۳. تغییر در یک کامیت

اگه توی آخرین کامیتی که کردید یه اشتباهی توی نوشتن پیامش کرده باشید چیکار می‌کنید؟ خب شاید بگید برمی‌گردم عقب یه کامیت جدید میزنم و… . خب این کار منطقی نیست. برای یه تغییر سریع روی کامیت ما دستور git commit –amend رو در اختیار داریم که به ما اجازه می‌ده تا پیغام آخرین کامیت رو اصلاح کنیم.

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

خب برای اینکار کافیه دستور revert رو همراه با آی‌دی کامیت وارد کنیم:

git revert 6522
# or
git revert HEAD

HEAD به آخرین کامیتی که شده اشاره می‌کنه.

۱۴- حل کردن Merge conflicts

تصور کنید که یک برنچ جدید ایجاد کردید و فایل قرار گرفته در برنچ قبلی رو در این برنچ تغییر دادید. حالا به برنچ master برمی‌گردید و عملیات مرج رو انجام می‌دید. اما با یه مشکل بر خورد می‌کنید:

Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

گیت برای عملیات مرج کردن به صورت خودکار وارد کار میشه اما یه وقتایی هست که گیت نمی‌تونه این روند خودکار رو انجام بده. به همین خاطر این خطا رو برگشت میده.

حالا برای حل این مشکل می‌تونید به صورت دستی وارد عمل بشید. چطوری؟ خب فایل index.html رو باز کنید: می‌بینید که کلی تغییرات توش اعمال شده:

HEAD
Hello World
=======
Hello Again
>>>>>>> new

در واقع گفته که شما در آخرین کامیت که HEAD آدرسشه نوشتید: Hello World اما در برنچ جدید که اسمش New هستش نوشتید Hello Again … من کدومشون رو نگه داری کنم؟

اینجاست که نیازه به صورت دستی وارد کار بشید و کدهای مربوط به برنچی که می‌خواید رو بزارید و مورد دیگر رو حذف کنید. در آخر هم git add index.html و git commit.

۱۵- .gitignore

بعضی وقت‌ها در یک پروژه قصد این رو ندارید که بعضی از فایل ها و دایرکتوری‌ها رو کامیت بکنید و یا اونا رو به استیج ببرید. خب شاید بگید که توی git add اسمی ازش نیاریم ولی خب ما وقتی پروژه بزرگی داشته باشیم بیشتر وقتا از git add -A استفاده می‌کنیم. اما اگه بخوایم همین دستور هم یه سری فایل ها رو شامل نشه از یه فایلی به اسم .gitignore استفاده می‌کنیم.

کافیه که یه فایل با نام .gitigonre درست کنید و تموم مواردی که نمی‌خواید گیت اونا رو استیج بکنه درش قرار بدید. مثلا:

*.log
build/
node_modules/
.idea/
my_notes.txt

در این حالت فایل‌هایی با پسوند .log، تمام محتویات دایرکتوری‌های build, node_modules,.idea و فایل my_notes.txt در مخزن گیت شما قرار نمی‌گیرند.

دوره رایگان آموزشی گیت و گیت‌هاب

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

آموزش سریع گیت و گیت‌هاب

https://cdn1.vedo.ir/Lenzy/1/298/2018/11/lenzy_FdlnoM12JFhyZFDY1JPB46-720.vedo

در پایان

برای پیشرفت کردن در این موضوع می‌تونید از لینک‌های زیر استفاده بکنید.

https://git-scm.com/doc

https://www.atlassian.com/git

https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf

مشاهده این مطلب در وبسایت https://arastoonet.github.io/2018/12/14/git.html