| GIT-SHOW(1) | دستورات عمومی کاربر | GIT-SHOW(1) |
نام (NAME)
git-show - نمایش انواع مختلف اشیاء
خلاصه دستور (SYNOPSIS)
git show [<options>] [<object>...]
توضیحات (DESCRIPTION)
یک یا چند شیء (blobها، درختها، برچسبها و کامیتها) را نمایش میدهد.
برای کامیتها، پیام لاگ و تفاضل متنی (textual diff) را نمایش میدهد. همچنین کامیت ادغام (merge) را با قالب ویژهای که توسط git diff-tree --cc تولید میشود ارائه میکند.
برای برچسبها، پیام برچسب و اشیای ارجاعشده را نشان میدهد.
برای درختها، نامها را نمایش میدهد (معادل git ls-tree با --name-only).
برای blobهای ساده، محتویات متنی ساده را نمایش میدهد.
برخی از گزینههایی که دستور git log میفهمد را میتوان برای کنترل نحوه نمایش تغییرات ارائهشده توسط کامیت استفاده کرد.
این صفحه راهنما تنها پرکاربردترین گزینهها را شرح میدهد.
گزینهها (OPTIONS)
<object>...
--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
قالبهای نمایشی (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)
گزینههای زیر را میتوان برای تغییر نحوهی تولید خروجی تفاضل (diff) توسط git show به کار برد.
-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>، کامیتی با تفاوتهای زیر در همان فایل را در نظر بگیرید:
+ 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> تعیین میشود. تمام فایلهایی با نام مسیر که با الگوی اول مطابقت دارند ابتدا در خروجی میآیند، تمام فایلهایی با نام مسیر که با الگوی دوم (اما نه اول) مطابقت دارند در ادامه میآیند، و به همین ترتیب. تمام فایلهایی با نام مسیر که با هیچ الگویی مطابقت ندارند در آخر خروجی داده میشوند، گویی یک الگوی ضمنی تطبیق با همه در انتهای فایل وجود دارد. اگر چند نام مسیر رتبه یکسانی داشته باشند (با یک الگو مطابقت دارند و با هیچ الگوی قبلی مطابقت ندارند)، ترتیب خروجی آنها نسبت به یکدیگر همان ترتیب عادی است.
<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>
اگر هیچ pathspec مشخص نشده باشد، عمق طوری محاسبه میشود که گویی تمام ورودیهای سطح بالا (top-level) مشخص شدهاند. توجه داشته باشید که این با محاسبه از ریشه متفاوت است، زیرا --max-depth=0 همچنان foo را برمیگرداند. این ویژگی به شما اجازه میدهد تا عمق را محدود کنید در حالی که زیرمجموعهای از ورودیهای سطح بالا را درخواست میکنید.
توجه داشته باشید که این گزینه فقط برای diff بین اشیاء درخت (tree objects) پشتیبانی میشود، نه در برابر نمایه (index) یا درخت کاری (working tree).
برای توضیحات دقیقتر درباره این گزینههای مشترک، به 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 متن وصله تولید میکند. میتوانید ایجاد متن وصله را از طریق متغیرهای محیطی 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/ نیستند.
شاخص شباهت (similarity index) درصد خطوط تغییرنیافته و شاخص عدم شباهت (dissimilarity index) درصد خطوط تغییریافته است. این مقدار یک عدد صحیح گرد شده به سمت پایین است که پس از آن علامت درصد میآید. بنابراین مقدار شاخص شباهت ۱۰۰٪ برای دو پرونده یکسان اختصاص دارد، در حالی که ۱۰۰٪ عدم شباهت بدین معنی است که هیچ خطی از پرونده قدیمی به پرونده جدید راه نیافته است.
خط 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)
هر دستور تولیدکننده تفاضل میتواند گزینه -c یا --cc را برای تولید یک تفاضل ترکیبی (combined diff) هنگام نمایش یک ادغام دریافت کند. این قالب پیشفرض هنگام نمایش ادغامها با git-diff(1) یا git-show(1) است. همچنین توجه داشته باشید که میتوانید گزینه مناسب --diff-merges را به هر یک از این دستورات بدهید تا تولید تفاضلها را در یک قالب مشخص اجبار کند.
یک قالب "تفاضل ترکیبی" به این شکل است:
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> @@@
در هدر قطعه برای قالب تفاضل ترکیبی تعداد (تعداد والدها + ۱) نویسه @ وجود دارد.
برخلاف قالب سنتی تفاضل یکپارچه (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 show v1.0.0
git show v1.0.0^{tree}
git show -s --format=%s v1.0.0^{commit}
git show next~10:Documentation/README
git show master:Makefile master:t/Makefile
بحث و بررسی (DISCUSSION)
گیت تا حدودی نسبت به کدگذاری نویسهها (character encoding) بیتفاوت (agnostic) است.
توجه داشته باشید که گیت در سطح هسته با نام مسیرها صرفاً به عنوان توالیهایی از بایتهای غیر NUL رفتار میکند؛ هیچ تبدیل کدگذاری برای نام مسیرها وجود ندارد (به جز در مک و ویندوز). بنابراین، استفاده از نام مسیرهای غیر ASCII حتی روی پلتفرمها و سیستمهای پروندهای که از کدگذاریهای قدیمی ASCII توسعهیافته استفاده میکنند، عمدتاً کار خواهد کرد. با این حال، مخازن ایجادشده روی چنین سیستمهایی روی سیستمهای مبتنی بر UTF-8 (مانند لینوکس، مک، ویندوز) به درستی کار نخواهند کرد و بالعکس. علاوه بر این، بسیاری از ابزارهای مبتنی بر گیت صرفاً فرض میکنند که نام مسیرها UTF-8 هستند و در نمایش صحیح سایر کدگذاریها ناموفق خواهند بود.
اگرچه ما تشویق میکنیم که پیامهای لاگ کامیت با UTF-8 کدگذاری شوند، هسته گیت و ابزارهای لایه کاربری (Git Porcelain) به گونهای طراحی شدهاند که UTF-8 را به پروژهها تحمیل نکنند. اگر همه مشارکتکنندگان یک پروژه خاص استفاده از کدگذاریهای سنتی را راحتتر میدانند، گیت آن را منع نمیکند. با این حال، چند نکته وجود دارد که باید در نظر داشت.
[i18n]
commitEncoding = ISO-8859-1
اشیای کامیت ایجادشده با تنظیمات فوق، مقدار i18n.commitEncoding را در هدر encoding خود ثبت میکنند. این کار برای کمک به دیگرانی است که بعداً به آنها نگاه میکنند. نبود این هدر نشاندهنده این است که پیام لاگ کامیت با UTF-8 کدگذاری شده است.
[i18n]
logOutputEncoding = ISO-8859-1
اگر این متغیر پیکربندی را نداشته باشید، مقدار i18n.commitEncoding به جای آن استفاده میشود.
توجه داشته باشید که ما عمداً تصمیم گرفتیم هنگام ایجاد یک کامیت، پیام لاگ کامیت را برای تحمیل UTF-8 در سطح شیء کامیت دوباره کدگذاری نکنیم، زیرا بازکدگذاری به UTF-8 لزوماً یک عملیات برگشتپذیر نیست.
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |