در این مطلب قصد دارم به مرور دستورات گیت و ... را آرشیو کنم تا در مواقع ضروری از آن استفاده کنم :)
گیت یک ورژن کنترل است!
گیت (به انگلیسی: Git) یک نرمافزار کنترل نسخه و از مدل نرمافزارهای آزاد و متنباز برای بازنگری کد منبع توزیع شده و مدیریت منبع کد است که برای دنبال کردن تغییر فایلهای کامپیوتری و دنبال کردن کردن کارهای انجام شده روی آنها توسط افراد مختلف است. هدف اولیه این نرمافزار برای استفاده در پروژههای نرمافزاری بوده است ولی میتوان از آن تنها برای دنبال کردن تغییر فایلها هم استفاده کرد. [ ویکی پدیا ]
برای نصب و دانلود گیت به وب سایت git-scm.com مراجعه کنید و مراحل نصبش را طی کنید و برای نصب گیت هاب هم در صورتیکه وارد وبسایت گیت هاب شوید می توانید نرم افزار مربوط به گیت هاب را دانلود کنید و به راحتی ریپازیتوری هایی که ایجاد میکنید را مدیریت کنید.
با توجه به اینکه برای پروژه ها بیشتر از گیت لب استفاده میکنم بیشتر در این رابطه صحبت میکنم هرچند دستورات و کامندهای گیت هاب هم شبیه به گیت لب است و تفاوت زیادی ندارد.
برای دسترسی به پروژه ها باید یک کلید SSH در پروفایل خود ایجاد کنید که مدیریت و بررسی دسترسی شما به پروژه برای استفاده از گیت است، مطابق تصویر زیر وقتی وارد پروفایل گیت لب خود می شوید لینک Generate برای ایجاد کلید اختصاصی گیت لب برای پروفایل شما نمایش داده می شود که با کلیک روی آن و طی مراحل آن به راحتی کلید را ایجاد میکنید و در کادر مربوطه در پروفایل خود قرار می دهید.
برای فعالسازی ابتدا در مسیر موردنظر ترمینال را باز میکنیم و سپس کد زیر را وارد میکنیم :
ssh-keygen -t rsa -C "yourname@yourdomain.ext"
2 - کد تولید شده را در باکس تصویر فوق که با دستور زیر کپی میشود قرار میدهیم و ایجاد میکنیم :
pbcopy < ~/.ssh/id_rsa.pub
البته دستور آخر برای سیستم عامل های مختلف متفاوته که من برای مک نوشتم پ برای سایر سیستم عامل ها به صورت زیر است :
دستورات گیت به صورت زیر هستند :
git init [project name]
ایجاد یک ریپازیتوری جدید بر روی سیستم خود
git clone MY_URL
دانلود از یک ریپازیتوری موجود (url) بر روی سیستم خود
git status
لیست تغییرات و یا فایل های جدیدی که هنوز commit نشدند.
git add .
افزودن همه فایلهای جدید به stage و آماده بودن برای commit
git add [file name]
افزودن فایل موردنظر به stage و آماده برای commit کردن
git commit -m "Description "
commit کردن همه فایلهای موجود در stage
git commit am "Commit Description "
به طور همزمان، هم فایل ها را add میکنیم و هم commit میکنیم و توضیحی برای commit قرار می دهیم.
git commit -a automatically stage all tracked, modified files before the commit If you think the git add stage of the workflow is too cumbersome, Git allows you to skip that part with the -a option. This basically tells Git to run git add on any file that is "tracked" - that is, any file that was in your last commit and has been modified. This allows you to do a more Subversion style workflow if you want, simply editing files and then running git commit -a when you want to snapshot everything that has been changed.
git push
آپلود و ارسال فایلهای جدید به سرور زیر نظر branchی که در آن هستیم.
git push origin master
آپلود و ارسال فایلهای جدید به سرور زیر نظر branch اصلی master که معمولا اینکار انجام نمی شود و ترجیحا روی branch دیگری push میکنیم و سپس merge میکنیم.
git pull
دریافت آخرین تغییرات از سرور و merge.
نکته : وقتی به صورت تیم روی پروژه ای کار میکنید مثلا شما روی branchی به نام example هستید و تغییراتی اخیرا روی پروژه روی برنچ تست پروژه به نام برنچ dev انجام شده، شما بدون اینکه نیاز باشه که مرج رکوستی ارسال کنید میتوانید آخرین تغییرات را از برنچ dev دریافت کنید به صورت زیر:
git pull origin dev
--------
git branch
مشخص شدن این موضوع که در کدام branch هستیم و کدها را در کدام branch تغییر و یا دریافت میکنیم.
git fetch و یا git fetch --all
دریافت آخرین تغییرات از origin branch. ( no merge )
( در صورتیکه در Branchی هستیم و میخواهیم تغییر branch دهیم، اگر branch را جدیدا ایجاد کرده باشیم باید کد فوق را وارد کنیم تا branch ها و تغییرات شناسایی شوند. )
git branch --all و یا git branch
نمایش لیست همه branch
git checkout Develope
تغییر branch مثلا به شاخه Develope
git branch New_Branch
ایجاد Brnach جدید با نام New_Branch.
git branch -av
نمایش لیست تمام Branchها، Local and Remote
git branch -d My_Branch
حذف My_Branch از لیست Branchها.
git checkout Branch_A git merge Branch_B
Merge کردن Branch_B داخل Branch_A.
git diff
نمایش تغییرات فایلهایی که هنوز وارد stage نشدند.
git diff --cached
نمایش تغییرات فایلهایی که وارد stage شدند.
git diff HEAD
نمایش تمام تغییرات فایلهایی که وارد stage شدند و فایل هایی که هنوز وارد stage نشدند (Unstage).
git diff commit1 commit2
تفاوت تغییرات بین دو commit را نمایش میدهد.
git blame [File Name]
لیست تمام تغییرات فایل موردنظر را همراه با تاریخ و نام دولوپری که تغییرات را ایجاد کرده است نمایش می دهد.
git log
نمایش لیست تمام تغییرات فایل ها.
git log --decorator
نمایش تاریخچه تمام تغییرات به همراه اطلاعات تگ
git log -p [file/directory[
نمایش تاریخچه لیست تغییرات فایل file/directory با نمایش لیست تغییرات آنها (diff) در جریان کامیت ها.
git reset [file[
unstage کردن فایل مورد نظر و اعمال تغییرات جدید.
git reset --hard
بازگردانی ( Revert ) تمام تغییرات از آخرین commitی که انجام شده است.
git tag
نمایش لیست تگهای موجود
git tag TagName
افزودن تگ به آخرین فایلها و تغییرات انجام شده
git push --delete origin TagName
حذف تگ روی ریپازیتوری
git tag -d TagName
حذف تگ ایجاد شده روی لوکال
git push --tags
ارسال همه تگهای ایجاد شده روی ریپازیتوری
git tag -a TagName
افزودن تگ به همراه توضیحات. وقتی از این دستور استفاده میکنید صفحه جدیدی باز میشود تا توضیحات تگ را وارد کنید.
git tag -am "Description" TagName
ایجاد تگ به همراه توضیحات
git tag -n
نمایش لیست تگها به همراه توضیحات هر تگ
تجربه: برخی اوقات تغییراتی را بر روی پروژه انجام دادیم و تغییرات را commit کردیم ولی هنوز push نکردیم و میخواهیم یک commit به عقب برگردیم برای این حالت دستور زیر را وارد میکنیم:
git reset HEAD~1
نکته ۱ : درصورتیکه بخواهیم پروژه را از گیتلب clone کنیم و روی سیستم خود راه اندازی نمائیم همانطور که میدانیم دستور زیر را وارد میکنیم :
git clone git@gitlab.com:user/project-name.git
در این حالت پروژه با فولدری به نام project-name که روی گیت قبلا ساختیم بر روی سیستم ما ایجاد میشود، وقتی ما مثلا میخواهیم پروژه را روی سرور pull کنیم و قبلش باید پروژه را clone کنیم به احتمال زیاد نمیخواهیم با اسمی که روی گیت وجود دارد روی سرور باشد و فقط میخواهیم محتویات آن را داخل فولدری با نامی که ما میسازیم مثلا example ایجاد نماییم. برای اینکار کد زیر را به جای کد فوق وارد میکنیم:
git clone [repository] [local path] و یا git clone git@gitlab.com:user/project-name.git example
همچنین میتوانیم وارد فولدر مورد نظر شویم و دستور زیر را وارد کنیم :
git clone git@gitlab.com:user/project-name.git .
علامت dot آخر دستور بسیار مهم است اگر آن را ننویسیم با اسم ریپازیتوری پروژه clone میشود.
تجربه ۱ : در پروژهای که اخیرا انجام میدادم فایلی به نام composer.json به صورت کاملا اتفاقی توسط یکی از اعضای تیم روی سرور تغییر داده شده بود و وقتی آخرین تغییرات را روی سرور pull میکردیم اجازه داده نمیشد چراکه اول باید تغییرات روی سرور تکلیفش مشخص میشد!
همانطور که در تصویر میبینید تا وقتی این فایل که تغییر داده شده بود revert نشد اجازه pullکردن آخرین تغییرات به ما داده نشد. برای اینکه فایل رو به حالت قبل و بدون تغییر برگردانیم با توجه به اینکه فایل commit نشده بود از دستور زیر استفاده کردیم.
git checkout -- filename
تجربه ۲ : وقتی میخواهید کل یک برنچ را کپی کنید و روی برنچ دیگری قرار دهید با استفاده از دستور زیر اینکار را انجام میدهید.
git checkout -b new_branch old_branch
همانطور که در توضیحات بالا مشاهده کردید با استفاده از دستور git reset میتونیم پروژه رو به کامیت موردنظرمون برگردونیم ولی نکته ای هست که باید به آن توجه کنیم. با استفاده از دستور زیر و ID کامیت موردنظر میتوانیم به کامیت موردنظرمون برگردیم:
git reset COMMIT_ID
و در این حالت فایلهای اضافه ای که بعد از کامیت ایجاد شده اند باقی میمانند و ما میتوانیم برخی را نگه داریم و برخی که نیاز نداریم را پاک کنیم و بعد آنها را add و کامیت کنیم. ولی اگر بخواهیم هر تغییری که داریم و هر فایل اضافه ای که داریم را پاک کنیم و صرفا به کامیت موردنظر برگردیم دستور زیر را اجرا میکنیم:
git reset --hard COMMIT_ID
وقتی توی گیتلب پروژه ای ایجاد میکنید مطابق توضیحات بالا به راحتی با clone کردن آن میتوان پروژه را روی لوکال خودمون ایجاد کنیم. ولی اگر قبلا فولدر پروژه ایجاد شده بود و میخواستیم روی گیت ارسال کنیم چگونه باید اقدام کنیم؟!
وقتی پروژه ای جدید را در گیتلب ایجاد میکنیم با تصویر زیر روبرو میشویم که ما را به درستی و کاملا واضح راهنمایی میکند :
همانطور که در توضیحات بالا ذکر شده یا پروژه را clone میکنیم و اگر فولدر قبلا وجود داشت و خواستیم روی گیتلب قرار دهیم به صورت توضیحات Existing folder اقدام میکنیم. به ترتیب کدهای زیر را اجرا میکنیم.
cd existing_folder git init git remote add origin git@gitlab.com:xxxxxxxxxxx git add . git commit -m "Initial commit" git push -u origin master