خب در ابتدا این رو ذکر کنم که این آموزش جهت ایجاد یک شروع برای کار با گیت هستش و در صورتی که همین الان دارین با گیت کار میکنید و میخواین در زمینه کار باهاش پیشرفت کنید، این آموزش کاربردی نداره به اون صورت براتون.
خب میخوام در ابتدا گیت رو تعریف کنم.
تعریف گیت
گیت یک نرمافزار کنترل نسخه و از مدل نرمافزارهای آزاد و متنباز برای بازنگری کد منبع توزیع شده و مدیریت منبع کد است که برای دنبال کردن تغییر فایلهای کامپیوتری و دنبال کردن کارهای انجام شده روی آنها توسط افراد مختلف است. هدف اولیه این نرمافزار برای استفاده در پروژههای نرمافزاری بودهاست ولی میتوان از آن تنها برای دنبال کردن تغییر فایلها هم استفاده کرد.
خب به زبون سادهتر بخوام توضیح بدم، فرض بگیرید دارید بر روی یک برنامه کار میکنید، کدهای اون رو مینویسیم، بازنویسی میکنیم، مرور میکنیم، کدهای دیگران رو میگیریم و بازنویسی میکنیم. حال این پروژه بر روی یک سرور متمرکز هستش و ما داریم تیمی بر روی این کار میکنیم.حالا این کدهای پروژه بر روی چندین سیستم دیگه پخش شده و داریم روش کار میکنیم و هیچ کدوم خبری از اون یکی و روند طی شدش نداریم.
به خاطر همین مشکلات بود که سیستم مدیریت کد مورد نیاز بود.
در صورتی که میخواین اطلاعات بیشتری بگیرین میتونید به این آدرس مراجعه کنید.
خب حالا میخوایم بیایم و یه خورده واقعیتر صحبت کنیم در مورد گیت.
فرض کنید برنامهای دارید که متشکل از چند خط کد هستش. هر یک از این بخشها در اختیار یکی از اعضای تیم شما قرار داره ( فرض کنید اسم این افراد رو برنامهنویس ۱ و برنامهنویس ۲ میزاریم) خب بعضی وقتا این دو تا برنامهنویس ما جاشون عوض میشه، میخوان رو کد هم کار کنن و …، اینجا یه سری مسائل پیش میاد، اول از همه اینکه این افراد از کجا میخوان تغییرات قبلی رو بفهمن و ازینجور مسائل. سیستم گیت روشی برای حل اینجور مسائل هستش.
همونجوری که بدیهی هستش حاصل کار ۲ تا برنامهنویس تمایز داره با هم دیگه و مشخص نیست کدوم یک از این تغییرات باید اعمال بشه. یک راهکار ساده اینه که ما هردو فایل رو در یک مکان متمرکز داشته باشیم ولی خب باز هم نگهداری هر دو تغییرات مشکل ما رو حل نمیکنه. و ما باید بدونیم این تغییرات رو چه کسی داده و یه سیستمی داشته باشیم که بتونه این تغییرات رو یکپارچه کنه. حالا فرض کنید تیم ما ۱۰ نفره بشه. مشکلات ما ۱۰ برابر بزرگتر میشه و ما با تعدد سورس کدها و تغییرات مواجه هستیم.
حالا سوالی که پیش میاد این هستش که برنامهنویس ۱ ما میخواد کدی که نوشته رو بازبینی یا اصلاح کنه، چه فایلی رو دریافت میکنه برای این کار؟
اینها برخی مشکلات و سوالاتی هستند که در یک پروژه برنامهنویسی تیمی همیشه باهاشون روبهرو هستیم و باید پاسخی برای اونها پیدا کنیم.
مفاهیم اولیه در گیت
حال قصد داریم مثال قبل رو با جزییات بیشتری بررسی کنیم. تصور کنید برنامهنویس اول ما، بر روی سیستمش گیت رو نصب کرده و ابزارهای لازم رو داره و میخواد گام اول رو بردارد و اولین فایلی رو که روش کار کرده به سیستم گیت ارسال کنه. برای اضافه کردن فایل به گیت، از دستوری به اسم Add استفاده میشود. بلافاصله بعد از دستور Add، یک Index (فهرست) تشکیل میشود. کار index این هستش که به طور موقت تغییرات جدید رو در خودش نگه میداره. این فایل index فقط آخرین تغییرات رو در خودش ذخیره میکنه. وقتی از بابت تغییرات مطمئن شدیم و خواستیم اونها رو به صورت دائمی بر روی سیستم ثبت کنیم، دستور Commit رو انجام میدیم. تمامی این اتفاقات بر روی سیستم کامپیوتر برنامهنویس اول ما در حال رخ دادن هستش. پس از Commit کردن فایلها یک Head تشکیل میشه که این Head تمامی تغییراتی هستش که من از ابتدا روی این فایل یا کلیه فایلها دادم. در واقع یک دفترچهای هستش که تمامی وقایع رو ثبت کرده بر روی سیستم برنامهنویس اول ما.
خب ما میتونیم کل روز رو به فرآیند تغییر و بهروز کردن کدهای خودمون روی سیستم بپردازیم و انواع فایلها رو Add کنیم و Commit کنیم. وقتی از کد خود مطمئن شدیم، با استفاده از دستور Push میایم و فایلها رو به Repository یا مخزن گیت ارسال میکنیم. در این حالت کدهای ما توسط دیگران قابل بازبینی و اصلاح هستش. کار Push این هستش که آخرین تغییرات رو از Head گرفته و به مخزن منتقل میکنه. در این مرحله ما توضیحاتی رو باید ضمیمه کد کنیم و بعد Push کنیم که دیگران در جریان کارهایی که ما انجام دادیم قرار بگیرن.
حال بیایم یه خورده بیشتر در مورد مخزن یا Repository صحبت کنیم. مخزن محلی هستش که کلیه تغییرات و فایلها برای اون ارسال میشن و یک محل متمرکز هستش که کلیه افراد میتونن تغییراتی رو که دادن به سمت اون ارسال کنن. و زمانی که ما یک نسخه از این مخزن بر میداریم، کلیه تغییرات ادقام شده و ما میتونیم حاصل کار نهایی رو ببینیم.
مسیر ارسال فایلها یک طرفه نیست و اینجوری نیست که ما آخرین تغییرات رو بخوایم همیشه درون مخزن بریزیم. گاهی اوقات نیاز داریم که این آخرین تغییرات رو از مخزن بخونیم و در سیستم خودمون بریزیم. برای این کار از فرمان Pull استفاده میکنیم.
یکی از مزایای خوب استفاده از سیستم گیت، اینه که ما میتونیم مطمئن باشیم که ما هیچ وقت هیچ تغییری رو از دست نمیدیم. به طور مثال اگه فایل ما دارای ۱۰۰ خط کد باشه و ما به هر دلیلی ما بخشی از اون رو پاک کنیم یا تغییر بدیم و فایل رو ذخیره کنیم و Commit کنیم، میتونیم مطمئن باشیم این تغییرات یک جایی ذخیره شده و ما میتونیم هر موقع که بخوایم این تغییرات رو بازیابی کنیم. به همین دلیل و شاید دلایل دیگه ما نیاز داشته باشیم بعضی وقتها ما نسخه فعلی خودمون رو با نسخهای که در Head وجود داره مقایسه کنیم تا متوجه تفاوتها و تغییرات بشیم و بر اساس اون تصمیمگیری هایی رو انجام بدیم. برای این منظور از دستور Diff استفاده میکنیم که این دستور باعث میشه نسخه فعلی ما با نسخه Head مقایسه بشه و تغییرات رو به ما نشون میده.
خب ما وقتی میخوایم از این گیت توی یه پروژمون استفاده کنیم باید بسازیم اطلاعاتش رو. با دستور
git init فایلها و اطلاعات لازم ساخته میشه. این کار یه فولدر میسازه به نام .git که ما کلا به صورت دستی کاری با این پوشه و محتویاتش نداریم.
دستور git status میاد و وضعیت رو چک می کنه و به شما میگه آیا فایل جدیدی در پوشهی شما ایجاد شده یا خیر.
حال فرض کنید فایل جدیدی به نام soroush.txt در پوشهی خود ایجاد کرده باشید و بخواهید این رو در گیت اضافه کنید باید دستور زیر را بزنید:
git add soroush.txt
اگه شما بخواین چند تا فایل رو توی یک فولدر بفرستین به گیت:
git add -A .
که اون نقطه اشاره به پوشهی فعلی که توش هستین داره. بعد از این کار باید Commit کنید فایلهاتون رو. به این صورت میتونید عمل کنید:
git commit -m “Add Some Description”
که در اینجا یه مقدار توضیحات مینویسید برای اینکه در آینده بدونید این تغییراتی که دادید به چه شکل بوده.
با دستور git log میتونید لاگ Commit های خودتون رو ببینید.
خب بعد از این کار باید این کدها و فایلهامون رو بفرستیم توی مخزن. یکی از سایتهایی که این مخزن رو در اختیار ما قرار میده، سایت گیتهاب هستش. وقتی یک مخزن در گیتهاب برای پروژتون میسازین، به شما یک آدرس داده میشه که تمام کسانی که میخوان روی اون پروژه کار کنن، با اون آدرس میتونن وصل شن و فایل ارسال کنن.
برای اینکه این کدها و فایلها رو به مخزنتون وصل کنید میتونید از این دستور استفاده کنید:
git remote add origin https://github.com/sadasd/asdasd.git
که خب آدرس مخزن خودتون رو باید براش وارد کنید.
حال باید این کدها رو به مخزن ارسال کنید:
git push -u origin master
همچنین میتونید به صورت force به مخزن ارسال کنید:
git push -f origin master
بر عکس این عملیات push عملیات pull هستش:
git pull origin master
دیدگاهتان را بنویسید