آموزش گیت-بخش سوم-دستور Commit در Git

سلام به همراهان عزیز آکادمی راهکارینو. با بخش سوم از آموزش جامع ورژن کنترل گیت در کنار شما خواهیم بود. در بخش قبل، درباره Stage (ثبت تغییرات در stage) بطور کامل صحبت کردیم. در این مقاله می خواهیم دستور commit در گیت را بطور مفصل بررسی کنیم.
فهرست موضوعات جلسه سوم:
- مشاهده لیست فایل های تغییریافته در هر commit
- نحوه فیلتر کردن لاگ کامیت ها
- شخصی سازی نمایش کامیت ها
- مشاهده جزئیات یک کامیت
- یافتن باگ توسط bisect
- مشاهده لیست افراد مشارکت کننده در پروژه
- مشاهده تغییرات یک فایل در کامیت ها
- برچسب گذاری روی کامیت ها
- استفاده از افزونه GitLens در VScode
آماده سازی محیط پروژه:
ابتدا پروژه ونوس را از این لینک دریافت کنید. زیرا در این بخش می خواهیم روی این پروژه توضیح دهیم.
فایل زیپ فوق را extract کرده و git bash را در فولدر Venus اجرا کنید. اکنون دستور git log را برای مشاهده کامیت های انجام شده اجرا کنید.
به این دلیل که تعداد کامیت ها زیاد است و در یک صفحه جا نمی شود، برای مشاهده صفحه بعدی کامیت ها دکمه space صفحه کلید را بزنید. برای خروجی از لاگ هم دکمه q را بفشارید.
حالا می خواهیم روش های مختلف دیدن لاگ کامیت ها را بررسی کنیم:
مشاهده لیست فایل های تغییر یافته در هر commit
برای مشاهده فایل هایی که در هر کامیت تغییر کرده اند به همراه تعداد تغییرات آنها، دستور git log –stat را اجرا کنید:
بعنوان مثال در آخرین commit انجام شده، 5 فایل تغییرکرده اند. مثلا فایل audience.txt شامل 4 تغییر بوده است. 3 خط اضافه شده (+) و یک خط هم حذف شده است (-)
البته دستور فوق را می توان در یک خط اجرا کرد یعنی استفاده از oneline بصورت زیر:
مشاهده می کنید که دیگر برای هر کامیت اطلاعات اضافی مانند نام کاربری فرد کامیت کرده یا ایمیل او و غیره لیست نشده است و فقط نام فایل به همراه تغییرات آن قابل مشاهده هستند.
مشاهده تغییرات فایل ها بصورت جزئی و دقیق:
در ادامه برای اینکه بتوان تغییرات هر فایل را نسبت به نسخه قبلی خودش مقایسه کرد دستور git log –oneline –patch را باید اجرا کرد:
نحوه فیلتر کردن لاگ commit ها در گیت:
ممکن است در یک repository صدها یا حتی هزاران commit انجام گرفته باشد. مسلما ما نمی توانیم در بین همه آنها بدنبال کامیت موردنظر بگردیم. با استفاده از فیلتر کردن کامیت ها که در این بخش آموزش می دهیم می توانید فقط بخشی از commit ها را مشاهده کنید.
مشاهده چند کامیت آخر:
برای مشاهده سه کامیت آخر کافیست دستور git log –oneline -3 را اجرا کنید. سه می تواند هر عددی باشد.
مشاهده کامیت های یک نویسنده مشخص:
برای مشاهده کامیت های یک نویسنده خاص، آن را به این شکل تعریف می کنیم:
git log --oneline --author="Mosh"
مشاهده لیست کامیت ها بر اساس تاریخ:
*برای مشاهده commit های صورت گرفته در قبل یا بعد از یک تاریخ مشخص، مثلا کامیت های قبل از 17 آگوست 2020 دستور زیر را داریم:
git log --oneline --after="2020-08-17"
*برای مشاهده کامیت های دیروز دستور git log –oneline –after=”yesterday” را اجرا کنید.
نکته: دقت کنید که عبارت –oneline در دستورات فوق اختیاری است و فقط برای یک خطی شدن لیست کامیت ها می باشد.
*برای مشاهده کامیت های انجام شده در یک هفته پیش به قبل دستور زیر را داریم:
git log --oneline --before="one week ago"
به همین ترتیب می توان کامیت های انجام شده در روز، ماه یا سال مشخص را مشاهده کرد.
فیلتر کردن commit بر اساس محتوای پیغام آنها:
*برای مشاهده commit هایی که message آنها شامل یک کلمه خاص هستند داریم:
git log --oneline --grep="GUI"
در دستور فوق می خواهیم لیست کامیت هایی که پیغام آنها شامل کلمه GUI است را ببینیم.
*برای مشاهده commit هایی که در آنها یک کلمه مشخص به فایل اضافه شده است داریم:
git log --oneline -S"OBJECTIVES"
با اجرای دستور بالا انتظار داریم کامیت هایی لیست شوند که کلمه OBJECTIVES در فایلی از پروژه اضافه شده است.
مشاهده commit های بین دو آیدی:
*برای مشاهده کامیت های بین دو آیدی مشخص داریم:
git log --oneline fb0d184..edb3594
مشاهده کامیت های اعمال شده روی یک فایل مشخص:
*برای مشاهده کامیت هایی که روی یک فایل مشخص تغییراتی انجام داده اند داریم:
git log --oneline toc.txt
شخصی سازی نمایش commit ها در گیت:
اگر هیچیک از فرمت های نمایش کامیت ها در گیت را نمی پسندید، مانند oneline، این امکان وجود دارد که نحوه نمایش آنها را فرمت دهی و شخصی سازی کنید.
نمایش نام نویسنده و آیدی و تاریخ commit:
به روش زیر می توانید فرمت author-name commited commited-id on commit-date را نمایش دهید:
git log --pretty=format:"%an committed %h on %cd"
خروجی به شکل زیر خواهد بود:
در این دستور، منظور از an% نام نویسنده یا authorname است و منظور از %cd تاریخ کامیت یا commitdate است.
تغییر رنگ بخش های مختلف commit:
همچنین می توان برای هر بخش از کامیت، رنگ دلخواه تعریف کرد! مثلا برای نام نویسنده رنگ سبز، آیدی کامیت رنگ قرمز و تاریخ کامیت رنگ آبی را در نظر بگیریم. دستور زیر را اجرا کنید:
git log --pretty=format:"%Cgreen%an%Creset committed %Cred%h%Creset on %Cblue%cd%Creset"
تعریف alias برای لاگ سفارشی:
برای اینکه هر بار نخواهیم دستور طولانی فوق را تایپ کنیم، می توان برای آن یک معادل تعریف کرد (alias) و براحتی از آن استفاده کرد. در بخش زیر می خواهیم برای دستور فوق یک جایگزین بنام MyLog تعریف کنیم. دستور زیر را اجرا کنید:
git config --global alias.MyLog "log --pretty=format:'%Cgreen%an%Creset committed %Cred%h%Creset on %Cblue%cd%Creset'"
اکنون اگر دستور git MyLog را اجرا کنیم همان خروجی بالا را خواهیم داشت:
مشاهده جزئیات یک commit:
به دو روش می توان جزئیات یک commit را مشاهده کرد: با استفاده از آیدی کامیت و با استفاده از نشانگر HEAD
فرض کنید می خواهیم کامیت 555b62e را مشاهده کنیم. کافیست دستور git show 555b62e را اجرا کنیم. اگر بخواهیم به روش دوم اینکار را انجام دهیم، با توجه به اینکه این کامیت سومین کامیت از آخر می باشد، باید دستور git show HEAD~2 را اجرا کنیم.
نمایش نام فایل های تغییر یافته در commit:
حال اگر بخواهیم فقط نام فایل هایی که در یک commit مشخص تغییر کرده اند را مشاهده کنیم دستور زیر را داریم:
git show HEAD~2 --name-only
مشاهده تغییرات بین دو کامیت:
به منظور مقایسه بین دو commit در گیت، می توان از نشانگر HEAD به شکل زیر استفاده کرد:
git diff HEAD~2 HEAD
دستور فوق تغییرات بین آخرین کامیت و سومین کامیت از آخر را نمایش می دهد.
نکته: اگر بخواهیم تغییرات اعمال شده روی یک فایل مشخص را در این کامیت ها مشاهده کنیم کافیست نام فایل را در انتهای دستور فوق اضافه کنیم:
git diff HEAD~2 HEAD audience.txt
نکته: برای مشاهده نام فایل هایی که در بین این دو commit تغییر کرده اند کافیست –name-only را به انتهای دستور اضافه کنیم:
git diff HEAD~2 HEAD --name-only
یافتن باگ توسط bisect در گیت:
فرض کنید در پروژه تان یک خطا (bug) رخ داده که در آخرین کامیت متوجه آن شده اید. اما دقیقا نمی دانید در کدامیک از commit ها خطا رخ داده و تغییرات کدام کامیت باعث بروز خطا شده است. همچنین می دانید که کامیت اول هیچ خطایی ندارد.
تعریف commit خوب و commit بد:
برای شروع کار دستور git bisect start را اجرا کنید. در ادامه باید کامیت های خوب و بد را به گیت معرفی کنیم. در این مثال فرض می کنیم آخرین کامیت bad commit است و اولین کامیت good commit.
چونکه الان در کامیت آخر قرار داریم کافیست برای معرفی کامیت بد دستور زیر را اجرا کنیم:
git bisect bad
و چون اولین کامیت را بعنوان good commit در نظر گرفتیم، دستور زیر را اجرا می کنیم:
git bisect good ca49180
عبارت آخر (ca49180) آیدی کامیت اول می باشد. سپس دستور git log –oneline –all را اجرا می کنیم تا لیست تمام کامیت ها را ببینیم:
تشخیص کامیت بد با جابجایی نشانگر HEAD:
مشاهده می کنید که نشانگر HEAD از master جدا (Detach) شده است و به کامیت وسط اشاره می کند. آخرین کامیت با refs/bisect/bad و اولین کامیت نیز با refs/bisect/good نشانه گذاری شده است.
در این حالت باید برنامه را اجرا کنیم و اگر همچنان باگ وجود داشت، مطمئن می شویم که خطا در نیمه اول کامیت ها رخ داده است. یعنی از HEAD تا good-commit اما اگر باگ رفع شده بود، می فهمیم که باگ در نیمه دوم کامیت ها بوجود آمده است. یعنی بین HEAD و bad-commit
حالا در این مثال ما فرض می کنیم باگ در نیمه بالایی کامیت ها رخ داده است. پس نقطه فعلی HEAD را بعنوان یک good commit تعریف می کنیم. دستور زیر را اجرا کنید:
git bisect good
حال اگر دستور git log –oneline –all را مجددا اجرا کنیم تصویر زیر را خواهیم داشت:
مشاهده می شود که نشانگر HEAD به مرکز نیمه دوم کامیت ها اشاره می کند. در این مرحله مجددا اپلیکیشن را اجرا و تست می کنیم. اگر هنوز باگ وجود داشت می فهمیم در نیمه ابتدایی کامیت ها خطا رخ داده و بالعکس. یعنی اگر خطایی ندیدیم، می فهمیم که باگ در نیمه دوم کامیت ها رخ داده است.
همین رویه را آنقدر ادامه می دهیم تا به کامیتی که منجر به بروز خطا در برنامه شده برسیم. در انتها برای اینکه HEAD مجددا به master اشاره کند، دستور git checkout master را اجرا کنید.
مشاهده لیست افراد مشارکت کننده در پروژه:
برای اینکه بفهمیم چه افرادی در توسعه پروژه ما مشارکت کرده اند دستور git shortlog را داریم. می توان با استفاده از n- در انتهای این دستور، لیست افراد را بر اساس تعداد کامیت های آنها مرتب سازی کرد. همچنین می توان توسط e- ایمیل افراد را مشاهده کرد.
مشاهده تغییرات یک فایل در تمام کامیت ها:
برای اینکه ببینیم یک فایل در کدام کامیت ها تغییر کرده و همچنین در هر کامیت چه تغییری رخ داده دستور زیر را اجرا کنید:
git log --oneline --stat toc.txt
در تصویر فوق مشاهده می کنیم که فایل toc.txt در آخرین کامیت، یک insertion و یک deletion دارد.
مشاهده دقیق تغییرات در یک فایل مشخص:
اما برای اینکه ببینیم دقیقا چه تغییراتی در هر کامیت روی فایل موردنظرمان اعمال شده، در دستور فوق بجای stat– باید patch– را تعریف کنیم.
git log --oneline --patch toc.txt
نمایش لیست افرادی که لاین های مشخصی از یک فایل را تغییر داده اند:
فرض کنید در فایل audience.txt یک خطایی رخ داده و می خواهید بفهمید کدامیک از اعضای تیم روی این فایل کار کرده اند و آن خط از فایل را تغییر داده اند. دستور blame به ما کمک می کند:
git blame audience.txt
اگر بخواهیم آدرس ایمیل افراد لیست شود دستور git blame -e audience.txt را اجرا کنید.
ممکن است فایل موردنظر ما لاین های زیادی داشته باشد و ما فقط بخواهیم لاین های یک بازه مشخص را مشاهده کنیم. دستور زیر به ما کمک می کند:
git blame -e -L 1,3 audience.txt
دستور فوق ایمیل افرادی که روی لاین های 1 تا 3 از فایل audience.txt تغییر داده اند را نمایش می دهد.
برچسب گذاری روی commit ها:
در گیت این امکان وجود دارد که روی کامیت موردنظرمان برچسب گذاری کنیم و از این به بعد آن کامیت را به این نام بشناسیم. بجای اینکه از آیدی کامیت استفاده کنیم.
در تصویر زیر لیست یک خطی کامیت ها را می بینیم:
فرض کنید می خواهیم کامیت دوم از بالا را برچسب گذاری کنیم. دستور زیر را داریم:
git tag v1.0 50db987
حال اگر دوباره لاگ بگیریم خواهیم داشت:
از این پس می توانیم با تگ تعریف شده کار کنیم. یعنی اگر بخواهیم به این کامیت checkout کنیم کافیست بنویسیم git checkout v1.0
به همین راحتی!
برای مشاهده تمام تگ های تعریف شده دستور git tag را اجرا کنید. برای حذف یک تگ می توان دستور git tag -d v1.0 را اجرا کرد.
کار با افزونه GitLens در ویژوال استودیو کد:
نرم افزار ویژوال استودیو را باز کرده و در بخش extension ها (کلید میانبر Ctrl+Shift+X) کلمه Gitlens را سرچ و install کنید.
مشاهده می کنید که افزونه گیت لنز بسیار محبوب است و بیش از 9 میلیون بار در VScode نصب شده است.
فولدر پروژه Venus را در vscode باز کنید.
یک آیکون در سایدبار سمت چپ درج می شود که مربوط به گیت لنز است. در منوی COMMITS می توان لیست تمام کامیت ها را مشاهده کرد:
نکته: محیط های گرافیکی (GUI) برای کار با گیت مانند GitLens و GitKraken محدودیت هایی دارند. بیشترین استفاده ای که می توان از این ابزارها داشت مشاهده و مقایسه تغییرات فایل ها یا Diff می باشد. زیرا بصورت گرافیکی و با رنگ های سبز و قرمز نمایش می دهد و کاربرپسند است.
در جلسه چهارم، درباره شاخه یا Branch در گیت صحبت می کنیم. همراه ما باشید…!
دیدگاهتان را بنویسید