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

Git Blame

دستور git blame یک ابزار عیب یابی همه کاره است که کاربرد های زیادی دارد. عملکرد سطح بالای git blame، نمایش meta data ی نویسنده ی هر خط از کد های Commit شده در یک فایل است. این دستور برای بررسی یک نقطه مشخص در تاریخچه ی یک فایل و همچنین به دست آوردن آخرین نویسنده ای که خطی را اصلاح کرده است، استفاده می شود. ناگفته نماند که برای پیگیری و بررسی تاریخچه ی یک کد خاص و پاسخ دادن به سوالاتی مانند اینکه چه کدی، چطور و چرا به مخزن اضافه شده است، استفاده می شود.

Git blame اغلب با یک رابط گرافیکی استفاده می شود. سایت های میزبانی آنلاین Git مانند Bitbucket یک blame view ارائه می کنند که یک نمایش گرافیکی از wrappers برای git blame هستند. در بحث های مشارکتی در مورد درخواست های Pull و Commit ها، به این دیدگاه ها اشاره شده است. افزون بر این، بیشتر IDE هایی که دارای افزونه Git هستند نیز blame view پویا دارند.

Git Blame چگونه کار می کند. 

برای نشان دادن روش کار git blame، ما به یک مخزن با تاریخچه، نیاز داریم. برای همین ما از پروژه ی منبع باز git-blame-example استفاده خواهیم کرد. این پروژه ی منبع باز، یک مخزن ساده است که شامل یک فایل README.md است و چندین Commit از نویسندگان مختلف دارد. قدم اول برای استفاده از git blame، این است که مخزن را clone کنیم. برای این کار از دستور git clone استفاده می کنیم. 

git clone https://kevzettler@bitbucket.org/kevzettler/git-blame-example.git && cd git-blame-example 

اکنون که ما یک کپی از کد مثال داریم، می توانیم کاوش در آن را با git blame شروع کنیم. با استفاده از git log می توان وضعیت مخزن نمونه را بررسی کرد. بعد از اجرای این دستور، برای خارج شدن از آن باید کلید q را فشار داد. تاریخچه ی Commit باید به شرح زیر باشد: 


$ git log
    commit 548dabed82e4e5f3734c219d5a742b1c259926b2
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:55:15 2018 +0000

        Another commit to help git blame track the who, the what, and the when

    commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:53:23 2018 +0000

        Creating the third commit, along with Kev and Albert, so that Kev can get git blame docs.

    commit 990c2b6a84464fee153253dbf02e845a4db372bb
    Merge: 82496ea 89feb84
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 05:33:01 2018 +0000

        Merged in albert-so/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)

        README.md edited online with Bitbucket

    commit 89feb84d885fe33d1182f2112885c2a64a4206ec
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 00:54:03 2018 +0000

        README.md edited online with Bitbucket

Git blame، فقط روی تک فایل ها کار می کند. برای گرفتن یک خروجی مفید، مشخص کردن مسیر یک فایل لازم است. اجرای git blame به صورت پیش فرض راهنمای استفاده از این دستور را نشان می دهد. برای این مثال، ما روی پرونده README.md کار خواهیم کرد. این یک نرم افزار منبع باز رایج هست که شامل یک فایل README در ریشه ی یک مخزن git، به عنوان منبع مستندها برای پروژه است. 

git blame README.md

اجرای دستور بالا، اولین مثال از خروجی blame را به ما می دهد. خروجی زیر، یک زیر مجموعه از خروجی blame کامل برای فایل README است. افزون بر این، این خروجی به صورت Static است و وضعیت مخزن در زمان نوشتن این مقاله را منعکس می کند. 

$ git blame README.md
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  1) # Git Blame example
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  2)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  3) This repository is an example of a project with multiple contributors making commits.
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  4)
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  5) The repo use used elsewhere to demonstrate `git blame`
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  6)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  7) Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod TEMPOR incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  8)
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000  9) Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 10)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 11) Creating a line to support documentation needs for git blame.
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 12)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 13) Also, it is important to have a few of these commits to clearly reflect the who, the what and the when. This will help Kev get good screenshots when he runs the git blame on this README.

محتوای نوشته شده در بالا، نمونه ای از 13 خط اول فایل README.md است. برای درک بهتر این خروجی، اجازه دهید تا یک خط را بشکنیم. جدول زیر محتوای خط 3 را به صورت تفکیک شده در چند ستون، نشان می دهد. 

Id 

نویسنده 

زمان (Timestamp)

شماره خط 

محتوای خط 

89feb84d

Albert So

2018-03-01 00:54:03 +0000

3

این مخزن، نمونه ای از پروژه است که چندین مشارکت کننده در آن Commit می کنند.

 

اگر لیست خروجی blame را مرور کنیم، می توانیم مواردی را مشاهده کنیم. از سه نویسنده نام برده شده است. افزون بر نگه دارنده ی پروژه، Kev Zettler، Albert So و Juni Mukherjee نیز بیان شده اند. نویسندگان به طور کلی با ارزش ترین قسمت در خروجی git blame هستند. ستون زمان نیز داده ی مهمی را نگهداری می کند. آنچه تغییر کرده در ستون محتوای خط، نشان داده شده است. 

گزینه های رایج 

git blame -L 1,5 README.md 

گزینه ی –L خروجی را به محدوده ی خط درخواستی، محدود می کند. در اینجا ما خروجی را به خط های 1 تا 5 محدود کرده ایم.

git blame -e README.md 

گزینه ی –e به جای نام کاربری، آدرس ایمیل نویسندگان را نشان می دهد.

git blame -w README.md 

گزینه ی –w تغییرهای فضای خالی (whitespace) را نادیده می گیرد. اگر نویسنده ی قبلی با تغییر از tabs به فاصله ها (spaces) یا افزودن خط های جدید، فاصله گذاری یک فایل را تغییر داده باشد، متاسفانه، با نشان دادن این تغییرها، نتیجه ی git blame را نامفهوم می کند.

git blame -M README.md 

گزینه ی –M خط های منتقل یا کپی شده را در همان فایل، شناسایی می کند. این کار، نویسنده ی اصلی خط ها را به جای آخرین نویسنده ای که آن ها را منتقل یا کپی کرده است، گزارش می کند. 

git blame -C README.md 

گزینه ی –C خط هایی را که از فایل های دیگر منتقل یا کپی شده اند، شناسایی می کند. این کار، نویسنده ی اصلی خط ها را به جای آخرین نویسنده ای که آن ها را منتقل یا کپی کرده است، گزارش می کند. 

 

Git Blame در مقابل Git Log

در حالی که git blame آخرین نویسنده ای را نشان می دهد که خطی را اصلاح کرده است، اما اغلب اوقات در ابتدا می خواهید بدانید که یک خط اضافه شده است یا خیر. برای دستیابی به این موارد، استفاده از git blame می تواند دست و پا گیر باشد چون به ترکیبی از گزینه های  -w, -C و –M  نیاز دارد. اما استفاده از دستور git log بسیار راحت تر است. 

برای لیست کردن همه ی Commit های اصلی که در آن ها یک قطعه کد خاص اضافه یا اصلاح شده، دستور git log را با گزینه ی –S اجرا کنید. گزینه ی –S را با کدی که می خواهید، اضافه کنید. بیایید یکی از خط ها را از خروجی README در بالا بگیریم تا برای مثال استفاده کنیم. اجازه دهید متن "CSS3D and WebGL renderers" را از خط 12 خروجی README بگیریم. 

$ git log -S"CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s' e339d3c85 Mario Schuettel Tue Oct 13 16:51:06 2015 +0200 reverted README.md to original content 509c2cc35 Daniel Tue Sep 8 13:56:14 2015 +0200 Updated README cb20237cc Mr.doob Mon Dec 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant. 

این خروجی به ما نشان می دهد که 3 نویسنده مختلف 3 بار، محتوای README را اضافه یا اصلاح کرده اند. در اصل شخصی به نام Mr.doob در Commit شماره cb20237cc، آن را اضافه کرده است. در این مثال، گزینه ی –pretty-format نیز به git log اضافه شده است. این گزینه قالب خروجی پیش فرض git log را به فرمی که با git log مطابقت دارد، تبدیل می کند. برای کسب اطلاعات بیشتر در مورد گزینه های استفاده و پیکربندی، از صفحه ی git log بازدید کنید. 

خلاصه

از دستور git blame، برای بررسی محتویات خط به خط یک فایل و بررسی این که آخرین بار چه خطی اصلاح شده و نویسنده ی تغییر ها چه کسی است، استفاده می شود. فرمت خروجی git blame را می توان با گزینه های مختلف خط فرمان، تغییر داد. سایت های میزبانی آنلاین Git مانند Bitbucket، blame view را در بر دارند، که تجربه ی کاربری بهتری نسبت به استفاده از git blame در خط فرمان، ارائه می دهد. Git blame و git log می توانند به صورت ترکیبی، برای کمک به کشف تاریخچه ی محتوای یک فایل، استفاده شوند. دستور git log دارای برخی از قابلیت های مشابه blame است، برای کسب اطلاعات بیشتر به صفحه ی مرور git log مراجعه کنید. 

online-support-icon