git برای اولین بار


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

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

توی این آموزش سعی میکنم که توضیح مختصری در مورد اینکه git چی هست و چه به درد میخوره و همچنین توی پروژه ها چطوری میشه از این source controll استفاده کرد، توضیح دهم و در آخر در مورد استفاده از github هم توضیح مختصری خواهم داد.

git یک ورژن کنترل میباشد ، منظور از ورژن کنترل این است که شما میتونید تغییراتی که روی فایلهای خود ( فایلهای کد ) انجام میدهید را trace کنید و حالت فعلی فایل را به حالت قبلی تغییر دهید . ولی بگذارید با یک مثال این موضوع رو روشن کنم .

من وقتی شروع به نوشتن این موضوع کردم چندین روز طول کشید، و توی هر روز چند ساعت واسه نوشتن این موضوع وقت میذاشتم ، در ساعتهای مختلف یک روز که وقت نوشتن رو داشتم این موضوع رو مینوشتم و هر موقع میدیدم که کاری واسه من پیش اومده یا خسته شده بودم بلافاصله موضوع رو save میکردم و کارمو انجام میدادم ، save کردن در اینجا به معنی commit میباشد . هر موقع میدیدم که موضوع به مرحله ایی رسیده که قابل نمایش باشه ، وضعیت پست رو به نمایش تغییر میدادم که همه بتونن موضوع رو ببینن که به این کار میگن push که بعد از commit انجام میشه . وقتی مقاله نوشته شده را نمایش بدم همکارم این موضوع رو میبینه و به من پیام میده که کدوم قسمتهای این موضوع باید تغییر پیدا کنن، همکارم وارد پروفایل خودش میشه و شروع به ویرایش موضوع میکنه که به این عمل میگن clone خوب همکارم تغییرات رو روی موضوع انجام میده و دوباره ذخیره رو انجام میده که دوباره به این حالت میگن Commit ولی Commit ها اعمال نمیشن تا موقعی که من تایید بدم، به دلیل اینکه من master هستم و بعد از تایید من ویرایش اعمال میشه و سپس تغییرات نمایش داده میشن که به این حالت میگن merge . این دستورات توسط سیستم ورژن کنترل قابل استفاده هستند . ولی بزارید توضیحات بالا رو به صورت عملی اجرا کنیم .

قبل از اجرای هر دستور در git باید از کلمه کلیدی git استفاده کرد .

# init 

از این دستور برای ایجاد یک repository جدید استفاده میکنیم . که باعث به وجود آمدن پوشه .git میشود .

repository قسمتی از پروژه شما میباشد که برای ذخیره کردن تاریخچه کاری شما از آن استفاده میشود .

# clone

از این دستور برای ایجاد یک نسخه جدید از یک repository استفاده میشود .

git clone https://github.com/mkdesignn/menubuilder

# روش کاری git

در repository که ایجاد میکنید شما با 3 مرحله کاری در ارتباط هستید، که در پوشه .git وجود دارند. اولین مرحله محل یا پوشه کاری شما میباشد، دومین مرحله، که به نام شاخص یا محل استقرار معروف هست و سومین مرحله که به نام head معروف میباشد که به آخرین تغییراتی که انجام دادید اشاره میکند .

# add & commit

شما میتوانید تغییراتی را روی یک فایل انجام دهید و سپس آن را به قسمت شاخص اضافه کنید . 

git add <file_name>
git add .

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

بعد از این مرحله نوبت به commit میرسد 

git commit -m "Commit message"

در صورت commit کردن ، کلیه فایلهای که در قسمت ایندکس وجود دارند به قسمت head  تحت عنوان یک شماره که به نام commid id میباشد انتقال پیدا میکنند .

ولی همه این فایلها هنوز در repository محلی شما میباشند. و هنوز به repository ریموت انتقال پیدا نکردند .

# pushing

بعد از اینکه تغییرات به قسمت head انتقال پیدا کردند نوبت به ارسال تغییرات به repository ریموت میباشد که میتواند در هر سروری قرار گرفته باشد ، github, gitlab . بعد از اعمال تغییرات و انجام عملیات push گیت به شما یک هشدار میدهد که این هشدار به شکل زیر میباشد .

git remote add <name> <url>

این دستور به معنی این است که شما باید یک alias در محیط لوکال خود ایجاد کنید که به آدرس remote repository مربوط باشد .

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

بعد از ایجاد alias و سپس push کردن تغییرات که با کلمه کلیدی git push انجام میشود . شما با پیام زیر روبرو میشود 

git push --set-upstream origin master

این پیام به دلیل این میباشد که شما در repository remote خود هیچ branch تحت عنوان branch اصلی که در local repository با آن در حال کار هستید ندارید . با استفاده از دستور set-upstream-- نام اختصاری origin را به صورت default برای کل پروژه تعریف میکنیم

 

هر repository جدید که ایجاد میکنید، repository با یک branch اولیه به نام Master ایجاد میشود .

# Branch

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

ایجاد branch جدید 

git checkout -b feature_x
git branch feature_x

جهت برگشتن به branch مستر

git checkout master

جهت حذف کردن یک branch

git branch -d feature_x

بعد از ایجاد هر branch ، باید آنرا به repository ریموت push کرد در غیر اینصورت بقیه نمیتوانند از آن استفاده کنند . جهت push کردن یک branch کافیست از دستور زیر استفاده کرد 

git push origin <branch>

origin همان alias میباشد که در ابتدا آنرا تعریف کردیم و برای استفاده در عملیات remote از آن استفاده میکنیم .

# pull & merge

جهت به روز رسانی repository لوکال ، کافیست از دستور git pull استفاده شود . این کار سبب میشود git فایلهای موجود در remote repository را در ابتدا fetch سپس با فایلهای موجود در repository local شما مقایسه و در آخر آنها را merge میکند . در صورتی که شما در یک  branch مشغول به انجام کار باشید و نیاز به اعمال تغییرات از یک branch دیگر را داشته باشید کافیست از دستور git merge branch-name استفاده کنید . در هر دو حالت git عملیات Auto merge را برای شما انجام میدهد . متاسفانه این عمل همیشه با موفقیت انجام پذیر نخواهد شد و باعث به وجود آمدن conflict هایی میشود که این conflict ها رو باید به صورت دستی از بین ببرید ، بعد از بین بردن conflict باید از git add  و سپس دوباره commit و push را انجام دهید . قبل از اعمال تغییرات و یا merge کردن انها میتوایند از دستور git diff source-branch dest-branch جهت مقایسه فایلها استفاده کرد .

# log

جهت دیدن log کافیه از کلمه کلیدی git log استفاده کنید ، با این کار شما میتوانید تمامی commit هایی که انجام دادید را نمایش دهید . جهت اینکه ببینید کدوم فایلها در یک commit تغییر کرده است کافیه از git log --name-status استفاده کنید و واسه اینکه بفهمید که کدوم خط یک فایل تغییر کرده است کافیه از git log -p  استفاده کنید .

# اعمال ویرایش ها

بعضی موقها کاری رو انجام میدیم و بعد متوجه میشیم که کاری که انجام دادید اشتباه و میخواید اون رو به حالت قبل که commit کردید برگردونید ، خوب خیلی راحت میتونید از git checkout -- file_name استفاده کنید ، اینکار باعث میشه که محتوای فایل شما همانند محتوای یک ورژن قبل شود و همچنین فایل را از محیط stage خارج میکند .

بعضی موقها پیش میاد که میخواید تغییرات اعمال شده رو تا جایی حذف کنید ، شما میتونید اینکارو با استفاده از دستور git reset --hard commit_id انجام دهید .

این موضوع در حال کامل شدن میباشد .

مشکل ، مورد ، نظر ، ایده هر سوالی که به ذهنتون در مورد این آموزش میرسه لطفاً بیان کنید