| GIT-LOG(1) | دستورات عمومی کاربر | GIT-LOG(1) |
نام (NAME)
git-log - نمایش لاگهای کامیت
خلاصه دستور (SYNOPSIS)
git log [<options>] [<revision-range>] [[--] <path>...]
توضیحات (DESCRIPTION)
لاگهای کامیت را نمایش میدهد.
کامیتهایی را فهرست میکند که با دنبال کردن پیوندهای والد (parent) از کامیت(های) دادهشده قابل دسترسی هستند، اما کامیتهایی را که از موارد دارای علامت ^ در ابتدای آنها قابل دسترسی باشند مستثنی میکند. خروجی بهطور پیشفرض به ترتیب معکوس زمانی ارائه میشود.
میتوانید این را مانند یک عملیات مجموعهای در نظر بگیرید. کامیتهای قابل دسترسی از هر یک از کامیتهای مشخصشده در خط فرمان یک مجموعه تشکیل میدهند، و سپس کامیتهای قابل دسترسی از مواردی که با علامت ^ در ابتدا مشخص شدهاند از آن مجموعه کسر میشوند. کامیتهای باقیمانده همان چیزی هستند که در خروجی دستور ظاهر میشوند. گزینههای مختلف دیگر و پارامترهای مسیرها را میتوان برای محدود کردن بیشتر نتیجه استفاده کرد.
بنابراین، دستور زیر:
$ git log foo bar ^baz
به این معنی است: «فهرست کردن تمام کامیتهایی که از foo یا bar قابل دسترسی هستند، اما از baz قابل دسترسی نیستند».
علامتگذاری ویژه "<commit1>..<commit2>" را میتوان بهعنوان شکل کوتاهشده "^<commit1> <commit2>" به کار برد. برای نمونه، هر یک از موارد زیر را میتوان بهجای یکدیگر استفاده کرد:
$ git log origin..HEAD $ git log HEAD ^origin
علامتگذاری ویژه دیگر "<commit1>...<commit2>" است که برای ادغامها سودمند است. مجموعه کامیتهای حاصل، تفاضل متقارن بین دو عملوند است. دو دستور زیر معادل یکدیگر هستند:
$ git log A B --not $(git merge-base --all A B) $ git log A...B
این دستور گزینههای مربوط به دستور git-rev-list(1) را برای کنترل اینکه چه چیزی و چگونه نمایش داده شود، و گزینههای مربوط به دستور git-diff(1) را برای کنترل نحوه نمایش تغییراتی که هر کامیت اعمال میکند، میپذیرد.
گزینهها (OPTIONS)
--follow
--no-decorate, --decorate[=(short|full|auto|no)]
short
full
auto
گزینه --decorate حالت کوتاهنویسی برای --decorate=short است. در صورت پیکربندی، بهطور پیشفرض از مقدار پیکربندی log.decorate استفاده میکند، در غیر این صورت مقدار auto به کار میرود.
--decorate-refs=<pattern>, --decorate-refs-exclude=<pattern>
اگر هیچیک از این گزینهها یا تنظیمات پیکربندی داده نشود، ارجاعها در صورتی بهعنوان تزیین استفاده میشوند که با HEAD, refs/heads/, refs/remotes/, refs/stash/, یا refs/tags/ مطابقت داشته باشند.
--clear-decorations
--source
--mailmap, --no-mailmap, --use-mailmap, --no-use-mailmap
--full-diff
توجه داشته باشید که این گزینه بر همه انواع خروجیهای مبتنی بر تفاوت تأثیر میگذارد، مانند خروجیهای تولیدشده توسط --stat و غیره.
--log-size
-L<start>,<end>:<file>, -L:<funcname>:<file>
گزینههای قالببندی وصله مانند --word-diff, --color-moved, --no-prefix, و گزینههای فاصله خالی (-w, -b) پشتیبانی میشوند، همچنین گزینههای کلنگ (-S, -G) و --diff-filter.
<start> و <end> میتوانند یکی از این شکلها را داشته باشند:
اگر <start> یا <end> یک عدد باشد، شماره خط مطلق را مشخص میکند (شمارش خطوط از 1 شروع میشود).
این شکل از نخستین خط منطبق با عبارت باقاعده POSIX دادهشده <regex> استفاده میکند. اگر <start> یک عبارت باقاعده باشد، از انتهای محدوده قبلی -L (در صورت وجود) جستجو میکند، در غیر این صورت از ابتدای فایل جستجو خواهد کرد. اگر <start> بهصورت ^/<regex>/ باشد، از ابتدای فایل جستجو میکند. اگر <end> یک عبارت باقاعده باشد، جستجو را از خط مشخصشده با <start> آغاز میکند.
این حالت فقط برای <end> معتبر است و تعدادی خط قبل یا بعد از خط مشخصشده با <start> را تعیین میکند.
اگر :<funcname> بهجای <start> و <end> داده شود، یک عبارت باقاعده است که محدوده را از نخستین خط نام تابع منطبق با <funcname> تا خط نام تابع بعدی مشخص میسازد. :<funcname> از انتهای محدوده قبلی -L (در صورت وجود) جستجو میکند، در غیر این صورت از ابتدای فایل جستجو خواهد کرد. ^:<funcname> از ابتدای فایل جستجو میکند. نامهای توابع به همان شیوهای تعیین میشوند که git diff سرفصلهای قطعه وصله (patch hunk headers) را محاسبه میکند (به Defining a custom hunk-header در gitattributes(5) مراجعه فرمایید).
<revision-range>
[--] <path>...
در صورت بروز ابهام، ممکن است لازم باشد مسیرها با پیشوند -- مشخص شوند تا از گزینهها یا محدوده بازنگری تفکیک گردند.
محدود کردن کامیتها (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 علامتگذاری میشوند (مشمول حذف از طریق سادهسازی).
ترتیب کامیتها (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
قالببندی کامیت (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
قالببندی تفاوتها (DIFF FORMATTING)
بهطور پیشفرض، git log هیچ خروجی تفاوتی (diff) تولید نمیکند. گزینههای زیر را میتوان برای نمایش تغییرات ایجادشده توسط هر کامیت استفاده کرد.
توجه داشته باشید مگر اینکه یکی از متغیرهای --diff-merges (شامل گزینههای کوتاه -m, -c, --cc, و --dd) صراحتاً مشخص شده باشد، کامیتهای ادغام خروجی تفاوت را نشان نخواهند داد، حتی اگر یک قالب تفاوت مانند --patch انتخاب شده باشد، و همچنین با گزینههای جستجو مانند -S مطابقت نخواهند داشت. استثنا زمانی است که --first-parent استفاده شود، که در این صورت first-parent قالب پیشفرض برای کامیتهای ادغام است.
-p, -u, --patch
-s, --no-patch
-m
-c
--cc
--dd
--remerge-diff
--no-diff-merges
--diff-merges=<format>
قالبهای زیر پشتیبانی میشوند:
off, none
on, m
first-parent, 1
separate
combined, c
dense-combined, cc
remerge, r
خروجی ارائهشده هنگام استفاده از این گزینه، و همچنین تعامل آن با سایر گزینهها، مشمول تغییر در نسخههای آتی است (مگر اینکه صراحتاً مستند شده باشد).
--combined-all-paths
-U<n>, --unified=<n>
--output=<file>
--output-indicator-new=<char>, --output-indicator-old=<char>, --output-indicator-context=<char>
--raw
--patch-with-raw
-t
--indent-heuristic
--no-indent-heuristic
--minimal
--patience
--histogram
--anchored=<text>
این گزینه ممکن است بیش از یک بار مشخص شود.
اگر خطی هم در مبدأ و هم در مقصد وجود داشته باشد، تنها یک بار دیده شود، و با <text> آغاز گردد، این الگوریتم تلاش میکند تا از ظاهر شدن آن بهعنوان حذف یا اضافه در خروجی جلوگیری کند. این الگوریتم بهصورت داخلی از الگوریتم "patience diff" استفاده مینماید.
--diff-algorithm=(patience|minimal|histogram|myers)
default, myers
minimal
patience
histogram
برای نمونه، اگر متغیر diff.algorithm را روی مقداری غیرپیشفرض تنظیم کردهاید و میخواهید از مقدار پیشفرض استفاده کنید، باید از گزینه --diff-algorithm=default استفاده فرمایید.
--stat[=<width>[,<name-width>[,<count>]]]
این پارامترها را میتوان بهصورت جداگانه با --stat-width=<width>, --stat-name-width=<name-width> و --stat-count=<count> نیز تنظیم کرد.
--compact-summary
--numstat
--shortstat
-X [<param>,...], --dirstat[=<param>,...]
changes
lines
files
cumulative
<limit>
مثال: دستور زیر فایلهای تغییریافته را شمارش میکند، در حالی که دایرکتوریهای با کمتر از ۱۰٪ کل فایلهای تغییریافته را نادیده میگیرد، و تعداد دایرکتوریهای فرزند را در دایرکتوریهای والد جمع میزند: --dirstat=files,10,cumulative.
--cumulative
--dirstat-by-file[=<param>,...]
--summary
--patch-with-stat
-z
همچنین هنگامی که --raw یا --numstat داده شده باشد، نام مسیرها را دستکاری نکرده و از NUL بهعنوان پایاندهنده فیلد خروجی استفاده میکند.
بدون این گزینه، نام مسیرهای دارای نویسههای «نامعمول» طبق توضیحات متغیر پیکربندی core.quotePath در داخل گیومه قرار میگیرند (به git-config(1) مراجعه فرمایید).
--name-only
--name-status
--submodule[=<format>]
--color[=<when>]
--no-color
--color-moved[=<mode>]
no
default
plain
blocks
zebra
dimmed-zebra
--no-color-moved
--color-moved-ws=<mode>,...
no
ignore-space-at-eol
ignore-space-change
ignore-all-space
allow-indentation-change
--no-color-moved-ws
--word-diff[=<mode>]
color
plain
porcelain
none
توجه داشته باشید علیرغم نام حالت اول، در صورت فعال بودن رنگ، در تمام حالتها از رنگ برای برجسته کردن بخشهای تغییریافته استفاده میشود.
گزینه --word-diff با گرفتن همان diff خط به خط تولیدشده بدون این گزینه و محاسبه تغییرات کلمه به کلمه در هر قطعه عمل میکند. این ممکن است تفاوتی بزرگتر از آنچه یک ابزار اختصاصی word-diff تولید میکند ایجاد کند. اگر گیت در آینده پیادهسازی متفاوتی به دست آورد، ممکن است خروجی تغییر کند. توجه داشته باشید که این مشابه گزینه --diff-algorithm است که ممکن است خروجی را نیز تغییر دهد.
--word-diff-regex=<regex>
هر تطابق غیرهمپوشان از <regex> یک کلمه تلقی میشود. هر چیزی بین این تطابقها فاصله خالی در نظر گرفته شده و به منظور یافتن تفاوتها نادیده گرفته میشود(!). ممکن است بخواهید |[^[:space:]] را به عبارت باقاعده خود اضافه کنید تا مطمئن شوید با تمام نویسههای غیرفاصله خالی تطابق دارد. تطابقی که حاوی یک خط جدید باشد، بدون اعلام خطا در محل خط جدید کوتاه میشود(!).
برای نمونه، --word-diff-regex=. با هر نویسه مانند یک کلمه رفتار میکند و متناظراً تفاوتها را نویسه به نویسه نشان میدهد.
عبارت باقاعده را میتوان از طریق درایور diff یا گزینه پیکربندی نیز تنظیم کرد، به gitattributes(5) یا git-config(1) مراجعه کنید. تعیین صریح آن بر هر درایور diff یا تنظیم پیکربندی اولویت دارد. درایورهای diff بر تنظیمات پیکربندی اولویت دارند.
--color-words[=<regex>]
--no-renames
--rename-empty, --no-rename-empty
--check
--ws-error-highlight=<kind>
--full-index
--binary
--abbrev[=<n>]
-B[<n>][/<m>], --break-rewrites[=[<n>][/<m>]]
بر نحوه نمایش تغییری که معادل یک بازنویسی کامل از یک فایل است تأثیر میگذارد تا بهجای مجموعهای از حذفها و درجهای درهمآمیخته با تعداد بسیار کمی از خطوط که تصادفاً از نظر متنی بهعنوان متن پیرامون تطابق دارند، بهعنوان یک حذف منفرد از همهچیزهای قدیمی و به دنبال آن یک درج منفرد از همهچیزهای جدید نمایش داده شود؛ عدد <m> این جنبه از گزینه -B را کنترل میکند (پیشفرض ۶۰٪ است). -B/70% مشخص میکند که کمتر از ۳۰٪ از نسخه اصلی باید در نتیجه باقی بماند تا گیت آن را یک بازنویسی کامل در نظر بگیرد (در غیر این صورت وصله حاصل مجموعهای از حذف و درجهای مخلوط با خطوط زمینه خواهد بود).
هنگام استفاده همراه با -M, یک فایل کاملاً بازنویسیشده بهعنوان مبدأ تغییر نام نیز در نظر گرفته میشود (معمولاً -M تنها فایلی را که ناپدید شده است بهعنوان مبدأ تغییر نام در نظر میگیرد)، و عدد <n> این جنبه از گزینه -B را کنترل مینماید (پیشفرض ۵۰٪ است). -B20% مشخص میکند که تغییری با افزودن و حذف در مقایسه با ۲۰٪ یا بیشتر از اندازه فایل، واجد شرایط انتخاب بهعنوان مبدأ احتمالی تغییر نام به فایلی دیگر است.
-M[<n>], --find-renames[=<n>]
-C[<n>], --find-copies[=<n>]
--find-copies-harder
-D, --irreversible-delete
هنگامی که همراه با -B استفاده شود، تصویر پیشین را در بخش حذف یک جفت حذف/ایجاد نیز حذف میکند.
-l<num>
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
همچنین، این حروف بزرگ را میتوان با حروف کوچک برای استثنا کردن نوشت. برای نمونه --diff-filter=ad مسیرهای افزودهشده و حذفشده را مستثنی میسازد.
توجه داشته باشید که همه diffها نمیتوانند تمام انواع را نشان دهند. برای مثال، ورودیهای رونوشتبرداریشده و تغییرنامیافته در صورتی که تشخیص برای آن انواع غیرفعال باشد نمیتوانند ظاهر شوند.
-S<string>
زمانی مفید است که به دنبال یک بلوک دقیق از کد (مانند یک ساختار struct) میگردید و میخواهید تاریخچه آن بلوک را از زمان ایجاد اولیه بدانید: از این ویژگی بهصورت تکراری استفاده کنید تا بلوک مورد نظر در تصویر پیشین را مجدداً به -S ارسال کنید، و این کار را ادامه دهید تا به نخستین نسخه بلوک برسید.
فایلهای باینری نیز جستجو میشوند.
-G<regex>
برای نشان دادن تفاوت بین -S<regex> --pickaxe-regex و -G<regex>, کامیتی با diff زیر را در همان فایل در نظر بگیرید:
+ return frotz(nitfol, two->ptr, 1, 0); ... - hit = frotz(nitfol, mf2.ptr, 1, 0);
در حالی که دستور git log -G"frotz\(nitfol" این کامیت را نشان میدهد، دستور git log -S"frotz\(nitfol" --pickaxe-regex آن را نشان نخواهد داد (زیرا تعداد رخدادهای آن رشته تغییری نکرده است).
مگر اینکه --text ارائه شود، وصلههای فایلهای باینری بدون فیلتر textconv نادیده گرفته میشوند.
برای اطلاعات بیشتر به مدخل pickaxe در gitdiffcore(7) مراجعه کنید.
--find-object=<object-id>
شیء میتواند یک blob یا کامیت زیرماژول باشد. این گزینه مستلزم گزینه -t در git-log است تا درختها را نیز پیدا کند.
--pickaxe-all
--pickaxe-regex
-O<orderfile>
ترتیب خروجی بر اساس ترتیب الگوهای glob در <orderfile> تعیین میشود. تمام فایلهایی که نام مسیر آنها با الگوی نخست مطابقت دارد ابتدا خروجی داده میشوند، سپس تمام فایلهای منطبق با الگوی دوم (اما نه اولی) خروجی داده میشوند و به همین ترتیب. تمام فایلهایی که با هیچ الگویی مطابقت ندارند در پایان خروجی داده میشوند، بهگونهای که گویی یک الگوی ضمنی match-all در انتهای فایل وجود داشته است. اگر چند نام مسیر رتبه یکسانی داشته باشند (با همان الگو مطابقت داشته باشند اما با الگوهای قبلی تطابق نداشته باشند)، ترتیب خروجی آنها نسبت به یکدیگر همان ترتیب عادی خواهد بود.
فایل <orderfile> به شرح زیر تجزیه میشود:
الگوها همان نحو و معناشناسی الگوهای استفادهشده برای fnmatch(3) بدون پرچم FNM_PATHNAME را دارند، به جز اینکه اگر حذف هر تعداد از مؤلفههای نهایی نام مسیر با الگو مطابقت داشته باشد، آن نام مسیر نیز با الگو تطابق دارد. برای نمونه، الگوی "foo*bar" با "fooasdfbar" و "foo/bar/baz/asdf" مطابقت دارد اما با "foobarx" مطابقت ندارد.
--skip-to=<file>, --rotate-to=<file>
-R
--relative[=<path>], --no-relative
-a, --text
--ignore-cr-at-eol
--ignore-space-at-eol
-b, --ignore-space-change
-w, --ignore-all-space
--ignore-blank-lines
-I<regex>, --ignore-matching-lines=<regex>
--inter-hunk-context=<number>
-W, --function-context
--ext-diff
--no-ext-diff
--textconv, --no-textconv
--ignore-submodules[=(none|untracked|dirty|all)]
--src-prefix=<prefix>
--dst-prefix=<prefix>
--no-prefix
--default-prefix
--line-prefix=<prefix>
--ita-invisible-in-index
--max-depth=<depth>
اگر هیچ الگوی مسیری داده نشود، عمق بهگونهای سنجیده میشود که گویی تمام مدخلهای سطح بالا مشخص شدهاند. توجه داشته باشید که این با اندازهگیری از ریشه متفاوت است، از این جهت که --max-depth=0 همچنان foo را بازمیگرداند. این به شما امکان میدهد همچنان عمق را محدود کنید در حالی که زیرمجموعهای از مدخلهای سطح بالا را درخواست مینمایید.
توجه داشته باشید که این گزینه تنها برای تفاوت میان اشیای درخت پشتیبانی میشود، نه در برابر ایندکس یا درخت کاری.
برای توضیحات دقیقتر در مورد این گزینههای مشترک، همچنین به gitdiffcore(7) مراجعه فرمایید.
تولید متن وصله با P- (GENERATING PATCH TEXT WITH -P)
اجرای دستورات git-diff(1), git-log(1), git-show(1), git-diff-index(1), git-diff-tree(1), یا git-diff-files(1) همراه با گزینه -p متن وصله (patch text) تولید میکند. میتوانید ایجاد متن وصله را از طریق متغیرهای محیطی GIT_EXTERNAL_DIFF و GIT_DIFF_OPTS (به git(1) مراجعه کنید) و ویژگی diff (به gitattributes(5) مراجعه کنید) سفارشیسازی فرمایید.
آنچه گزینه -p تولید میکند اندکی با قالب سنتی diff تفاوت دارد:
diff --git a/file1 b/file2
نام فایلهای a/ و b/ یکسان هستند مگر اینکه تغییر نام/رونوشت در کار باشد. بهویژه، حتی برای ایجاد یا حذف، /dev/null بهجای نام فایلهای a/ یا b/ استفاده نمیشود.
هنگامی که تغییر نام/رونوشت در میان باشد، file1 و file2 به ترتیب نام فایل مبدأ تغییر نام/رونوشت و نام فایلی را که تغییر نام/رونوشت تولید میکند نشان میدهند.
old mode <mode> new mode <mode> deleted file mode <mode> new file mode <mode> copy from <path> copy to <path> rename from <path> rename to <path> similarity index <number> dissimilarity index <number> index <hash>..<hash> <mode>
حالتهای فایل <mode> بهصورت اعداد اکتال ۶ رقمی شامل نوع فایل و بیتهای مجوز فایل چاپ میشوند.
نام مسیرها در هدرهای گسترشیافته شامل پیشوندهای a/ و b/ نیستند.
شاخص شباهت درصد خطوط تغییرنیافته است، و شاخص عدم شباهت درصد خطوط تغییریافته است. این یک عدد صحیح گردشده به پایین است که با علامت درصد دنبال میشود. مقدار شاخص شباهت ۱۰۰٪ برای دو فایل برابر در نظر گرفته شده است، در حالی که عدم شباهت ۱۰۰٪ به این معنی است که هیچ خطی از فایل قدیمی به فایل جدید منتقل نشده است.
خط index شامل نامهای اشیای blob قبل و بعد از تغییر است. در صورتی که حالت فایل تغییر نکند <mode> گنجانده میشود؛ در غیر این صورت، خطوط جداگانه حالت قدیمی و جدید را نشان میدهند.
diff --git a/a b/b rename from a rename to b diff --git a/b b/a rename from b rename to a
قالب تفاوت ترکیبی (COMBINED DIFF FORMAT)
هر دستور تولیدکننده diff میتواند گزینه -c یا --cc را برای تولید یک تفاوت ترکیبی (combined diff) هنگام نمایش یک ادغام بپذیرد. این قالب پیشفرض هنگام نمایش ادغامها با git-diff(1) یا git-show(1) است. همچنین توجه داشته باشید که میتوانید گزینه مناسب --diff-merges را به هر یک از این دستورات بدهید تا تولید تفاوتها را در یک قالب خاص اجبار کنید.
قالب "combined diff" به صورت زیر است:
diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
}
- static void describe(char *arg)
-static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
{
+ unsigned char sha1[20];
+ struct commit *cmit;
struct commit_list *list;
static int initialized = 0;
struct commit_name *n;
+ if (get_sha1(arg, sha1) < 0)
+ usage(describe_usage);
+ cmit = lookup_commit_reference(sha1);
+ if (!cmit)
+ usage(describe_usage);
+
if (!initialized) {
initialized = 1;
for_each_ref(get_name);
diff --combined file
یا به این شکل (هنگامی که از گزینه --cc استفاده شود):
diff --cc file
index <hash>,<hash>..<hash> mode <mode>,<mode>..<mode> new file mode <mode> deleted file mode <mode>,<mode>
خط mode <mode>,<mode>..<mode> تنها زمانی ظاهر میشود که دستکم یکی از <mode>ها با بقیه متفاوت باشد. هدرهای گسترشیافته با اطلاعات مربوط به جابهجایی محتوای شناساییشده (تشخیص تغییر نام و رونوشت) برای کار با تفاوت دو <tree-ish> طراحی شدهاند و توسط قالب تفاوت ترکیبی استفاده نمیشوند.
--- a/file +++ b/file
مشابه هدر دوخطی برای قالب تفاوت سنتی unified, از /dev/null برای نشان دادن فایلهای ایجادشده یا حذفشده استفاده میشود.
با این حال، اگر گزینه --combined-all-paths ارائه شود، بهجای یک هدر دوخطی from-file/to-file، یک هدر N+1 خطی from-file/to-file دریافت میکنید که N تعداد والدین در کامیت ادغام است:
--- a/file --- a/file --- a/file +++ b/file
این قالب گسترشیافته میتواند در صورت فعال بودن تشخیص تغییر نام یا کپی سودمند باشد، تا به شما امکان دهد نام اصلی فایل را در والدین مختلف مشاهده فرمایید.
@@@ <from-file-range> <from-file-range> <to-file-range> @@@
در هدر قطعه برای قالب تفاوت ترکیبی، به تعداد (تعداد والدین + ۱) نویسه @ وجود دارد.
برخلاف قالب سنتی diff یکپارچه (unified) که دو فایل A و B را با یک ستون منفرد شامل پیشوندهای - (منفی — در A ظاهر شده اما در B حذف شده)، + (مثبت — در A وجود نداشته اما در B اضافه شده)، یا " " (فاصله — بدون تغییر) نمایش میدهد، این قالب دو یا چند فایل file1, file2,... را با یک فایل X مقایسه کرده و نشان میدهد چگونه X با هر یک از fileN تفاوت دارد. یک ستون برای هر یک از fileN به ابتدای خط خروجی اضافه میشود تا مشخص شود خط X چگونه با آن تفاوت دارد.
نویسه - در ستون N به این معنی است که خط در fileN ظاهر شده اما در نتیجه دیده نمیشود. نویسه + در ستون N یعنی خط در نتیجه ظاهر شده و fileN آن خط را ندارد (به عبارت دیگر، از دیدگاه آن والد، خط اضافه شده است).
در خروجی نمونه بالا، امضای تابع از هر دو فایل تغییر کرده بود (بنابراین دو حذف - از هر دو file1 و file2، به علاوه ++ به این معنی که یک خط اضافهشده در هیچیک از file1 یا file2 ظاهر نمیشود). همچنین، هشت خط دیگر از file1 یکسان هستند اما در file2 ظاهر نمیشوند (بنابراین با پیشوند + مشخص شدهاند).
هنگامی که توسط git diff-tree -c نشان داده شود، والدین یک کامیت ادغام را با نتیجه ادغام مقایسه میکند (یعنی file1..fileN والدین هستند). هنگامی که توسط git diff-files -c نشان داده شود، دو والد ادغام حلنشده را با فایل درخت کاری مقایسه میکند (یعنی file1 مرحله ۲ با نام "نسخه ما"، file2 مرحله ۳ با نام "نسخه آنها" است).
مثالها (EXAMPLES)
git log --no-merges
git log v2.6.12.. include/scsi drivers/scsi
git log --since="2 weeks ago" -- gitk
git log --name-status release..test
git log --follow builtin/rev-list.c
git log --branches --not --remotes=origin
git log master --not --remotes=*/master
git log -p -m --first-parent
git log -L '/int main/',/^}/:main.c
git log -3
بحث و بررسی (DISCUSSION)
گیت تا حدودی نسبت به کدگذاری نویسهها خنثی (agnostic) عمل میکند.
توجه داشته باشید که گیت در سطح هسته با نام مسیرها صرفاً بهعنوان توالیهایی از بایتهای غیر-NUL رفتار میکند و هیچ تبدیل کدگذاری نام مسیر وجود ندارد (به جز در مک و ویندوز). بنابراین، استفاده از نام مسیرهای غیر-ASCII حتی روی پلتفرمها و سیستمهای فایلی که از کدگذاریهای سنتی ASCII گسترشیافته استفاده میکنند، عمدتاً کار خواهد کرد. با این حال، مخازن ایجادشده در چنین سیستمهایی روی سیستمهای مبتنی بر UTF-8 (مانند لینوکس، مک، ویندوز) به درستی کار نخواهند کرد و بالعکس. علاوه بر این، بسیاری از ابزارهای مبتنی بر گیت صرفاً فرض میکنند نام مسیرها UTF-8 هستند و در نمایش صحیح سایر کدگذاریها ناموفق خواهند بود.
اگرچه توصیه میکنیم پیامهای لاگ کامیت با UTF-8 کدگذاری شوند، هم هسته و هم ابزارهای سطح بالای گیت (Porcelain) بهگونهای طراحی شدهاند که UTF-8 را به پروژهها تحمیل نکنند. اگر همه مشارکتکنندگان یک پروژه خاص استفاده از کدگذاریهای سنتی را راحتتر بدانند، گیت آن را منع نمیکند. با این حال، چند نکته را باید به خاطر داشت.
[i18n]
commitEncoding = ISO-8859-1
اشیای کامیت ایجادشده با تنظیمات فوق، مقدار i18n.commitEncoding را در هدر encoding خود ثبت میکنند. این برای کمک به افراد دیگری است که بعداً به آنها نگاه میکنند. عدم وجود این هدر نشان میدهد که پیام لاگ کامیت به صورت UTF-8 کدگذاری شده است.
[i18n]
logOutputEncoding = ISO-8859-1
اگر این متغیر پیکربندی را نداشته باشید، مقدار i18n.commitEncoding بهجای آن استفاده میشود.
توجه داشته باشید که ما عمداً تصمیم گرفتیم هنگام ثبت یک کامیت، پیام لاگ کامیت را مجدداً کدگذاری نکنیم تا UTF-8 را در سطح شیء کامیت تحمیل نکنیم، زیرا بازکدگذاری به UTF-8 لزوماً یک عملیات برگشتپذیر نیست.
پیکربندی (CONFIGURATION)
برای متغیرهای هسته به git-config(1) و برای تنظیمات مربوط به تولید تفاوت به git-diff(1) مراجعه فرمایید.
format.pretty
i18n.logOutputEncoding
تمام موارد بالای این خط در این بخش از مستندات git-config(1) درج نشدهاند. محتوایی که در ادامه میآید همان مواردی است که در آنجا یافت میشود:
log.abbrevCommit
log.date
اگر قالب روی "auto:foo" تنظیم شده باشد و صفحهبندی (pager) در حال استفاده باشد، قالب "foo" برای قالب تاریخ استفاده خواهد شد. در غیر این صورت، از "default" استفاده میشود.
log.decorate
short
full
auto
این معادل گزینه --decorate از git log است.
log.initialDecorationSet
log.excludeDecoration
log.diffMerges
log.follow
log.graphColors
log.showRoot
log.showSignature
log.mailmap
notes.mergeStrategy
این تنظیم را میتوان با ارسال گزینه --strategy به git-notes(1) بازنویسی کرد.
notes.<name>.mergeStrategy
notes.displayRef
این تنظیم را میتوان با متغیر محیطی GIT_NOTES_DISPLAY_REF که باید فهرستی از ارجاعها یا globهای جداشده با دو نقطه باشد بازنویسی کرد.
برای ارجاعهایی که وجود ندارند هشداری صادر میشود، اما الگوی glob که با هیچ ارجاعی تطابق نداشته باشد بدون هشدار نادیده گرفته میشود.
این تنظیم را میتوان با گزینه --no-notes برای خانواده دستورات git-log(1) یا با گزینه --notes=<ref> پذیرفتهشده توسط آن دستورات غیرفعال کرد.
مقدار مؤثر core.notesRef (که احتمالاً توسط GIT_NOTES_REF بازنویسی شده است) نیز بهطور ضمنی به فهرست ارجاعهای نمایشدادهشده اضافه میشود.
notes.rewrite.<command>
این تنظیم را میتوان با متغیر محیطی GIT_NOTES_REWRITE_REF که باید فهرستی از ارجاعها یا globهای جداشده با دو نقطه باشد بازنویسی کرد.
notes.rewriteMode
این تنظیم را میتوان با متغیر محیطی GIT_NOTES_REWRITE_MODE بازنویسی کرد.
notes.rewriteRef
مقدار پیشفرض ندارد؛ برای فعالسازی بازنویسی یادداشت باید این متغیر را پیکربندی کنید. برای فعال کردن بازنویسی برای یادداشتهای کامیت پیشفرض، آن را روی refs/notes/commits تنظیم فرمایید.
میتواند با متغیر محیطی GIT_NOTES_REWRITE_REF بازنویسی شود. برای شرح بیشتر قالب آن به notes.rewrite.<command> در بالا مراجعه کنید.
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |