| GIT-BLAME(1) | Git Manual | GIT-BLAME(1) |
نام (NAME)
git-blame - نمایش اینکه کدام ویرایش و نویسنده آخرین بار هر سطر از یک فایل را تغییر داده است
خلاصه دستور (SYNOPSIS)
git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
[-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>]
[--ignore-rev <rev>] [--ignore-revs-file <file>]
[--color-lines] [--color-by-age] [--progress] [--abbrev=<n>]
[ --contents <file> ] [<rev> | --reverse <rev>..<rev>] [--] <file>
توضیحات (DESCRIPTION)
هر سطر در فایل دادهشده را با اطلاعات مربوط به ویرایشی که آخرین بار آن سطر را تغییر داده است، حاشیهنویسی میکند. همچنین به صورت اختیاری میتواند حاشیهنویسی را از ویرایش مشخصشده آغاز کند.
هنگامی که یک یا چند بار مشخص شود، گزینه -L حاشیهنویسی را به سطرهای درخواستی محدود میکند.
مبدأ سطرها در تغییر نامهای کامل فایل به طور خودکار دنبال میشود (در حال حاضر گزینهای برای خاموش کردن دنبال کردن تغییر نام وجود ندارد). برای دنبال کردن سطرهایی که از یک فایل به فایل دیگر منتقل شدهاند، یا سطرهایی که از فایلی دیگر کپی و چسبانده شدهاند و غیره، گزینههای -C و -M را ببینید.
گزارش چیزی درباره سطرهایی که حذف شده یا جایگزین شدهاند به شما نمیگوید؛ لازم است از ابزاری مانند git diff یا رابط «pickaxe» که به اختصار در بند بعدی آمده است استفاده کنید.
جدا از پشتیبانی حاشیهنویسی فایل، گیت همچنین از جستجو در تاریخچه توسعه برای یافتن زمانی که یک قطعه کد در یک تغییر رخ داده است، پشتیبانی میکند. این امر امکان ردیابی زمان اضافه شدن یک قطعه کد به یک فایل، جابجایی یا کپی شدن آن میان فایلها، و در نهایت حذف یا جایگزین شدن آن را فراهم میسازد. این کار با جستجوی یک رشته متنی در diff انجام میشود. یک مثال کوچک از رابط pickaxe که به دنبال blame_usage میگردد:
$ git log --pretty=oneline -S'blame_usage' 5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file> ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output
گزینهها (OPTIONS)
-b
--root
--show-stats
-L <start>,<end>, -L :<funcname>
<start> و <end> اختیاری هستند. -L <start> یا -L <start>, از <start> تا انتهای فایل را در بر میگیرد. -L ,<end> از ابتدای فایل تا <end> را در بر میگیرد.
<start> و <end> میتوانند یکی از این قالبها را داشته باشند:
اگر <start> یا <end> یک عدد باشد، شماره خط مطلق را مشخص میکند (شمارش خطوط از ۱ آغاز میشود).
این قالب از اولین خطی که با <regex> دادهشده بر اساس POSIX مطابقت داشته باشد استفاده میکند. اگر <start> یک عبارت باقاعده باشد، از انتهای محدوده -L قبلی (در صورت وجود)، وگرنه از ابتدای فایل جستجو خواهد کرد. اگر <start> به صورت ^/<regex>/ باشد، از ابتدای فایل جستجو خواهد کرد. اگر <end> یک عبارت باقاعده باشد، جستجو را از خط مشخصشده توسط <start> آغاز میکند.
این حالت فقط برای <end> معتبر است و تعدادی خط قبل یا بعد از خط مشخصشده توسط <start> را تعیین میکند.
اگر :<funcname> به جای <start> و <end> داده شود، یک عبارت باقاعده است که محدوده را از اولین خط funcname که با <funcname> مطابقت دارد تا خط funcname بعدی نشان میدهد. :<funcname> از انتهای محدوده -L قبلی (در صورت وجود)، وگرنه از ابتدای فایل جستجو میکند. ^:<funcname> از ابتدای فایل جستجو میکند. نامهای توابع به همان شیوهای تعیین میشوند که git diff هدرهای قطعه پچ (patch hunk headers) را محاسبه میکند (بخش Defining a custom hunk-header در gitattributes(5) را ببینید).
-l
-t
-S <revs-file>
--reverse <start>..<end>
--first-parent
-p, --porcelain
--line-porcelain
--incremental
--encoding=<encoding>
--contents <file>
--date <format>
--progress, --no-progress
-M[<num>]
<num> اختیاری است، اما کران پایینی برای تعداد نویسههای الفبایی-عددی است که گیت باید به عنوان جابجایی/کپی در یک فایل تشخیص دهد تا آن سطرها را به کامیت والد مرتبط سازد. مقدار پیشفرض ۲۰ است.
-C[<num>]
<num> اختیاری است، اما کران پایینی برای تعداد نویسههای الفبایی-عددی است که گیت باید به عنوان جابجایی/کپی میان فایلها تشخیص دهد تا آن سطرها را به کامیت والد مرتبط سازد. و مقدار پیشفرض ۴۰ است. اگر بیش از یک گزینه -C داده شده باشد، آرگومان <num> آخرین -C اعمال خواهد شد.
--ignore-rev <rev>
--ignore-revs-file <file>
--color-lines
--color-by-age
-h
-c
--score-debug
-f, --show-name
-n, --show-number
-s
-e, --show-email
-w
--diff-algorithm=(patience|minimal|histogram|myers)
default, myers
minimal
patience
histogram
به عنوان مثال، اگر متغیر diff.algorithm را روی مقداری غیر از پیشفرض تنظیم کردهاید و میخواهید از مقدار پیشفرض استفاده کنید، باید از گزینه --diff-algorithm=default استفاده نمایید.
--abbrev=<n>
قالب پیشفرض (THE DEFAULT FORMAT)
هنگامی که هیچیک از گزینههای --porcelain یا --incremental مشخص نشده باشند، git blame حاشیهنویسی هر سطر را با موارد زیر خروجی میدهد:
پیش از محتویات سطر.
قالب پورسلین (THE PORCELAIN FORMAT)
در این قالب، هر سطر پس از یک هدر خروجی داده میشود؛ این هدر حداقل دارای خط اولی است که شامل موارد زیر است:
این خط هدر، حداقل یک بار برای هر کامیت با اطلاعات زیر دنبال میشود:
محتویات سطر واقعی پس از هدر بالا خروجی داده میشوند، که پیشوند آن یک نویسه TAB است. این کار به منظور امکان افزودن عناصر بیشتر به هدر در آینده است.
قالب پورسلین به طور کلی اطلاعات کامیتی را که قبلاً دیده شده است حذف میکند. برای مثال، دو سطر که به یک کامیت منتسب شدهاند هر دو نشان داده خواهند شد، اما جزئیات مربوط به آن کامیت فقط یک بار نشان داده میشود. اطلاعاتی که مختص سطرهای منفرد هستند با یکدیگر گروهبندی نخواهند شد، مانند ویرایشهایی که قرار است به صورت ignored یا unblamable علامتگذاری شوند. این روش کارآمدتر است، اما ممکن است نیاز داشته باشد که وضعیت بیشتری توسط خواننده برنامه نگهداری شود. از گزینه --line-porcelain میتوان برای خروجی دادن اطلاعات کامل کامیت برای هر سطر استفاده کرد، که امکان استفاده سادهتر (اما با کارایی کمتر) مانند زیر را فراهم میآورد:
# شمارش تعداد سطرهای منتسب به هر نویسنده git blame --line-porcelain file | sed -n 's/^author //p' | sort | uniq -c | sort -rn
مشخص کردن محدودهها (SPECIFYING RANGES)
برخلاف git blame و git annotate در نسخههای قدیمیتر گیت، دامنه حاشیهنویسی میتواند هم به محدودههای سطری و هم به محدودههای ویرایشی محدود شود. گزینه -L که حاشیهنویسی را به محدودهای از سطرها محدود میکند، میتواند چندین بار مشخص شود.
هنگامی که علاقهمند به یافتن مبدأ سطرهای ۴۰-۶۰ برای فایل foo هستید، میتوانید از گزینه -L مانند زیر استفاده کنید (هر دو به یک معنا هستند — هر دو ۲۱ سطر را با شروع از سطر ۴۰ درخواست میکنند):
git blame -L 40,60 foo git blame -L 40,+21 foo
همچنین میتوانید از یک عبارت باقاعده برای تعیین محدوده سطر استفاده کنید:
git blame -L '/^sub hello {/,/^}$/' foo
که حاشیهنویسی را به بدنه زیرروال hello محدود میکند.
هنگامی که به تغییرات قدیمیتر از نسخه v2.6.18 یا تغییرات قدیمیتر از ۳ هفته علاقهمند نیستید، میتوانید از مشخصکنندههای محدوده ویرایش مشابه با git rev-list استفاده کنید:
git blame v2.6.18.. -- foo git blame --since=3.weeks -- foo
هنگامی که از مشخصکنندههای محدوده ویرایش برای محدود کردن حاشیهنویسی استفاده میشود، سطرهایی که از مرز محدوده تغییر نکردهاند (چه کامیت v2.6.18 و چه جدیدترین کامیتی که بیش از ۳ هفته قدمت دارد در مثال بالا) به همان کامیت مرز محدوده نسبت داده میشوند.
یک روش به ویژه مفید، بررسی این است که آیا یک فایل اضافهشده دارای سطرهایی است که با کپی و چسباندن از فایلهای موجود ایجاد شدهاند یا خیر. گاهی اوقات این نشان میدهد که توسعهدهنده بیدقت بوده و کد را به درستی بازآفرینی (refactor) نکرده است. ابتدا میتوانید کامیتی را که فایل را معرفی کرده است پیدا کنید:
git log --diff-filter=A --pretty=short -- foo
و سپس با استفاده از نشانهگذاری commit^!، تغییر میان کامیت و والدین آن را حاشیهنویسی کنید:
git blame -C -C -f $commit^! -- foo
خروجی افزایشی (INCREMENTAL OUTPUT)
هنگامی که با گزینه --incremental فراخوانی شود، دستور نتیجه را همانطور که ساخته میشود در خروجی قرار میدهد. خروجی معمولاً ابتدا درباره سطرهایی صحبت میکند که توسط کامیتهای جدیدتر دستکاری شدهاند (یعنی سطرها بدون ترتیب حاشیهنویسی میشوند) و برای استفاده توسط نمایشگرهای تعاملی در نظر گرفته شده است.
قالب خروجی شبیه به قالب پورسلین است، اما شامل سطرهای واقعی فایل که در حال حاشیهنویسی است نمیشود.
<40-byte-hex-sha1> <sourceline> <resultline> <num-lines>
شماره سطرها از ۱ آغاز میشوند.
filename <whitespace-quoted-filename-goes-here>
و بنابراین تجزیه آن برای یک تجزیهکننده مبتنی بر خط و کلمه واقعاً بسیار ساده است (که برای اکثر زبانهای اسکریپتنویسی بسیار طبیعی است).
یادداشت
برای کسانی که عمل تجزیه (parsing) را انجام میدهند: جهت مقاومتر ساختن آن، کافی است هر خطی را میان خط اول و آخر (خطوط <40-byte-hex-sha1> و filename) که کلمات برچسب ابتدای خطوط «اطلاعات گسترده» آن را نمیشناسید (یا به آن مورد خاص اهمیتی نمیدهید) نادیده بگیرید. به این ترتیب، اگر اطلاعات جدیدی اضافه شود (مانند کدگذاری کامیت یا توضیحات گسترده کامیت)، نمایشگر blame با مشکلی مواجه نخواهد شد.
نگاشت نویسندگان (MAPPING AUTHORS)
gitmailmap(5) را ببینید.
پیکربندی (CONFIGURATION)
تمام موارد زیر این خط در این بخش به طور انتخابی از مستندات git-config(1) آورده شده است. محتوا همان چیزی است که در آنجا یافت میشود:
blame.blankBoundary
blame.coloring
blame.date
blame.showEmail
blame.showRoot
blame.ignoreRevsFile
blame.markUnblamableLines
blame.markIgnoredLines
همچنین ببینید (SEE ALSO)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |