آموزش جامع سورس کنترل گیت (Git) و نحوه استفاده از وب سایت گیت هاب (Github)
آموزش Git :
قویترین ابزار Version Control در دنیای نرم افزار که بیش از 90 درصد تیم های نرم افزار در حال حاضر، گیت را به عنوان Source Control خود انتخاب کرده و با آن کار می کنند.
شما به عنوان برنامه نویس حتما باید به یکی از ابزارهای Source Control مسلط باشید که الان دوران Git می باشد و بهتر است این ابزار را یاد بگیرید. ما در این مقاله گیت را خواهیم شناخت، با نحوه کارش آشنا خواهیم شد و دستورات پرکاربرد Git را تمرین خواهیم کرد.
کاربرد و نقش Source Control :
شما برای اینکه تاریخچه تغییرات را داشته باشید و همچنین بتوانید به صورت یک تیم روی یک پروژه کار کنید حتما نیاز به یک ابزار Source Control خواهید داشت.
مهم ترین کارهای که ابزارهای Source Control برای ما انجام می دهند به شرح زیر می باشد :
انواع Source Control
نرم افزارهای Source Control در دو دسته زیر قرار می گیرند که شامل :
در تصویر زیر شما دو حالت Centralized در سمت چپ تصویر و Distributed در سمت راست تصویر را مشاهده می کنید.
معرفی Git و ویژگی های آن
گیت در سال 2005 توسط آقای لینوس توروالدز نوشده شده و سپس توسط نفرات دیگر توسعه داده شده است. امروزه در سال 2020 یکی از قویترین و تاثیرگذارترین ابزارها در دنیای برنامه نویسی، نرم افزار Git می باشد. در ادامه یک سری از نکات و ویژگی های گیت آورده شده است ::
نصب Git در Windows
برای نصب git بر روی سیستم عامل خود می توانید براحتی از سایت خود Git فایل نصب آن را دانلود و روی سیستم خود نصب کنید. نصب Git نیاز به پیش نیاز خاصی ندارد و براحتی می توانید آن را روی سیستم خود نصب کنید.
افزودن اولین پروژه به Git
گیت یک فولدر را به عنوان فولدر اصلی پروژه در نظر می گیرد و محتوای داخل آن را رصد می کند و در صورت تغییر در فایل های داخل پوشه مورد نظر، git تغییر فایل را متوجه شده و می توانیم با دستورات مورد نظر، آن تغییرات را نهایی کنیم.
از طریق روش های زیر می توانید فولدر خود را به سورس کنترل گیت اضافه کنید :
شما از طریق 2 راه بالا می توانید فولدر پروژه خود را به local repository اضافه کنید و وارد دنیای Git شوید.
مراحل افزودن فایل به git و نحوه commit کردن
در تصویر زیر شما مشاهده می کنید که یک فایل برای افزوده شدن به local repository چه مسیری رو باید طی کند تا حالت آن در local repository نهایی شود. فایل ها در git دارای دو حالت می باشند. حالت UnTracked، یعنی این فایل به گیت افزوده نشده و حالت Tracked، معنی این را دارد که فایل به git افزوده شده و در حال مانیتور توسط گیت می باشد.
شما باید بعد از افزوده شدن یک فایل ابتدا آن را add کنید تا از حالت UnTracked به حالت Tracked تبدیل شود و سپس برای نهایی کردن تغییرات باید آن تغییرات را commit کنید تا تغییرات شما نهایی شود.
در این بخش مجدد همه مراحل کار در Commit کردن یک یا چند تغییر در git را مشاهده می کنید :
کاربرد حالت stage
یکی از کاربردهای stage این است که اگر شما بخواهید تغییرات جاری به طور مثال در 5 فایل اتفاق افتاده است را در دو Commit جداگانه داشته باشید، از امکان stage استفاده می کنیم. مثلا 2 تغییر اولیه را با یک Commit و سه تغییر دیگر را با Commit جداگانه ثبت می کنیم.
در ادامه با چند دستور پراستفاده در git آشنا می شویم. شما باید این دستورات را در داخل command prompt یا در ترمینال vs code اجرا کنید.
دستور git status
لیست تغییراتی که هنوز در git به صورت untracked - modify می باشند و همینطور لیست تغییراتی که در حالت stage می باشند ولی هنوز commit نشده اند را نشان می دهد.
دستور git log
لیست Commit ها را نشان می دهد.
دستور git add
برای افزودن تغییرات و فایل به حالت stage از این دستور استفاده می کنیم. اگر تعداد تغیرات زیاد بود و می خواهید همه تغییرات را به صورت یکجا اضافه کنید در انتهای دستور از dot یا نقطه استفاده کنید مانند git add dot، ولی اگر می خواهید فقط یک فایل را add کنید می توانید نام فایل را در انتهای دستور add قرار دهید مثل : git add file01.txt
دستور commit
از این دستور برای نهایی کردن تغییرات استفاده می کنیم. همراه دستور commit باید یک پیغام هم ثبت کنیم که نشان دهد در این commit چه کاری انجام داده ایم.
"git commit -m “commit message
برای مشاهده لیست commit ها می توانیم از دستور git log یا دستور git log --pretty=oneline استفاده کنیم. سوئیچ pretty=oneline باعث می شود خلاصه هر لاگ در یک خط نمایش داده شود.
کاربرد دستورات checkout ، revert و reset در Git :
* نکته اینکه reset نمی تواند فایل یا فولدر های track نشده را حذف کند. این کار باید با دستور clean انجام شود.
* برای مشاهده خلاصه لاگ همه کامیت ها از دستور : git log --oneline
دستور diff
برای مشاهده تغییراتی که انجام شده است و هنوز stage نشده اند
git diff
دستور blame
چه تغییراتی توسط چه کسانی تا به حال روی فایل مورد نظر انجام شده است.
git blame File01.txt
فایل gitignore.
فایلی است که در آن مشخص می کنیم که git چه فولدرها و چه فایل هایی را Track نکند. مثل فولدرهای :
یعنی git با این فولدر و فایل ها کاری نداشته باشد و آنها را نادیده بگیرد.
ما باید بتوانیم تغییرات local repository خود را روی یک remote repository ارسال کنیم تا سایر اعضای تیم پروژه هم بتوانند به تغییرات ما دسترسی داشته باشند. برای داشتن یک remote repository ما راه های مختلفی داریم. یکی از این راه ها استفاده از remote repository های آنلاین می باشد که امروز استقبال زیادی از آنها شده است. در ابتدای مقاله می خواهیم با دو برند معروف در زمینه repository های آنلاین مربوط به Git آشنا شویم.
گیت هاب یکی از محبوب ترین ها در بخش Remote Repository ها می باشد که توانسته با امکانات جانبی خود یکی از بازیگران اصلی در زمینه source control ها و همچنین یک منبع بسیار بزرگ برای پروژه های open source باشد. در تصویر زیر آمار تعداد کاربران، تعداد پروژه ها و تعداد تیم ها و شرکت هایی که از GitHub استفاده می کنند را مشاهده می کنید.
در تصویر بالا مشاهده کردید که تعداد بسیار بالا می باشد و بیش از پنجاه میلیون برنامه نویس عضو GitHub می باشند و این آمار تا ابتدای سال 2021 می باشد. پس اگر تا کنون شما در GitHub حساب کاربری ایجاد نکرده اید همین الان دست به کار شوید و یک حساب کاربری برای خود ایجاد کنید.
ما در گیت هاب می توانیم از پروژه های open source دیگران استفاده کنیم و براحتی source پروژه ها را مطالعه کنیم. آنها را دانلود کنیم و بتوانیم از کدهای مرتبط با کار خودمان استفاده کنیم. یا در پروژه های open source مشارکت کنیم و بخشی از آن را توسعه دهیم یا کدی را بهینه کنیم.
ما در اینجا از گیت هاب برای بخش Remote Repository گیت خود استفاده می کنیم. البته کاربردهای دیگری هم GitHub دارد که مجدد در این بخش به صورت موردی ذکر شده است :
استفاده هایی که ما می توانیم از GitHub داشته باشیم :
نحوه ایجاد Repository جدید و وصل کردن git local به Github
برای افزودن پروژه local خود به GitHub ابتدا باید روی سایت GitHub یک اکانت ساخته و سپس یک پروژه ایجاد کنیم. حالا در صفحه پروژه ایجاد شده یک آدرس به صورت زیر نمایش داده می شود که باید آن را در مسیر جاری پروژه در سیستم خودتان اجرا کنید تا local repository شما به همین راحتی بهremote repository مربوط به GitHub وصل شود.
git remote add origin https://github.com/derambakht/SampleApp.git
در زمان ایجاد پروژه جدید در GitHub ما می توانیم دو مدل پروژه خود را ایجاد کنیم. یک مدل به صورت public که همه می توانند کدهای پروژه شما را مشاهده کنند و این برای پروژه های تجاری ما مناسب نمی باشد و یک مدل به صورت private که این حالت برای پروژه های شخصی و تجاری ما بسیار خوب می باشد.
نکته مهم در خصوص پروژه های private این است که کاربران ایرانی به دلیل تحریم نمی توانند از این ویژگی بسیار خوب GitHub فعلا استفاده کنند.
در ادامه چند دستور مهم که در زمان کار با Remote Repository ها به آنها نیاز داریم را با هم مشاهده می کنیم. یک نکته مهم دیگر اینکه دستورات Git برای Remote Repository ها تفاوتی ندارد، یعنی تفاوتی ندارد شما به GitHub کار می کنید یا با GitLab. دستوراتی که از Git یاد می گیرید در همه ثابت می باشد.
برای مشاهده لیست Remote repo های یک پروژه در Git می توانید از دستور زیر استفاده کنید:
git remote -v
خوب الان پروژه شما به Remote Repository وصل می باشد. در تصویر بالا هم مشاهده می کنید که نشان می دهد که پروژه شما به چه آدرس remote وصل می باشد. در تصویر بالا دو خط آدرس آمده است که یکی برای fetch یا گرفتن تغییرات از remote به روی local می باشد و دیگری push برای ارسال تغییرات از local به remote می باشد.
حالا اگر شما نیاز به ارسال تغییرات یا push کردن دارید باید اطلاعات نام کاربری و ایمیل اکانت GitHub خود را به کمک دستورات زیر وارد نمایید :
”git config –global user.name “Mohsen Derambakht
”git config global user.email “derambakht@gmail.com
در صورتی که نیاز به password باشد در حالت push یک پنجره باز شده و از شما رمز عبور اکانت را یکبار پرسیده و اجازه ارسال تغییرات را به شما می دهد.
برای ارسال تغییرات خود از روی local به روی remote یا همان عمل push کردن از دستور زیر می توانیم استفاده کنیم :
git push origin master
با اجرای این دستور تغییرات شما از روی local به روی remote ارسال می شود.
نحوه مشاهده لیست همه config ها : git config - -list
شما خیلی وقت ها عضو یک تیم برنامه نویسی هستید و می خواهید یک نسخه از پروژه را روی سیستم خود داشته باشید و سپس روی آن کار خود را شروع کنید. در این حالت باید ابتدا پروژه خود را از روی remote repository روی سیستم خود clone کنید. برای این کار باید دستور زیر را وارد کنید :
git clone https://github.com/derambakht/GitHubSample.git
با اجرای دستور بالا کل پروژه در مسیری که این دستور را اجرا کرده اید کپی می شود.
در ادامه با دستورات بسیار مهمی در Git آشنا می شویم که بسیار کاربردی و مهم می باشند.
branch در git معنای شاخه و مسیر را دارید. به صورت پیش فرض ما در git یک مسیر و شاخه اصلی داریم که به آن master گفته می شود. همه تغییرات و اتفاقات در حالت اصلی روی master اعمال می شود.
خوب مشکل کار کجا هست و این branch master چه نکته ای دارد ؟
شما فکر کنید با اعضای تیم خود در حال کار روی پروژه و انجام task ها هستید. در همان لحظه نیاز دارید که یک نسخه جدید build کنید و روی سرور یکی از کافرماها اجرا کنید. خوب الان اعضای تیم شما کلی تغییرات داشته اند که شاید مشکل داشته باشند و یا شما نخواهید در این نسخه آن تغییرات وجود داشته باشند.
یا تغییرات یک بخش مثل آپلودر فایل شما هنوز مشخص نیست عملکرد خوبی داشته باشد ولی به ناچار روی شاخه اصلی شما commit شده است. اینجا ما درگیر branch ها می شویم. ما باید برای انجام هرکار جدیدی یک branch ایجاد کنیم و تغییرات خود را روی آن branch انجام دهیم و در نهایت و در صورت تایید تغییرات branch ایجاد شده را در branch master خود merge کنیم.
پس شما و اعضای تیم حتما باید برای هر task جدیدی یک branch ایجاد کنند و کارهای خود را روی آن branch ها انجام دهند. هیچ کس به جز مدیر پروژه نباید دسترسی و اجازه کار با branch master را داشته باشد.
وقتی شما یک branch جدید ایجاد می کنید انگار یک کپی از کد را از زمان ایجاد branch دارید و روی آن کار می کنید و در نهایت می توانید branch ایجاد شده را در branch اصلی merge کنید یا اصلا آن branch را به حالت خود رها کنید، چون تغییرات ایجاد شده مورد قبول نمی باشد و نباید در کد اصلی قرار گیرند.
برای مشاهده لیست branch ها می توانید از دستور git branch استفاده کنید. این دستور لیست branch ها را نمایش می دهد و خطی که کنار آن علامت ستاره وجود دارد، branch فعال شما می باشد.
برای ایجاد branch جدید می توانید از دستور git branch name استفاده کنید. به جای کلمه name باید نام branch خود را بنویسید. انتحاب نام مناسب برای branch بسیار مهم می باشد چون تعداد branch در ادامه کار شما بسیار زیاد می شود و بهتر است از یک استاندارد نامگذاری برای انتخاب نام استفاده کنید. مانند مثال زیر :
شما با مشاهده نام بالا براحتی متوجه می شوید که این branch مربوط به کدام task می باشد و چه کاری داخل آن انجام شده است. پس در نامگذاری branch های خود بسیار خوش سلیقه و مرتب عمل کنید.
بعد از ایجاد branch جدید مجدد می توانید از دستور git branch استفاده کنید و لیست branch ها خود را مشاهده کنید. در لیست مشاهده می کنید که همچنان branch فعال، branch دیگری است و branch ایجاد شده شما انتخاب نشده است. برای انتخاب branch مورد نظر به عنوان branch اصلی از دستور زیر استفاده می کنیم :
git checkout branchName
این دستور باعث می شود که branch مورد نظر فعال شود و شما تغییرات و commit های خود را روی آن اعمال کنید.
پس از اعمال تغییرات و نهایی کردن آنها در branch مورد نظر شما، حالا قصد دارید که این branch ایجاد شده را در branch master یا branch دیگر ادغام یا merge کنید. برای این کار ابتدا باید به branch مقصد سوئیج کنید، یعنی مثلا به branch master خود سوئیچ می کنید :
git checkout master
حالا برای merge شدن باید دستور زیر را اجرا کنید :
git merge branch-name
با اجرای این دستور تغییرات branch-name در branch جاری شما به طور مثال master ادغام خواهد شد و شما همه تغییرات داخل branch-name خود را داخل master خواهید دید.
پس مهم ترین کاربرد branch این هست که شما بتوانید تغییرات خود را روی یک نسخه به غیر از نسخه اصلی انجام دهید و در صورت اطمینان از تغییرات انجام شده آن را روی شاخه اصلی اعمال کنید. مجدد لیست دستورات مربوط به branch را با هم مشاهده می کنیم :
مشاهده لیست branch ها : git branch
ایجاد یک branch جدید : git branch BranchName
نحوه سوئیچ کردن بین branch ها : git checkout BranchName
نحوه ایجاد کردن branch و سوئیچ روی branch ایجاد شده : git checkout -b BranchName
نحوه merge کردن branch مورد نظر در branch دیگر : از source به destination
git checkout destinationBranch => git checkout master
git merge sourceBranch => git merge feature-english-version
برای مشاهده و مقایسه تغییرات مربوط به دو branch نیست به یکدیگر می توانید از دستور زیر استفاده کنید :
git diff branch-1 branch-2
بعد از دستور branch به سراغ یک دستور پرکاربرد و مهم دیگر می رویم. فرض کنید شما در حال اعمال تغییرات روی branch مورد نظر خود هستید و نیاز می شود که سریع به branch دیگری بروید و روی آن کاری انجام دهید. اگر شما تغییرات branch جاری را ذخیره نکنید و سپس به یک branch دیگر بروید آن تغییرات در branch جدید هم مشاهده می شود و در commit شما آن تغییرات که مربوط به branch دیگری بود ولی شما آنها را به خاطر عجله کاری commit نکرده بودید، در این branch جدید commit می شود و باعث زحمت و اشتباه می شود.
پس شما نیاز دارید بعضی وقت ها تغییرات را بدون commit کردن یکجا به طور موقت ذخیره کنید و در زمان نیاز آنها را بازیابی کنید و کار خود را در آن بخش ادامه دهید. برای این کار از دستور stash استفاده می کنیم. ما می توانیم به کمک این دستور تغییرات خود را به صورت موقت با یک نام ذخیره کنیم و به کار خود ادامه دهیم و در زمان مورد نظر آن تغییرات ذخیره شده را بازیابی کنیم و آنها را تکمیل و در نهایت commit کنیم.
کاربرد stash در git : ذخیره موقت تغییرات Commit نشده با یک نام مشخص و restore کردن آنها در زمان دلخواه :
دستور ذخیره کردن تغییرات به کمک stash با نام مورد نظر :
git stash save contact-en-page-changes
در حالت عادی stash فایل های جدید افزوده شده که وضعیت untracked دارند را ذخیره نمی کنید، برای ذخیره کردن آن فایل ها در stash باید از سوئیچ - - include-untracked استفده کنیم.
Git stash save contact-en-page-changes –include-untracked
نحوه کار stash به این شکل است که یک stash به صورت یک آرایه می باشد که با دستور git stash save یک آیتم که همان تغییرات شما است به آن افزوده می شود و با دستور git stash pop آخرین آیتم از انتهای آرایه برداشته می شود و به ما برگردانده می شود.
برگرداندن تغییرات آخرین stash ایجاد شده در branch جاری :
git stash pop
مشاهده لیست stash ها : git stash list
گرفتن تغییرات از stash و اعمال رو branch بدون حذف کردن از سابقه stash :
git stash apply
شما می توانید تغییرات رو از stash با دستور apply بردارید بدون اینکه تغییرات از stash حذف شوند.
برای مدیریت Version ها در گیت از Tag استفاده می کنیم. Tag امکان بسیار خوبی می باشد که می توانیم ورژن بندی پروژه خود را توسط آن مدیریت کنیم. براحتی می توانیم تا نقطه مورد نظر ورژن یا tag بزنیم و در صورت نیاز به آن نقطه بازگشته و خروجی بگیریم.
نمایش لیست تگ ها : git tag
ایجاد تگ جدید : git tag TagName
حذف تگ مورد نظر در local repo : git tag -d TagName
ارسال تگ ها از local به Remote repository : git push - -tags
حذف تگ مورد نظر از روی Remote repository : git push --delete origin tagName
نحوه سوئیچ کردن و حرکت به tag مورد نظر : git checkout tags/tagName
با دستورات بالا براحتی می توانیم یک tag جدید ایجاد کنیم و بتوانیم با دستور checkout به tag مورد نظر حرکت کنیم و یا در صورت عدم نیاز به یک tag آن را حذف کنیم.