سرفصل‌های آموزشی
آموزش کاربردی گیت برای برنامه نویسان
نظارت بر مخزن

نظارت بر مخزن

دستور git status:

دستور git status وضعیت حال حاضر مربوط به دایرکتوری ای که در حال کار روی آن هستیم و وضعیت stage را به ما نشان می‌دهد. این دستور تغییراتی را که در stage قرار گرفته اند، تغییراتی که در stage قرار نگرفته اند و فایل هایی که توسط git تحت نظارت قرار نگرفته اند نشان می‌دهد. این دستور هیچ اطلاعاتی راجع به تاریخچه ی commit های پروژه در اختیار شما نمی‌گذارد. برای دیدن تاریخچه ی commit ها، می‌توانید از دستور git log استفاده کنید.

دستورهای مرتبط:

دستور git tag:

برچسب (tag) ها مراجعی هستند که به یک نقطه ی مشخص در تاریخچه ی گیت اشاره می‌کنند. دستور git tag معمولا برای دریافت یک نقطه ی مشخص در تاریخچه، که به نسخه ی مشخص شده ای اشاره می‌کند، استفاده می‌شود.

دستور git blame:

وظیفه ی سطح بالای دستور git blame نمایش دادن اطلاعات اضافه (metadata) ای است که نویسنده به بخشی از کد های commit شده چسبانده است. این دستور برای نمایش تاریخچه ی قطعه ای از کد استفاده می‌شود و به ما می‌گوید که این چه کدی، چه زمانی و چرا به مخزن اضافه شده است.

دستور git log:

دستور git log برای نمایش commit ها استفاده می‌شود. این دستور به شما اجازه می‌دهد تاریخچه ی یک پروژه را نمایش دهید، فیلتر کنید یا برای یافتن commit خاصی جست و جو کنید.

روش استفاده:

برای نمایش لیست فایل هایی داخل stage و لیست فایل های خارج از stage و لیست فایل هایی که توسط گیت مورد نظارت نیستند، دستور زیر را در محیط خط فرمان وارد کنید:

git status

بررسی دستور git status

دستور git status به نوعی دستور ساده ای است. به طور کلی به شما نشان می‌دهد که با اجرای دستورهای git add و git commit چه تغییری در وضعیت فایل ها ایجاد شده است. همچنین پیام های این دستور، آیین نامه هایی را برای مواجهه با فایل هایی که در stage قرار دارند و فایل هایی که در stage قرار ندارند، در اختیارتان قرار می‌دهد. در ادامه نمونه ی سه نوع خروجی این دستور را می‌بینیم:

# On branch master

# Changes to be committed:
# (use "git reset HEAD <file>..."
 to unstage)

#
#modified: hello.py
#
# Changes not staged for commit:
# (use "git add <file>..."
 to update what will be committed)

# (use "git checkout -- <file>..."
 to discard changes 
in
 working directory)

#
#modified: main.py
#
# Untracked files:
# (use "git add <file>..."
 to include 
in
 what will be committed)

#
#hello.pyc

نادیده گرفتن فایل ها:

فایل هایی که توسط گیت مورد نظارت نیستند، به طور کلی به دو دسته تقسیم می‌شوند، یا شما به تازگی این فایل ها را به پروژه خود اضافه کرده اید و هنوز آن ها را توسعه نداده اید و commit نکرده اید، یا فایل های کامپایل شده ی باینری مثل .pvc و .obj و .exe و ... . همان طور که مشخص است، داشتن لیست فایل های گروه اول در لیست git status برای ما مفید و گاهی حیاتی است، اما داشتن فایل های دسته دوم در بیشتر اوقات اضافی است و فهم این که دقیقا چه فایل هایی در مخزن ما هستند و هر کدام در چه وضعیتی قرار دارند را برای ما سخت می‌کنند. 

به همین دلیل، گیت به شما این اجازه را می‌دهد که با قرار دادن آدرس هر فایلی در یک فایل به خصوص به نام .gitignore آن را به طور کامل نادیده بگیرید. هر فایلی که شما می‌خواهید نادیده بگیرید، باید در خط جدا نوشته شوند و از نماد * می‌توانید استفاده کنید تا به تمام فایل هایی که ویژگی مورد نظرتان را دارند، اشاره کنید. برای مثال اضافه کردن خط زیر در فایل .gitignore تان باعث می‌شود، گیت تمام فایل های کامپایل شده‌ی پایتون را نادیده بگیرد.

*.pyc

مثال:

یک تمرین خوب این است که همیشه status مخزن خود را قبل از commit کردن، بررسی کنید، بدین ترتیب هیچ وقت فایلی را به اشتباه commit نمی‌کنید. مثال زیر، وضعیت یک مخزن را قبل و بعد از قرار دادن یک فایل در مخزن و commit کردن نشان می‌دهد:

# Edit hello.py
git status

# hello.py is listed under "Changes not staged for commit"

git add hello.py
git status

# hello.py is listed under "Changes to be committed"

git commit
git status

# nothing to commit (working directory clean)

خروجی اولین دستور status، می‌گوید که فایل در stage قرار ندارد و در صورت commit کردن، این فایل commit نمی‌شود. تغییر حاصل در خروجی دومین دستور status حاصل از اجرای دستور add است که نشان می‎دهد که فایل ما در stage قرار دارد و آماده ی commit است. خروجی دستور status سوم به ما می‎گوید که هیچ فایلی برای commit وجود ندارد که به این معنی است که  وضعیت پروژه نسبت به آخرین commit تغییری نداشته است. برخی دستورهای گیت (مثل git merge) نیاز دارند که همه تغییرات پروژه ای که روی آن کار می‎کنیم، commit شده باشد، تا شما به ناخوداگاه تغییرات انجام شده را از بین نبرید. 

دستور git log: 

دستور git log وضعیت های commit شده را نشان می‎دهد. این دستور به شما اجازه می‌دهد که تاریخچه ی پروژه یتان را لیست کنید، آن را فیلتر کنید یا تغییرات خاصی را جست و جو کنید. در حالی که git status به شما اجازه می‌دهد تا مسیر جاری ای که روی آن کار می‌کنید و stage گیت را بررسی کنید، دستور git log فقط با تاریخچه ی commit های پروژه کار می‌کند.

خروجی دستور log می‎تواند به چندین و چند روش شخصی سازی شود، از فیلتر ساده تا نمایش commit ها به صورت کاملا شخصی سازی شده. بعضی از پر استفاده ترین تنظیمات و حالت های استفاده از git log در زیر آماده است.

کاربرد  git log :

git log

این دستور تمام تاریخچه ی commit های پروژه را با فرمت پیش فرض نشان می‌دهد. اگر لیست خروجی فضایی بیشتر از یک صفحه را در بر بگیرد، می توانید با زدن space به صفحه ی بعدی بروید و با فشردن q از حالت نمایش خارج شوید. 

git log -n <limit>

این دستور تعداد commit های نمایش داده شده را محدود می‌کند. برای مثال دستور git log -n 3 فقط 3 commit آخر را نشان می‌دهد.

git log --oneline

این دستور اطلاعات هر commit را در یک خط فشرده می‎کند. این دستور برای مواردی کاربرد دارد که بخواهیم یک دید کلی نسبت به commit های پروژه داشته باشیم.

git log --stat

این دستور افزون بر اطلاعات معمول git log، آمار مربوط به فایل هایی که تغییر کرده اند و تعداد خطوط کد اضافه یا کم شده در هر commit را نشان می‌دهد.

git log -p

این دستور تغییرات هر commit را به همراه بخش هایی که حذف یا اضافه شده است را به تفکیک نمایش می‌دهد. اطلاعات ارائه شده توسط این دستور به نوعی کامل ترین تصویری است که شما می‌توانید از تاریخچه ی پروژه خود داشته باشید.

git log --author="<pattern>"

این دستور commit هایی را به ما نشان می‌دهد که نویسنده ی آن ها الگوی خاصی را داشته باشند. این الگو می تواند یک متن ساده باشد یا یک Regex (Regular Expression). 

git log --grep="<pattern>"

این دستور commit ها را بر اساس الگوی خاصی در پیام commit (Commit Message) فیلتر می‌کند. همانند دستور قبل در این جا هم الگو می‌تواند یک متن ساده یا یک Regex باشد.

git log <since>..<until>

این دستور تنها commit هایی که دربازه ی <since> تا <until> قرار دارند را نشان می‌دهد. هر دوی این دو مقدار می‌تواند مواردی مثل commit ID، نام شاخه (branch Name) یا هر نوع فیلتر دیگری باشد.

git log <file>

این دستور لیست commit هایی را به ما نشان می‌دهد که شامل فایل ذکر شده باشند. این روشی سریع و ساده برای دیدن تاریخچه ی مربوط به یک فایل است.

git log --graph --decorate --oneline

این هم دستوری جدید است. عبارت graph-- افزون بر لیست commit های پروژه، در کنار آن ها، نموداری از commit ها نمایش می‌دهد. عبارت decorate-- نام شاخه ها و برچسب های مربوط به commit ها را هم نمایش می‌دهد. عبارت oneline-- اطلاعات و پیام های commit ها را در یک خط نشان می‌دهد که باعث می‌شود مرور commit ها با یک نگاه راحت تر صورت بگیرد.

بررسی git log:

دستور git log، یکی از ابزار های پایه ای گیت برای مرور و مشاهده ی تاریخچه ی مخازن است. ابزاری است که با استفاده از آن می‌توانید نسخه ی خاصی از پروژه تان را بیابید یا متوجه شوید که با merge کردن شاخه ی feature، چه ویژگی هایی به پروژه اضافه می‌شود. 

commit 3157ee3718e180a9476bf2e5cab8e3f1e78a73b7
Author: John Smith

بیشتر اطلاعات نمایش داده شد با اجرای دستور git log روشن هستند و نیازی به توضیح ندارند، با این حال خط اول به توضیح اضافه تری نیاز دارد. عبارت 40 کاراکتری بعد از commit، یک SHA-1 از  checksum (مجموع مقابله ای) مربوط به اطلاعات commit است. این داده به دو دلیل نگه داری می شود. در درجه ی اول اصالت commit تایید می‌شود، چرا که اگر commit دست کاری شود یا به هر دلیلی تغییر پیدا کند، این عبارت تغییر خواهد کرد. در درجه ی دوم این عبارت به عنوان یک ID برای commit عمل می کند. 

از این ID می‌توان در دستورهایی مانند git log برای پیدا کردن یک commit خاص استفاده کرد. برای مثال دستور git log 3157e..5ab91 تمامی commit های بین دو commit با ID های داده شده را نمایش می‌دهد. به جز مجموع های مقابله ای، می توان از نام شاخه ها و HEAD ها برای اشاره به یکی از آن ها استفاده کرد. HEAD همیشه به آخرین commit در شاخه ای که گیت در حال حاضر در حال کار روی آن است اشاره می‌کند.

عبارت ~ هم برای جست و جو نسبت به پدر commit، مورد استفاده قرار می‌گیرد. برای مثال 3157e~1 به commit قبل از commit با ID 3157e اشاره می‌کند، یا HEAD~3 به پدرِ پدر بزرگ آخرین commit این شاخه اشاره می‌کند (به سه commit قبل روی شاخه ای که آخرین commit را روی آن زده اید).

هدف این شناسایی ها و فیلتر کردن ها، کمک به شما برای انجام عملیات بر اساس یک commit خاص است. به طور معمول دستور git log نقطه ی شروع ما برای کار با دسته ای از commit ها است چرا که به ما کمک می کند بتوانیم commit یا commit های مورد نظرمان را بیابیم. 

مثال:

 در قسمت کاربرد مثال های متعددی راجع به دستور git log را مشاهده کردیم، اما در پس ذهنتان این را به یاد داشته باشید که هر دسته بندی از این ویژگی ها و فیلتر ها را می توان با هم به کار برد:

git log --author="John Smith" -p hello.py

این دستور لیست تمام تغییراتی که آقای John Smith در فایل hello.py اعمال کرده است را با جزئیات به ما نشان می‎ دهد. 

همچنین شیوه نامه می‌تواند ابزار بسیار کارآمدی باشد برای مقایسه ی شاخه های مختلف. مثال زیر خلاصه ای کوتاه از تمام commit هایی به ما نشان می‌دهد که در شاخه ی some-feature هستند اما در شاخه ی master نیستند.

git log --oneline master..some-feature 
online-support-icon