| GIT-REV-LIST(1) | دستورات عمومی کاربر | GIT-REV-LIST(1) |
نام (NAME)
git-rev-list - فهرست کردن اشیاء کامیت به ترتیب معکوس زمانی
خلاصه دستور (SYNOPSIS)
git rev-list [<گزینهها>] <کامیت>... [--] [<مسیر>...]
توضیحات (DESCRIPTION)
کامیتهایی را که با دنبال کردن پیوندهای والد (parent) از کامیت(های) مشخصشده قابل دسترسی هستند فهرست میکند، اما کامیتهایی را که از کامیتهای مشخصشده با پیشوند ^ قابل دسترسی هستند حذف میکند. خروجی به طور پیشفرض به ترتیب معکوس زمانی ارائه میشود.
میتوانید این را مانند یک عملیات مجموعهای در نظر بگیرید. کامیتهای قابل دسترسی از هر یک از کامیتهای ارائهشده در خط فرمان یک مجموعه را تشکیل میدهند و سپس کامیتهای قابل دسترسی از هر یک از مواردی که با ^ در ابتدا مشخص شدهاند از آن مجموعه کم میشوند. کامیتهای باقیمانده مواردی هستند که در خروجی دستور ظاهر میشوند. گزینههای مختلف دیگر و پارامترهای مسیر را میتوان برای محدود کردن بیشتر نتایج استفاده کرد.
بنابراین، دستور زیر:
$ git rev-list foo bar ^baz
به این معنی است: «تمام کامیتهایی را که از foo یا bar قابل دسترسی هستند، اما از baz قابل دسترسی نیستند، فهرست کن».
یک نشانهگذاری خاص به صورت "<commit1>..<commit2>" میتواند به عنوان جایگزین خلاصه برای "^<commit1> <commit2>" استفاده شود. برای مثال، هر یک از موارد زیر را میتوان به جای یکدیگر به کار برد:
$ git rev-list origin..HEAD $ git rev-list HEAD ^origin
نشانهگذاری خاص دیگر "<commit1>...<commit2>" است که برای ادغامها کاربرد دارد. مجموعه کامیتهای حاصل، تفاضل متقارن بین دو عملوند است. دو دستور زیر معادل یکدیگر هستند:
$ git rev-list A B --not $(git merge-base --all A B) $ git rev-list A...B
دستور rev-list یک دستور پایهای گیت است، زیرا توانایی ساخت و پیمایش گرافهای اجداد کامیت را فراهم میکند. به همین دلیل، دارای گزینههای بسیار متفاوتی است که امکان استفاده از آن را برای دستوراتی به تنوع git bisect و git repack فراهم میسازد.
گزینهها (OPTIONS)
محدود کردن کامیتها (Commit Limiting)
علاوه بر مشخص کردن محدودهای از کامیتها که باید با استفاده از نمادگذاریهای ویژه توضیح دادهشده در بخش توضیحات فهرست شوند، محدودسازیهای بیشتری نیز روی کامیتها قابل اعمال است.
استفاده از گزینههای بیشتر عموماً خروجی را بیشتر محدود میکند (برای نمونه --since=<date1> نتایج را به کامیتهای جدیدتر از <date1> محدود میسازد، و استفاده از آن همراه با --grep=<pattern> نتایج را به کامیتهایی محدود میکند که پیام لاگ آنها شامل خطی منطبق با <pattern> باشد)، مگر اینکه خلاف آن ذکر شده باشد.
توجه داشته باشید که این محدودیتها پیش از گزینههای مرتبسازی و قالببندی کامیت، مانند --reverse اعمال میشوند.
-<number>, -n <number>, --max-count=<number>
--max-count-oldest=<number>
--skip=<number>
--since=<date>, --after=<date>
--since-as-filter=<date>
--until=<date>, --before=<date>
--author=<pattern>, --committer=<pattern>
--grep-reflog=<pattern>
--grep=<pattern>
هنگامی که --notes فعال باشد، پیام موجود در یادداشتها بهگونهای تطبیق داده میشود که گویی بخشی از پیام لاگ است.
--all-match
--invert-grep
-i, --regexp-ignore-case
--basic-regexp
-E, --extended-regexp
-F, --fixed-strings
-P, --perl-regexp
پشتیبانی از این نوع عبارات باقاعده یک وابستگی اختیاری در زمان کامپایل است. اگر گیت بدون پشتیبانی از آنها کامپایل شده باشد، ارائه این گزینه باعث خاتمه همراه با خطای برنامه میشود.
--remove-empty
--merges
--no-merges
--min-parents=<number>, --max-parents=<number>, --no-min-parents, --no-max-parents
گزینههای --no-min-parents و --no-max-parents این محدودیتها را دوباره (به حالت بدون محدودیت) بازنشانی میکنند. شکلهای معادل عبارتند از --min-parents=0 (هر کامیتی دارای ۰ یا چند والد است) و --max-parents=-1 (اعداد منفی نشاندهنده نبود حد بالاست).
--first-parent
این گزینه همچنین قالب تفاوت پیشفرض برای کامیتهای ادغام را به first-parent تغییر میدهد؛ برای جزئیات به --diff-merges=first-parent مراجعه کنید.
--exclude-first-parent-only
--maximal-only
--not
--all
--branches[=<pattern>]
--tags[=<pattern>]
--remotes[=<pattern>]
--glob=<glob-pattern>
--exclude=<glob-pattern>
الگوهای دادهشده هنگام اعمال روی --branches, --tags, یا --remotes نباید با refs/heads, refs/tags, یا refs/remotes آغاز شوند، و هنگام اعمال روی --glob یا --all باید حتماً با refs/ شروع شوند. اگر یک /* پایانی مد نظر باشد، باید صریحاً قید شود.
--exclude-hidden=(fetch|receive|uploadpack)
--reflog
--alternate-refs
--single-worktree
--ignore-missing
--bisect
--stdin
--cherry-mark
--cherry-pick
برای نمونه، اگر دو شاخه A و B داشته باشید، روش معمول برای فهرست کردن تمام کامیتهای موجود در یک طرف آنها استفاده از --left-right است (مثال زیر در توضیحات گزینه --left-right را ببینید). با این حال، کامیتهایی را که از شاخه دیگر دستچین (cherry-pick) شدهاند نشان میدهد (برای مثال «سومین در b» ممکن است از شاخه A دستچین شده باشد). با این گزینه، چنین جفت کامیتهایی از خروجی مستثنی میشوند.
--left-only, --right-only
برای نمونه، --cherry-pick --right-only A...B آن دسته از کامیتهای موجود در B را که در A هستند یا معادل وصلهای با یک کامیت در A میباشند حذف میکند. به عبارت دیگر، این دستور کامیتهای + را از git cherry A B فهرست میکند. بهطور دقیقتر، --cherry-pick --right-only --no-merges فهرست دقیق را ارائه میدهد.
--cherry
-g, --walk-reflogs
با قالبی از --pretty بهجز oneline و reference (به دلایل واضح)، این گزینه باعث میشود خروجی دارای دو خط اطلاعات اضافی برگرفته از رِفلاگ باشد. نشاندهنده رِفلاگ در خروجی ممکن است بهصورت ref@{<Nth>} (که در آن <Nth> اندیس معکوس زمانی در رِفلاگ است) یا بهصورت ref@{<timestamp>} (همراه با <timestamp> آن مدخل) بسته به چند قانون نمایش داده شود:
تحت --pretty=oneline, پیام کامیت با این اطلاعات در همان خط پیشوند میگیرد. این گزینه با --reverse قابل ترکیب نیست. همچنین به git-reflog(1) مراجعه کنید.
تحت --pretty=reference, این اطلاعات اصلاً نمایش داده نخواهند شد.
--merge
--boundary
سادهسازی تاریخچه (History Simplification)
گاهی اوقات شما تنها به بخشهایی از تاریخچه علاقهمندید، برای نمونه کامیتهایی که یک <path> خاص را تغییر میدهند. اما سادهسازی تاریخچه دو بخش دارد: یک بخش انتخاب کامیتها است و بخش دیگر چگونگی انجام آن، چرا که راهبردهای گوناگونی برای سادهسازی تاریخچه وجود دارد.
گزینههای زیر کامیتهای نمایشدادهشده را انتخاب میکنند:
<paths>
--simplify-by-decoration
توجه داشته باشید که ممکن است کامیتهای اضافی نیز برای ارائه یک تاریخچه معنادار نمایش داده شوند.
گزینههای زیر بر نحوه انجام سادهسازی تأثیر میگذارند:
حالت پیشفرض (Default mode)
--show-pulls
--full-history
--dense
--sparse
--simplify-merges
--ancestry-path[=<commit>]
توضیحات دقیقتر در ادامه میآید.
فرض کنید شما foo را بهعنوان <paths> مشخص کردهاید. ما کامیتهایی را که foo را تغییر میدهند !TREESAME (نایکسان از نظر درخت) و بقیه را TREESAME (یکسان از نظر درخت) مینامیم. (در یک diff فیلترشده برای foo، آنها به ترتیب متفاوت و برابر به نظر میرسند.)
در ادامه، ما همواره به همین تاریخچه نمونه برای نشان دادن تفاوتهای بین تنظیمات سادهسازی ارجاع خواهیم داد. فرض میکنیم شما در حال فیلتر کردن برای فایل foo در این گراف کامیت هستید:
.-A---M---N---O---P---Q / / / / / / I B C D E Y \ / / / / / `-------------' X
خط افقی تاریخچه A---Q بهعنوان والد نخست هر ادغام در نظر گرفته میشود. کامیتها عبارتند از:
دستور rev-list در تاریخچه به سمت عقب پیمایش میکند، و بر اساس اینکه آیا --full-history و/یا بازنویسی والدین (از طریق --parents یا --children) استفاده شده باشد، کامیتها را شامل یا مستثنی میسازد. تنظیمات زیر در دسترس هستند.
حالت پیشفرض (Default mode)
این منجر به نتیجه زیر میشود:
.-A---N---O / / / I---------D
توجه کنید چگونه قاعده دنبال کردن تنها والد TREESAME (در صورت وجود)، B را کاملاً از بررسی حذف کرد. C از طریق N بررسی شد، اما وضعیت TREESAME داشت. کامیتهای ریشه با یک درخت خالی مقایسه میشوند، بنابراین I دارای وضعیت !TREESAME است.
روابط والد/فرزند تنها با --parents قابل مشاهده هستند، اما این موضوع بر کامیتهای انتخابشده در حالت پیشفرض تأثیری ندارد، بنابراین ما خطوط والدین را نمایش دادهایم.
--full-history بدون بازنویسی والدین
I A B N D O P Q
M حذف شد زیرا نسبت به هر دو والد وضعیت TREESAME داشت. E, C و B همگی پیمایش شدند، اما تنها B دارای وضعیت !TREESAME بود، بنابراین بقیه ظاهر نمیشوند.
توجه داشته باشید که بدون بازنویسی والدین، عملاً امکان صحبت در مورد روابط والد/فرزند میان کامیتها وجود ندارد، از این رو آنها را به صورت گسسته نشان میدهیم.
--full-history با بازنویسی والدین
ادغامها همیشه گنجانده میشوند. با این حال، فهرست والدین آنها بازنویسی میشود: در امتداد هر والد، کامیتهایی را که خودشان گنجانده نشدهاند هرس میکند. این به نتیجه زیر میانجامد:
.-A---M---N---O---P---Q / / / / / I B / D / \ / / / / `-------------'
با --full-history بدون بازنویسی در بالا مقایسه کنید. توجه داشته باشید که E هرس شد زیرا TREESAME بود، اما فهرست والدین P بازنویسی شد تا شامل والد E یعنی I باشد. همین اتفاق برای C و N, و برای X, Y و Q نیز رخ داد.
علاوه بر تنظیمات فوق، میتوانید تغییر دهید که آیا وضعیت TREESAME بر گنجاندن تأثیر بگذارد یا خیر:
--dense
--sparse
توجه داشته باشید که بدون --full-history, این گزینه همچنان ادغامها را سادهسازی میکند: اگر یکی از والدین TREESAME باشد، ما تنها همان یکی را دنبال میکنیم، بنابراین سمتهای دیگر ادغام هرگز پیمایش نمیشوند.
--simplify-merges
سپس هر کامیت C را به جایگزین آن C' در تاریخچه نهایی بر اساس قوانین زیر ساده میکند:
تأثیر این کار به بهترین شکل با مقایسه آن با --full-history همراه با بازنویسی والدین نشان داده میشود. مثال به صورت زیر درمیآید:
.-A---M---N---O / / / I B D \ / / `---------'
تفاوتهای عمده در N, P, و Q را نسبت به --full-history ملاحظه فرمایید:
حالت سادهسازی دیگری نیز در دسترس است:
--ancestry-path[=<commit>]
بهعنوان یک نمونه کاربرد، تاریخچه کامیت زیر را در نظر بگیرید:
D---E-------F / \ \ B---C---G---H---I---J / \ A-------K---------------L--M
یک عبارت معمولی D..M مجموعه کامیتهایی را محاسبه میکند که نیاکان M هستند، اما مواردی را که نیاکان D میباشند مستثنی میسازد. این برای مشاهده آنچه برای تاریخچه منتهی به M از زمان D رخ داده مفید است، به این معنی که « M چه چیزی دارد که در D وجود نداشت». نتیجه در این مثال تمام کامیتها خواهد بود، به جز A و B (و البته خود D).
اما هنگامی که بخواهیم بدانیم چه کامیتهایی در M به باگ معرفیشده توسط D آلوده شدهاند و نیاز به رفع دارند، ممکن است بخواهیم تنها زیرمجموعهای از D..M را مشاهده کنیم که واقعاً از نوادگان D هستند، یعنی مستثنی کردن C و K. این دقیقاً همان کاری است که گزینه --ancestry-path انجام میدهد. اعمال آن روی محدوده D..M به نتیجه زیر میانجامد:
E-------F
\ \
G---H---I---J
\
L--M
ما همچنین میتوانیم از --ancestry-path=D بهجای --ancestry-path استفاده کنیم که هنگام اعمال روی محدوده D..M معنای یکسانی دارد اما صریحتر است.
اگر در عوض به یک موضوع خاص در این محدوده و تمام کامیتهای متأثر از آن موضوع علاقهمند باشیم، ممکن است تنها بخواهیم زیرمجموعهای از D..M را مشاهده کنیم که آن موضوع را در مسیر نیاکان خود دارند. بنابراین، برای مثال استفاده از --ancestry-path=H D..M به نتیجه زیر میانجامد:
E
\
C---G---H---I---J
\
L--M
در حالی که --ancestry-path=K D..M به این نتیجه منجر میشود:
K---------------L--M
پیش از بحث درباره گزینه دیگر، یعنی --show-pulls, لازم است یک تاریخچه نمونه جدید بسازیم.
یک مشکل رایج که کاربران هنگام مشاهده تاریخچه سادهسازیشده با آن مواجه میشوند این است که کامیتی که میدانند فایلی را تغییر داده است به نوعی در تاریخچه سادهشده فایل ظاهر نمیشود. بیایید یک مثال جدید را نشان دهیم و بررسی کنیم که گزینههایی مانند --full-history و --simplify-merges در چنین حالتی چگونه کار میکنند:
.-A---M-----C--N---O---P / / \ \ \/ / / I B \ R-'`-Z' / \ / \/ / \ / /\ / `---X--' `---Y--'
برای این مثال، فرض کنید I فایل file.txt را ایجاد کرد که توسط A, B, و X به روشهای متفاوتی اصلاح شد. کامیتهای تکوالدی C, Z, و Y تغییری در file.txt ایجاد نمیکنند. کامیت ادغام M با حل تعارض ادغام برای گنجاندن هر دو تغییر از A و B ایجاد شد و بنابراین نسبت به هیچکدام TREESAME نیست. اما کامیت ادغام R با نادیده گرفتن محتویات file.txt در M و گرفتن تنها محتویات file.txt در X ایجاد گردید. از این رو، R نسبت به X دارای وضعیت TREESAME است اما نسبت به M نیست. در نهایت، تفکیک طبیعی ادغام برای ایجاد N گرفتن محتویات file.txt در R است، بنابراین N نسبت به R وضعیت TREESAME دارد اما نسبت به C ندارد. کامیتهای ادغام O و P نسبت به والدین اول خود وضعیت TREESAME دارند، اما به ترتیب نسبت به والدین دوم خود یعنی Z و Y وضعیت TREESAME ندارند.
هنگام استفاده از حالت پیشفرض، N و R هر دو دارای یک والد TREESAME هستند، بنابراین آن یالها پیمایش شده و بقیه نادیده گرفته میشوند. گراف تاریخچه حاصل به صورت زیر است:
I---X
هنگام استفاده از --full-history, گیت تمام یالها را پیمایش میکند. این کار کامیتهای A و B و ادغام M را آشکار میسازد، اما کامیتهای ادغام O و P را نیز نمایان میکند. با بازنویسی والدین، گراف حاصل به شکل زیر خواهد بود:
.-A---M--------N---O---P / / \ \ \/ / / I B \ R-'`--' / \ / \/ / \ / /\ / `---X--' `------'
در اینجا، کامیتهای ادغام O و P نویز اضافی ایجاد میکنند، زیرا در واقع تغییری در file.txt ایجاد نکردهاند. آنها تنها موضوعی را ادغام کردهاند که بر پایه نسخه قدیمیتری از file.txt بنا شده بود. این یک مسئله رایج در مخازنی است که از گردش کاری با مشارکتکنندگان موازی زیاد استفاده میکنند که شاخههای موضوعی خود را در طول یک تنه اصلی ادغام مینمایند: ادغامهای نامرتبط زیادی در نتایج --full-history ظاهر میشوند.
هنگام استفاده از گزینه --simplify-merges, کامیتهای O و P از نتایج ناپدید میشوند. دلیل آن این است که والدین دوم بازنویسیشده O و P از والدین اول آنها قابل دسترسی هستند. آن یالها حذف میشوند و سپس کامیتها مانند کامیتهای تکوالدی به نظر میرسند که نسبت به والد خود TREESAME هستند. این اتفاق برای کامیت N نیز رخ میدهد و نمایی از تاریخچه به صورت زیر ایجاد میکند:
.-A---M--. / / \ I B R \ / / \ / / `---X--'
در این نما، ما تمام تغییرات تکوالدی مهم از A, B, و X را میبینیم. همچنین ادغام با دقت حلشده M و ادغام نهچندان با دقت حلشده R را مشاهده میکنیم. این معمولاً اطلاعات کافی برای تعیین اینکه چرا کامیتهای A و B در نمای پیشفرض از تاریخچه «ناپدید شدند» را فراهم میسازد. با این حال، چند مشکل در این رویکرد وجود دارد.
مشکل نخست کارایی است. برخلاف هر گزینه قبلی، گزینه --simplify-merges مستلزم پیمایش کل تاریخچه کامیت پیش از بازگرداندن حتی یک نتیجه است. این میتواند استفاده از این گزینه را برای مخازن بسیار بزرگ دشوار سازد.
مشکل دوم موضوع حسابرسی (auditing) است. هنگامی که مشارکتکنندگان زیادی روی یک مخزن کار میکنند، مهم است که کدام کامیتهای ادغام تغییری را وارد یک شاخه مهم کردهاند. ادغام مشکلساز R در بالا احتمالاً آن کامیت ادغامی نبوده است که برای ادغام در یک شاخه مهم استفاده شده است. در عوض، ادغام N برای ادغام R و X در شاخه مهم به کار رفته است. این کامیت ممکن است اطلاعاتی درباره اینکه چرا تغییر X جایگزین تغییرات A و B شد در پیام کامیت خود داشته باشد.
--show-pulls
هنگامی که یک کامیت ادغام توسط --show-pulls گنجانده میشود، با ادغام بهگونهای رفتار میشود که گویی تغییر را از شاخه دیگری «کشیده» (pull) است. هنگام استفاده از --show-pulls در این مثال (و بدون گزینههای دیگر) گراف حاصل عبارت است از:
I---X---R---N
در اینجا، کامیتهای ادغام R و N گنجانده شدهاند زیرا آنها به ترتیب کامیتهای X و R را به شاخه پایه وارد کردند. این ادغامها دلیلی هستند که کامیتهای A و B در تاریخچه پیشفرض ظاهر نمیشوند.
هنگامی که --show-pulls همراه با --simplify-merges استفاده شود، گراف شامل تمام اطلاعات لازم خواهد بود:
.-A---M--. N / / \ / I B R \ / / \ / / `---X--'
توجه داشته باشید از آنجا که M از R قابل دسترسی است، یال از N به M با سادهسازی حذف شد. با این حال، N همچنان بهعنوان یک کامیت مهم در تاریخچه ظاهر میشود زیرا تغییر R را به شاخه اصلی «کشیده» است.
گزینه --simplify-by-decoration به شما امکان میدهد تنها نمای کلی از توپولوژی تاریخچه را با حذف کامیتهایی که توسط برچسبها ارجاع داده نشدهاند مشاهده کنید. کامیتها در صورتی بهعنوان !TREESAME علامتگذاری میشوند (به عبارت دیگر، پس از قوانین سادهسازی تاریخچه توضیح دادهشده در بالا حفظ میشوند) که (۱) توسط برچسبها ارجاع داده شده باشند، یا (۲) محتویات مسیرهای دادهشده در خط فرمان را تغییر دهند. تمام کامیتهای دیگر بهعنوان TREESAME علامتگذاری میشوند (مشمول حذف از طریق سادهسازی).
کمککنندههای دونیمسازی (Bisection Helpers)
--bisect
$ git rev-list --bisect foo ^bar ^baz
مقدار midpoint را خروجی دهد، خروجی دو دستور زیر
$ git rev-list foo ^midpoint $ git rev-list midpoint ^bar ^baz
تقریباً طول یکسانی خواهند داشت. یافتن تغییری که یک باگ یا پسرفت را ایجاد کرده است بدین ترتیب به یک جستجوی دودویی تبدیل میشود: به طور مکرر «نقطه میانی» جدید تولید و آزمایش کنید تا زمانی که زنجیره کامیت به طول یک برسد.
--bisect-vars
--bisect-all
این گزینه مفید است زیرا زمانی که میخواهید به دلایلی از آزمایش برخی کامیتها خودداری کنید (مثلاً ممکن است کامپایل نشوند)، انتخاب یک کامیت مناسب را برای تست آسان میسازد.
این گزینه را میتوان همراه با --bisect-vars استفاده کرد؛ در این حالت، پس از تمام اشیاء کامیت مرتبشده، همان متنی وجود خواهد داشت که گویی --bisect-vars به تنهایی استفاده شده است.
ترتیب کامیتها (Commit Ordering)
بهطور پیشفرض، کامیتها به ترتیب معکوس زمانی نمایش داده میشوند.
--date-order
--author-date-order
--topo-order
برای نمونه، در یک تاریخچه کامیت مانند این:
---1----2----4----7
\ \
3----5----6----8---
که در آن اعداد نشاندهنده ترتیب برچسبهای زمان کامیت هستند، دستور git rev-list و دستورات مشابه همراه با --date-order کامیتها را به ترتیب برچسب زمان نمایش میدهند: 8 7 6 5 4 3 2 1.
با --topo-order, آنها به صورت 8 6 5 3 7 4 2 1 (یا 8 7 4 2 6 5 3 1) نمایش داده میشوند؛ برخی از کامیتهای قدیمیتر قبل از کامیتهای جدیدتر نشان داده میشوند تا از مخلوط شدن کامیتهای دو مسیر توسعه موازی جلوگیری شود.
--reverse
پیمایش شیء (Object Traversal)
این گزینهها بیشتر برای بستهبندی مخازن گیت هدفگذاری شدهاند.
--no-walk[=(sorted|unsorted)]
--do-walk
پیمایش اشیاء (Object Traversal)
این گزینهها عمدتاً برای بستهبندی مخازن گیت طراحی شدهاند.
--objects
--in-commit-order
--objects-edge
--objects-edge-aggressive
--indexed-objects
--unpacked
--object-names
--no-object-names
--filter=<filter-spec>
قالب --filter=blob:none تمام blobها را حذف میکند.
قالب --filter=blob:limit=<n>[kmg] blobهایی با اندازه حداقل <n> بایت یا واحد مشخصشده را حذف میکند.
قالب --filter=object:type=(tag|commit|tree|blob) تمام اشیائی را که از نوع درخواستی نیستند حذف میکند.
قالب --filter=tree:<depth> تمام blobها و درختهایی را که عمق آنها از درخت ریشه >= <depth> است حذف میکند.
--no-filter
--filter-provided-objects
--filter-print-omitted
--missing=<missing-action>
--exclude-promisor-objects
--no-walk[=(sorted|unsorted)]
--do-walk
قالببندی کامیت (Commit Formatting)
--pretty[=<format>], --format=<format>
برای جزئیات بیشتر درباره هر قالب، بخش «PRETTY FORMATS» را ببینید. هنگامی که بخش =<format> حذف شود، مقدار پیشفرض medium خواهد بود.
--abbrev-commit
این گزینه باید خوانایی --pretty=oneline را برای افرادی که از ترمینالهای ۸۰ ستونی استفاده میکنند به مراتب بهتر کند.
--no-abbrev-commit
--oneline
--encoding=<encoding>
--expand-tabs=<n>, --expand-tabs, --no-expand-tabs
بهطور پیشفرض، تبها در قالبهای زیبایی که پیام لاگ را ۴ فاصله تورفتگی میدهند (یعنی medium که پیشفرض است، full, و fuller) گسترش مییابند.
--notes[=<ref>]
بهطور پیشفرض، یادداشتهای نمایشدادهشده از ارجاعهای یادداشت فهرستشده در متغیرهای core.notesRef و notes.displayRef (یا بازنویسیهای متغیرهای محیطی متناظر) برگرفته میشوند. برای جزئیات بیشتر به git-config(1) مراجعه کنید.
با یک آرگومان اختیاری <ref>, از آن ارجاع برای یافتن یادداشتها جهت نمایش استفاده میکند. ارجاع میتواند نام کامل ارجاع را هنگامی که با refs/notes/ آغاز میشود مشخص کند؛ هنگامی که با notes/ آغاز شود، پیشوند refs/ و در غیر این صورت refs/notes/ برای تشکیل نام کامل ارجاع اضافه میگردد.
میتوان چندین گزینه --notes را با هم ترکیب کرد تا مشخص شود چه یادداشتهایی نمایش داده میشوند. مثالها: "--notes=foo" تنها یادداشتهای refs/notes/foo را نشان میدهد؛ "--notes=foo --notes" هم یادداشتهای "refs/notes/foo" و هم یادداشتهای ارجاع(های) یادداشت پیشفرض را نشان میدهد.
--no-notes
--show-notes-by-default
--show-notes[=<ref>], --standard-notes, --no-standard-notes
--show-signature
--relative-date
--date=<format>
--date=relative تاریخها را نسبت به زمان فعلی نشان میدهد، مانند «۲ ساعت پیش». گزینه -local هیچ تأثیری بر --date=relative ندارد.
--date=local یک نام مستعار برای --date=default-local است.
--date=iso (یا --date=iso8601) برچسبهای زمان را در قالبی شبیه به ISO 8601 نمایش میدهد. تفاوتها با قالب سختگیرانه ISO 8601 عبارتند از:
--date=iso-strict (یا --date=iso8601-strict) برچسبهای زمان را در قالب دقیق و سختگیرانه ISO 8601 نمایش میدهد.
--date=rfc (یا --date=rfc2822) برچسبهای زمان را در قالب RFC 2822 نشان میدهد که اغلب در پیامهای ایمیل یافت میشود.
--date=short تنها تاریخ را بدون زمان، در قالب YYYY-MM-DD نمایش میدهد.
--date=raw تاریخ را بهصورت ثانیههای سپریشده از مبدأ یونیکس (1970-01-01 00:00:00 UTC) و به دنبال آن یک فاصله، و سپس منطقه زمانی را بهعنوان یک آفست از UTC (یک + یا - همراه با چهار رقم؛ دو رقم اول ساعت و دو رقم دوم دقیقه) نشان میدهد. یعنی بهگونهای که گویی برچسب زمان با strftime("%s %z") قالببندی شده است. توجه داشته باشید که گزینه -local بر مقدار ثانیههای مبدأ (که همیشه بر حسب UTC سنجیده میشود) تأثیری ندارد، اما مقدار منطقه زمانی همراه آن را تغییر میدهد.
--date=human اگر منطقه زمانی با منطقه زمانی فعلی مطابقت نداشته باشد آن را نمایش میدهد، و اگر مطابقت داشته باشد کل تاریخ را چاپ نمیکند (یعنی از چاپ سال برای تاریخهای «امسال» صرفنظر میکند، و همچنین کل تاریخ را در صورتی که مربوط به چند روز گذشته باشد حذف کرده و صرفاً روز هفته را بیان میکند). برای تاریخهای قدیمیتر، ساعت و دقیقه نیز حذف میشوند.
--date=unix تاریخ را بهعنوان برچسب زمان مبدأ یونیکس (ثانیهها از سال ۱۹۷۰) نشان میدهد. همانند --raw, این مقدار همیشه بر حسب UTC است و بنابراین -local هیچ تأثیری ندارد.
--date=format:<format> مقدار <format> را به تابع strftime سیستم شما ارسال میکند، به استثنای %s, %z, و %Z که بهصورت داخلی مدیریت میشوند. از --date=format:%c برای نمایش تاریخ در قالب ترجیحی زبان/محیط (locale) سیستم خود استفاده کنید. برای فهرست کامل جانگهدارندههای قالب به راهنمای strftime(3) مراجعه فرمایید. هنگام استفاده از -local, نحو صحیح بهصورت --date=format-local:<format> است.
--date=default قالب پیشفرض است و بر اساس خروجی ctime(3) عمل میکند. این گزینه یک خط منفرد شامل سه حرف روز هفته، سه حرف نام ماه، روز ماه، ساعت-دقیقه-ثانیه در قالب "HH:MM:SS" و به دنبال آن سال ۴ رقمی، به اضافه اطلاعات منطقه زمانی را نشان میدهد، مگر اینکه از منطقه زمانی محلی استفاده شده باشد؛ برای نمونه: Thu Jan 1 00:00:00 1970 +0000.
--parents
--children
--left-right
برای نمونه، اگر چنین توپولوژی داشته باشید:
y---b---b branch B / \ / / . / / \ o---x---a---a branch A
خروجی شبیه به این دریافت خواهید کرد:
$ git rev-list --left-right --boundary --pretty=oneline A...B >bbbbbbb... 3rd on b >bbbbbbb... 2nd on b <aaaaaaa... 3rd on a <aaaaaaa... 2nd on a -yyyyyyy... 1st on b -xxxxxxx... 1st on a
--graph
این گزینه بازنویسی والدین را فعال میکند؛ به بخش History Simplification در بالا مراجعه کنید.
این گزینه بهطور پیشفرض متضمن گزینه --topo-order است، اما گزینه --date-order را نیز میتوان مشخص کرد.
--show-linear-break[=<barrier>]
--graph-lane-limit=<n>
قالبهای سفارشی (PRETTY FORMATS)
اگر کامیت یک ادغام باشد و چنانچه قالب سفارشی یکی از موارد oneline, email یا raw نباشد، یک خط اضافی پیش از خط Author: درج میشود. این خط با "Merge: " آغاز شده و هشهای کامیتهای نیاکان با فاصله چاپ میشوند. توجه داشته باشید اگر نمای خود از تاریخچه را محدود کرده باشید (برای نمونه تنها به تغییرات مربوط به یک دایرکتوری یا فایل خاص علاقهمند باشید)، کامیتهای فهرستشده لزوماً همان فهرست کامیتهای والد مستقیم نیستند.
چندین قالب توکار وجود دارد، و شما میتوانید قالبهای بیشتری را با تنظیم گزینه پیکربندی pretty.<name> روی یک نام قالب دیگر یا یک رشته format: مطابق توضیحات زیر تعریف کنید (به git-config(1) مراجعه کنید). جزئیات قالبهای توکار به شرح زیر است:
oneline
<hash> <title-line>
این قالب بهگونهای طراحی شده است که تا حد امکان فشرده باشد.
short
commit <hash>
Author: <author>
<title-line>
medium
commit <hash>
Author: <author>
Date: <author-date>
<title-line>
<full-commit-message>
full
commit <hash>
Author: <author>
Commit: <committer>
<title-line>
<full-commit-message>
fuller
commit <hash>
Author: <author>
AuthorDate: <author-date>
Commit: <committer>
CommitDate: <committer-date>
<title-line>
<full-commit-message>
reference
<abbrev-hash> (<title-line>, <short-author-date>)
این قالب برای ارجاع به یک کامیت دیگر در پیام کامیت استفاده میشود و مشابه --pretty='format:%C(auto)%h (%s, %ad)' است. بهطور پیشفرض، تاریخ با --date=short قالببندی میشود مگر اینکه گزینه --date دیگری صراحتاً مشخص شده باشد. همانند هر format: دارای جانگهدارندههای قالب، خروجی آن تحت تأثیر گزینههای دیگری مانند --decorate و --walk-reflogs قرار نمیگیرد.
From <hash> <date> From: <author> Date: <author-date> Subject: [PATCH] <title-line> <full-commit-message>
mboxrd
raw
format:<format-string>
برای نمونه، format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" خروجی شبیه به این نمایش میدهد:
The author of fe6e0ee was Junio C Hamano, 23 hours ago The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<
جانگهدارندهها (placeholders) عبارتند از:
%n
%%
%x00
%Cred
%Cgreen
%Cblue
%Creset
%C(<spec>)
%m
%w([<w>[,<i1>[,<i2>]]])
%<(<n>[,(trunc|ltrunc|mtrunc)])
%<|(<m> )
%>(<n>), %>|(<m>)
%>>(<n>), %>>|(<m>)
%><(<n>), %><|(<m>)
%H
%h
%T
%t
%P
%p
%an
%aN
%ae
%aE
%al
%aL
%ad
%aD
%ar
%at
%ai
%aI
%as
%ah
%cn
%cN
%ce
%cE
%cl
%cL
%cd
%cD
%cr
%ct
%ci
%cI
%cs
%ch
%d
%D
%(count)
%(total)
%(decorate[:<option>,...])
prefix=<value>
suffix=<value>
separator=<value>
pointer=<value>
tag=<value>
برای نمونه، جهت ایجاد تزیینات بدون پرانتز یا حاشیهنویسی برچسب و با فاصله بهعنوان جداکننده:
%(decorate:prefix=,suffix=,tag=,separator= )
%(describe[:<option>,...])
tags[=<bool-value>]
abbrev=<number>
match=<pattern>
exclude=<pattern>
%S
%e
%s
%f
%b
%B
%N
%GG
%G?
%GS
%GK
%GF
%GP
%GT
%gD
%gd
%gn
%gN
%ge
%gE
%gs
%(trailers[:<option>,...])
key=<key>
only[=<bool>]
separator=<sep>
unfold[=<bool>]
keyonly[=<bool>]
valueonly[=<bool>]
key_value_separator=<sep>
نکته
برخی از جانگهدارندهها ممکن است به گزینههای دیگری که به موتور پیمایش بازنگری داده شدهاند وابسته باشند. برای نمونه، گزینههای رِفلاگ %g* رشتهای خالی درج خواهند کرد مگر اینکه در حال پیمایش مدخلهای رِفلاگ باشیم (برای مثال با git log -g). جانگهدارندههای %d و %D در صورتی که --decorate از قبل در خط فرمان ارائه نشده باشد، از قالب تزیین "short" استفاده خواهند کرد.
اگر یک + (علامت مثبت) بعد از % یک جانگهدارنده اضافه کنید، یک خط جدید بلافاصله پیش از بسط یافتن درج میشود اگر و تنها اگر جانگهدارنده به یک رشته غیرخالی بسط یابد.
اگر یک - (علامت منفی) بعد از % یک جانگهدارنده اضافه کنید، تمام خطوط جدید متوالی بلافاصله قبل از بسط حذف میشوند اگر و تنها اگر جانگهدارنده به یک رشته خالی بسط یابد.
اگر یک ' ' (فاصله) بعد از % یک جانگهدارنده اضافه کنید، یک فاصله بلافاصله پیش از بسط درج میشود اگر و تنها اگر جانگهدارنده به یک رشته غیرخالی بسط یابد.
tformat:
$ git log -2 --pretty=format:%h 4da45bef \ | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' 4da45be 7134973 -- NO NEWLINE $ git log -2 --pretty=tformat:%h 4da45bef \ | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' 4da45be 7134973
علاوه بر این، هر رشته ناشناختهای که شامل یک % باشد بهگونهای تفسیر میشود که گویی tformat: در ابتدای آن قرار دارد. برای نمونه، این دو مورد معادل هستند:
$ git log -2 --pretty=tformat:%h 4da45bef $ git log -2 --pretty=%h 4da45bef
مثالها (EXAMPLES)
git rev-list HEAD
git rev-list @{upstream}..HEAD
git rev-list --format=medium HEAD
git rev-list HEAD | git diff-tree --stdin --format=medium -p
git rev-list HEAD -- Documentation/
git rev-list --author=you@example.com --since=1.year.ago --all
git rev-list --objects HEAD
# اشیاء قابل دسترسی git rev-list --disk-usage --objects --all # به همراه reflogها git rev-list --disk-usage --objects --all --reflog # کل فضای دیسک استفادهشده du -c .git/objects/pack/*.pack .git/objects/??/* # جایگزینی برای du: جمع زدن فیلدهای "size" و "size-pack" git count-objects -v
git for-each-ref --format='%(refname)' |
while read branch
do
size=$(git rev-list --disk-usage --objects HEAD..$branch)
echo "$size $branch"
done |
sort -n
git rev-list --disk-usage --objects --remotes=$suspect --not --remotes=origin
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |