GIT-DIFF-INDEX(1) Git Manual GIT-DIFF-INDEX(1)

git-diff-index - مقایسه یک درخت با درخت کاری یا ایندکس

git diff-index [-m] [-ached] [--merge-base] [<گزینه‌های-تفاضل-عمومی>] <tree-ish> [<مسیر>...]

محتوا و حالت blobهای موجود در یک شیء درختی را با فایل‌های ردگیری‌شده متناظر در درخت کاری، یا با مسیرهای متناظر در ایندکس مقایسه می‌کند. هنگامی که آرگومان‌های <مسیر> مشخص شوند، تنها مسیرهای منطبق با آن الگوها مقایسه می‌شوند. در غیر این صورت تمام فایل‌های ردگیری‌شده مقایسه خواهند شد.

-p, -u, --patch

تولید پچ (ببینید بخش با عنوان “تولید متن وصله با P- (GENERATING PATCH TEXT WITH -P)”).

-s, --no-patch

فرونشاندن و جلوگیری از تمام خروجی‌های سازوکار diff. برای دستوراتی مانند git show که پچ را به صورت پیش‌فرض نمایش می‌دهند جهت خاموش کردن خروجی آنها، یا برای لغو اثر گزینه‌هایی مانند --patch، --stat که پیش‌تر در خط فرمان در یک نام مستعار (alias) آمده‌اند مفید است.

-U<n>, --unified=<n>

تولید diff با <n> خط زمینه (context). تعداد خطوط زمینه به صورت پیش‌فرض برابر با diff.context یا در صورت تنظیم نشدن متغیر پیکربندی، برابر ۳ است. (-U بدون <n> به دلیل یک رخداد تاریخی به عنوان مترادفی برای -p بدون نمایش خطا پذیرفته می‌شود). مستلزم --patch است.

--output=<file>

ارسال خروجی به یک فایل مشخص به جای خروجی استاندارد (stdout).

--output-indicator-new=<char>, --output-indicator-old=<char>, --output-indicator-context=<char>

مشخص کردن نویسه‌ای که برای نشان دادن خطوط جدید، قدیمی یا زمینه در پچ تولیدشده استفاده می‌شود. این نویسه‌ها به طور معمول به ترتیب +، - و ' ' هستند.

--raw

تولید تفاضل در قالب خام (raw). این حالت پیش‌فرض است.

--patch-with-raw

مترادفی برای -p --raw.

--indent-heuristic

فعال‌سازی روش اکتشافی (heuristic) که مرزهای تکه‌های diff را جابه‌جا می‌کند تا خواندن پچ‌ها آسان‌تر شود. این حالت پیش‌فرض است.

--no-indent-heuristic

غیرفعال کردن روش اکتشافی تورفتگی (indent heuristic).

--minimal

صرف زمان اضافه برای اطمینان از تولید کوچک‌ترین diff ممکن.

--patience

تولید diff با استفاده از الگوریتم «patience diff».

--histogram

تولید diff با استفاده از الگوریتم «histogram diff».

--anchored=<text>

تولید diff با استفاده از الگوریتم «anchored diff».

این گزینه ممکن است بیش از یک بار مشخص شود.

اگر خطی در هر دو مبدا و مقصد وجود داشته باشد، فقط یک بار تکرار شده باشد و با <text> شروع شود، این الگوریتم تلاش می‌کند تا از نمایش آن به عنوان حذف یا افزودن در خروجی جلوگیری کند. این الگوریتم در درون خود از الگوریتم «patience diff» استفاده می‌کند.

--diff-algorithm=(patience|minimal|histogram|myers)

انتخاب یک الگوریتم diff. انواع آن به شرح زیر است:

default, myers

الگوریتم پایه‌ای و حریصانه diff. در حال حاضر این گزینه پیش‌فرض است.

minimal

صرف زمان اضافه برای اطمینان از تولید کوچک‌ترین diff ممکن.

patience

استفاده از الگوریتم «patience diff» هنگام تولید پچ‌ها.

histogram

این الگوریتم، الگوریتم patience را برای «پشتیبانی از عناصر مشترک با تکرار کم» گسترش می‌دهد.

به عنوان مثال، اگر متغیر diff.algorithm را روی مقداری غیر از پیش‌فرض تنظیم کرده‌اید و می‌خواهید از مقدار پیش‌فرض استفاده کنید، باید از گزینه --diff-algorithm=default استفاده نمایید.

--stat[=<width>[,<name-width>[,<count>]]]

تولید یک diffstat. به طور پیش‌فرض، به اندازه مورد نیاز فضا برای بخش نام فایل استفاده می‌شود و باقیمانده برای بخش نمودار اختصاص می‌یابد. حداکثر عرض به طور پیش‌فرض برابر با عرض ترمینال، یا ۸۰ ستون در صورت عدم اتصال به ترمینال است و می‌تواند با <width> بازنویسی شود. عرض بخش نام فایل را می‌توان با دادن عرض دیگری مانند <name-width> پس از یک کاما یا با تنظیم diff.statNameWidth=<name-width> محدود کرد. عرض بخش نمودار را می‌توان با استفاده از --stat-graph-width=<graph-width> یا با تنظیم diff.statGraphWidth=<graph-width> محدود نمود. استفاده از --stat یا --stat-graph-width روی تمام دستوراتی که یک نمودار آماری (stat graph) تولید می‌کنند اثر می‌گذارد، در حالی که تنظیم diff.statNameWidth یا diff.statGraphWidth روی git format-patch اثری ندارد. با دادن پارامتر سوم <count>، می‌توانید خروجی را به اولین <count> خط محدود کنید، که در صورت وجود خطوط بیشتر، با ... دنبال می‌شود.

این پارامترها را می‌توان به طور جداگانه با --stat-width=<width>، --stat-name-width=<name-width> و --stat-count=<count> نیز تنظیم کرد.

--compact-summary

ارائه یک خلاصه فشرده از اطلاعات سرآیند گسترش‌یافته مانند ایجاد یا حذف فایل‌ها (‎"new"‎ یا ‎"gone"‎، و در صورت پیوند نمادین بودن به صورت اختیاری +l) و تغییرات حالت دسترسی (+x یا -x به ترتیب برای افزودن یا حذف بیت اجرایی) در diffstat. این اطلاعات بین بخش نام فایل و بخش نمودار قرار می‌گیرند. مستلزم --stat است.

--numstat

مشابه --stat، اما تعداد خطوط افزوده و حذف‌شده را در نماد ده‌دهی و نام مسیر را بدون اختصار نمایش می‌دهد تا برای پردازش ماشینی مناسب‌تر باشد. برای فایل‌های باینری، به جای نمایش 0 0، دو - خروجی می‌دهد.

--shortstat

فقط نمایش آخرین خط از قالب --stat شامل تعداد کل فایل‌های تغییریافته، و همچنین تعداد خطوط افزوده و حذف‌شده.

-X [<param>,...], --dirstat[=<param>,...]

نمایش توزیع میزان نسبی تغییرات برای هر زیردایرکتوری. رفتار --dirstat را می‌توان با ارسال فهرستی از پارامترهای جداشده با کاما سفارشی‌سازی کرد. مقادیر پیش‌فرض توسط متغیر پیکربندی diff.dirstat کنترل می‌شوند (به git-config(1) مراجعه کنید). پارامترهای زیر در دسترس هستند:

changes

محاسبه اعداد dirstat با شمارش خطوطی که از مبدا حذف شده یا به مقصد اضافه شده‌اند. این حالت میزان جابه‌جایی‌های صرف کد درون یک فایل را نادیده می‌گیرد. به عبارت دیگر، بازآرایی خطوط در یک فایل به اندازه سایر تغییرات به حساب نمی‌آید. این رفتار پیش‌فرض در صورت عدم ارائه پارامتر است.

lines

محاسبه اعداد dirstat با انجام تحلیل معمول diff مبتنی بر خط، و جمع زدن تعداد خطوط حذف‌شده/افزوده‌شده. (برای فایل‌های باینری، به جای آن تکه‌های ۶۴ بایتی شمرده می‌شوند، زیرا فایل‌های باینری مفهوم طبیعی از خط ندارند). این یک رفتار با هزینه پردازشی بیشتر برای --dirstat نسبت به رفتار changes است، اما خطوط بازآرایی‌شده درون یک فایل را نیز به اندازه سایر تغییرات به حساب می‌آورد. خروجی حاصل با آنچه از سایر گزینه‌های --*stat دریافت می‌کنید سازگار و یکدست است.

files

محاسبه اعداد dirstat با شمارش تعداد فایل‌های تغییریافته. هر فایل تغییریافته در تحلیل dirstat به طور یکسان شمرده می‌شود. این از نظر محاسباتی کم‌هزینه‌ترین رفتار --dirstat است، زیرا اصلاً نیازی به بررسی محتوای فایل‌ها ندارد.

cumulative

شمارش تغییرات در دایرکتوری فرزند برای دایرکتوری والد نیز. توجه داشته باشید که هنگام استفاده از cumulative، مجموع درصدهای گزارش‌شده ممکن است از ۱۰۰٪ فراتر رود. رفتار پیش‌فرض (غیرتجمعی) را می‌توان با پارامتر noncumulative مشخص کرد.

<limit>

یک پارامتر عدد صحیح که درصد آستانه قطع (به طور پیش‌فرض ۳٪) را مشخص می‌کند. دایرکتوری‌هایی که سهم آن‌ها از تغییرات کمتر از این درصد باشد در خروجی نمایش داده نمی‌شوند.

مثال: دستور زیر فایل‌های تغییریافته را شمارش می‌کند، در حالی که دایرکتوری‌هایی با سهم کمتر از ۱۰٪ از مجموع فایل‌های تغییریافته را نادیده گرفته و شمارش دایرکتوری‌های فرزند را در دایرکتوری‌های والد تجمیع می‌کند: --dirstat=files,10,cumulative.

--cumulative

مترادفی برای --dirstat=cumulative.

--dirstat-by-file[=<param>,...]

مترادفی برای --dirstat=files,<param>,....

--summary

ارائه خلاصه‌ای فشرده از اطلاعات سرایند گسترش‌یافته مانند ایجاد فایل‌ها، تغییر نام‌ها و تغییرات حالت/مجوز دسترسی (mode).

--patch-with-stat

مترادفی برای -p --stat.

-z

هنگامی که گزینه‌های --raw، --numstat، --name-only یا --name-status داده شده باشند، نام مسیرها را دستکاری نکرده و از نویسه‌های NUL به عنوان پایان‌دهنده فیلدهای خروجی استفاده می‌کند.

بدون این گزینه، نام مسیرهای دارای کاراکترهای «غیرمعمول» همان‌طور که برای متغیر پیکربندی core.quotePath توضیح داده شده نقل‌قول (quote) می‌شوند (به git-config(1) مراجعه کنید).

--name-only

تنها نمایش نام هر فایل تغییریافته در درخت پس‌تصویر (post-image). نام فایل‌ها اغلب با UTF-8 کدگذاری شده‌اند. برای اطلاعات بیشتر به توضیحات مربوط به کدگذاری در صفحه راهنمای git-log(1) مراجعه کنید.

--name-status

تنها نمایش نام (یا نام‌ها) و وضعیت هر فایل تغییریافته. برای آگاهی از مفهوم حروف وضعیت، به توضیحات گزینه --diff-filter مراجعه کنید. درست مانند --name-only، نام فایل‌ها اغلب با UTF-8 کدگذاری شده‌اند.

--submodule[=<format>]

مشخص کردن نحوه نمایش تفاوت‌ها در زیرماژول‌ها (submodules). هنگام مشخص کردن --submodule=short از قالب short استفاده می‌شود. این قالب فقط نام کامیت‌ها را در ابتدا و انتهای بازه نشان می‌دهد. هنگامی که --submodule یا --submodule=log مشخص شود، از قالب log استفاده می‌شود. این قالب مانند git-submodule(1) summary کامیت‌های موجود در بازه را فهرست می‌کند. هنگامی که --submodule=diff مشخص شود، از قالب diff استفاده می‌شود. این قالب یک diff درون‌خطی از تغییرات در محتویات زیرماژول میان بازه کامیت‌ها را نشان می‌دهد. در صورت عدم تنظیم گزینه پیکربندی، مقدار پیش‌فرض برابر با diff.submodule یا قالب short است.

--color[=<when>]

نمایش diff رنگی. گزینه --color (یعنی بدون =<when>) معادل --color=always است. <when> می‌تواند یکی از مقادیر always، never یا auto باشد. این مقدار را می‌توان با تنظیمات پیکربندی color.ui و color.diff تغییر داد.

--no-color

غیرفعال کردن نمایش رنگی diff. از این گزینه می‌توان برای لغو و بازنویسی تنظیمات پیکربندی استفاده کرد. این گزینه معادل --color=never است.

--color-moved[=<mode>]

خطوط جابه‌جاشده کد به رنگ متفاوتی نمایش داده می‌شوند. این رفتار را می‌توان با تنظیم پیکربندی diff.colorMoved تغییر داد. مقدار <mode> در صورت ارائه نشدن گزینه، به طور پیش‌فرض برابر با no و اگر گزینه بدون حالت مشخص شود، به طور پیش‌فرض برابر با zebra است. این حالت باید یکی از موارد زیر باشد:

no

خطوط جابه‌جاشده برجسته (هایلایت) نمی‌شوند.

default

مترادفی برای zebra است. این مقدار ممکن است در آینده به یک حالت منطقی‌تر تغییر کند.

plain

هر خطی که در یک مکان اضافه شده و در مکان دیگری حذف شده باشد، با رنگ color.diff.newMoved رنگ‌آمیزی خواهد شد. به همین ترتیب color.diff.oldMoved برای خطوط حذف‌شده‌ای استفاده خواهد شد که در جای دیگری از diff اضافه شده‌اند. این حالت هر خط جابه‌جاشده‌ای را شناسایی می‌کند، اما در بازبینی کد برای تعیین اینکه آیا یک بلوک کد بدون تغییر ترتیب جابه‌جا شده است یا خیر چندان مفید نیست.

blocks

بلوک‌هایی از متن جابه‌جاشده که دست‌کم ۲۰ نویسه الفبایی-عددی دارند به صورت حریصانه شناسایی می‌شوند. بلوک‌های شناسایی‌شده با استفاده از رنگ color.diff.(old|new)Moved رنگ‌آمیزی می‌شوند. بلوک‌های مجاور از یکدیگر قابل تشخیص نیستند.

zebra

بلوک‌های متن جابه‌جاشده همانند حالت blocks شناسایی می‌شوند. بلوک‌ها با استفاده از رنگ color.diff.(old|new)Moved یا color.diff.(old|new)MovedAlternative رنگ‌آمیزی می‌شوند. تغییر میان این دو رنگ نشان می‌دهد که یک بلوک جدید شناسایی شده است.

dimmed-zebra

مشابه حالت zebra، اما بخش‌های کم‌اهمیت‌تر کد جابه‌جاشده علاوه بر آن کم‌رنگ (dim) می‌شوند. خطوط مرزی میان دو بلوک مجاور مهم تلقی شده و بقیه بخش‌ها کم‌اهمیت در نظر گرفته می‌شوند. dimmed_zebra یک مترادف منسوخ‌شده برای آن است.

--no-color-moved

غیرفعال کردن تشخیص جابه‌جایی. از این گزینه می‌توان برای لغو و بازنویسی تنظیمات پیکربندی استفاده کرد. این گزینه معادل --color-moved=no است.

--color-moved-ws=<mode>,...

این گزینه نحوه نادیده گرفتن فاصله‌های خالی را هنگام انجام تشخیص جابه‌جایی برای --color-moved پیکربندی می‌کند. این تنظیم می‌تواند توسط متغیر پیکربندی diff.colorMovedWS تنظیم شود. این حالت‌ها را می‌توان به صورت فهرستی جداشده با کاما مشخص کرد:

no

هنگام انجام تشخیص جابه‌جایی، فاصله‌های خالی نادیده گرفته نمی‌شوند.

ignore-space-at-eol

نادیده گرفتن تغییرات فاصله‌های خالی در انتهای خط (EOL).

ignore-space-change

نادیده گرفتن تغییرات در مقدار فاصله‌های خالی. این حالت فاصله‌های خالی انتهای خط را نادیده می‌گیرد و تمامی توالی‌های دیگر از یک یا چند نویسه فاصله خالی را معادل یکدیگر در نظر می‌گیرد.

ignore-all-space

نادیده گرفتن فاصله‌های خالی هنگام مقایسه خطوط. این حالت تفاوت‌ها را حتی اگر یک خط دارای فاصله خالی باشد و خط دیگر فاقد آن باشد نادیده می‌گیرد.

allow-indentation-change

در ابتدا هرگونه فاصله خالی در تشخیص جابه‌جایی نادیده گرفته می‌شود، سپس بلوک‌های کد جابه‌جاشده تنها در صورتی در یک بلوک گروه‌بندی می‌شوند که تغییر در فاصله خالی به ازای هر خط یکسان باشد. این حالت با سایر حالت‌ها ناسازگار است.

--no-color-moved-ws

هنگام انجام تشخیص جابه‌جایی، فاصله‌های خالی را نادیده نگیر. از این گزینه می‌توان برای لغو و بازنویسی تنظیمات پیکربندی استفاده کرد. این گزینه معادل --color-moved-ws=no است.

--word-diff[=<mode>]

به طور پیش‌فرض، کلمات با فاصله‌های خالی از هم جدا می‌شوند؛ به --word-diff-regex در زیر مراجعه کنید. مقدار <mode> به طور پیش‌فرض برابر با plain است و باید یکی از موارد زیر باشد:

color

برجسته کردن کلمات تغییریافته تنها با استفاده از رنگ‌ها. این گزینه مستلزم --color است.

plain

نمایش کلمات به صورت [-removed-] و {added}. هیچ تلاشی برای اسکیپ کردن جداکننده‌ها در صورت ظاهر شدن آن‌ها در ورودی انجام نمی‌شود، بنابراین ممکن است خروجی مبهم باشد.

porcelain

استفاده از یک قالب مبتنی بر خط ویژه که برای مصرف و پردازش در اسکریپت‌ها در نظر گرفته شده است. توالی‌های افزوده‌شده/حذف‌شده/بدون‌تغییر در قالب معمول diff یکپارچه (unified diff) چاپ می‌شوند، که با یک نویسه +/-/` ` در ابتدای خط شروع شده و تا انتهای خط ادامه می‌یابند. خطوط جدید (newlines) در ورودی با یک علامت تیلدا ~ در یک خط جداگانه نشان داده می‌شوند.

none

غیرفعال کردن مجدد تفاوت کلمه‌ای (word diff).

توجه داشته باشید که با وجود نام حالت اول، در صورت فعال بودن، در تمامی حالت‌ها برای برجسته‌سازی بخش‌های تغییریافته از رنگ استفاده می‌شود.

گزینه --word-diff با گرفتن همان diff خط‌به‌خطی که بدون این گزینه تولید می‌شود و سپس محاسبه تغییرات کلمه‌به‌کلمه درون هر قطعه تغییر (hunk) عمل می‌کند. این ممکن است خروجی diff بزرگ‌تری نسبت به خروجی یک ابزار اختصاصی word-diff تولید کند. اگر گیت در آینده پیاده‌سازی متفاوتی را به کار گیرد، خروجی ممکن است تغییر کند. توجه داشته باشید که این مشابه گزینه --diff-algorithm است که آن هم ممکن است خروجی را تغییر دهد.

--word-diff-regex=<regex>

استفاده از <regex> برای تعیین اینکه چه چیزی کلمه محسوب می‌شود، به جای در نظر گرفتن توالی نویسه‌های غیرفاصله به عنوان کلمه. همچنین مستلزم --word-diff است مگر آنکه از قبل فعال شده باشد.

هر تطابق غیرهم‌پوشان با <regex> یک کلمه در نظر گرفته می‌شود. هر چیزی میان این تطابق‌ها فاصله خالی تلقی شده و به منظور یافتن تفاوت‌ها نادیده گرفته می‌شود(!). ممکن است بخواهید |[^[:space:]] را به عبارت باقاعده خود الحاق کنید تا مطمئن شوید که با تمام نویسه‌های غیرفاصله تطابق دارد. تطابقی که شامل خط جدید (newline) باشد به طور خاموش(!) در محل خط جدید بریده می‌شود.

برای مثال، --word-diff-regex=. با هر نویسه مانند یک کلمه رفتار کرده و بر این اساس، تفاوت‌ها را نویسه‌به‌نویسه نمایش می‌دهد.

عبارت باقاعده (regex) را می‌توان از طریق درایور diff یا گزینه پیکربندی نیز تنظیم کرد؛ به gitattributes(5) یا git-config(1) مراجعه کنید. مشخص کردن صریح آن بر هر درایور diff یا تنظیم پیکربندی اولویت داشته و آن را لغو می‌کند. درایورهای diff بر تنظیمات پیکربندی اولویت دارند.

--color-words[=<regex>]

معادل --word-diff=color به همراه (در صورت مشخص شدن یک عبارت منظم) --word-diff-regex=<regex>.

--no-renames

غیرفعال کردن تشخیص تغییر نام، حتی اگر در فایل پیکربندی به صورت پیش‌فرض فعال باشد.

--rename-empty, --no-rename-empty

تعیین این‌که آیا از blobهای خالی به عنوان منبع تغییر نام استفاده شود یا خیر.

--check

هشدار در صورتی که تغییرات باعث ایجاد نشانگرهای تداخل یا خطاهای فاصله خالی شوند. مواردی که خطای فاصله خالی محسوب می‌شوند توسط پیکربندی core.whitespace کنترل می‌گردد. به طور پیش‌فرض، فاصله‌های خالی انتهایی (شامل خطوطی که صرفاً از فاصله خالی تشکیل شده‌اند) و یک نویسه فاصله که بلافاصله پس از آن یک نویسه تب در تورفتگی ابتدای خط آمده باشد، خطای فاصله خالی در نظر گرفته می‌شوند. در صورت یافتن مشکل با وضعیت غیرصفر خارج می‌شود. با --exit-code سازگار نیست.

--ws-error-highlight=<kind>

برجسته‌سازی خطاهای فاصله خالی در خطوط context، old یا new در diff. مقادیر چندگانه با کاما از هم جدا می‌شوند، none مقادیر قبلی را بازنشانی می‌کند، default فهرست را به new بازمی‌گرداند و all یک میانبر برای old,new,context است. هنگامی که این گزینه مشخص نشده باشد و متغیر پیکربندی diff.wsErrorHighlight نیز تنظیم نشده باشد، فقط خطاهای فاصله خالی در خطوط new برجسته می‌شوند. خطاهای فاصله خالی با رنگ color.diff.whitespace رنگ‌آمیزی می‌شوند.

--full-index

هنگام تولید خروجی با فرمت وصله (patch)، به جای نمایش چند نویسه اول، نام کامل اشیای blob مربوط به pre-image و post-image را در خط "index" نمایش می‌دهد.

--binary

علاوه بر --full-index، یک diff باینری تولید می‌کند که می‌تواند با git-apply اعمال شود. متضمن --patch است.

--abbrev[=<n>]

به جای نمایش نام کامل هگزادسیمال ۴۰ بایتی شیء در خروجی فرمت diff-raw و خطوط هدر diff-tree، کوتاه‌ترین پیشوندی را که حداقل به طول <n> رقم هگزادسیمال باشد و به طور یکتا به شیء ارجاع دهد نمایش می‌دهد. در فرمت خروجی diff-patch، گزینه --full-index اولویت بالاتری دارد؛ یعنی اگر --full-index مشخص شده باشد، نام کامل blob بدون در نظر گرفتن --abbrev نمایش داده خواهد شد. تعداد ارقام غیرپیش‌فرض را می‌توان با --abbrev=<n> مشخص کرد.

-B[<n>][/<m>], --break-rewrites[=[<n>][/<m>]]

شکستن تغییرات بازنویسی کامل به جفت‌های حذف و ایجاد. این کار دو هدف را دنبال می‌کند:

بر نحوه نمایش تغییری که معادل بازنویسی کامل یک فایل است تأثیر می‌گذارد؛ به طوری که آن را نه به عنوان مجموعه‌ای از حذف و درج‌های درهم‌آمیخته همراه با چند خط معدود که از نظر متنی به عنوان زمینه (context) مطابقت دارند، بلکه به عنوان یک حذف کامل از تمام محتوای قدیمی به دنبال یک درج کامل از تمام محتوای جدید نشان می‌دهد، و عدد <m> این جنبه از گزینه -B را کنترل می‌کند (به طور پیش‌فرض ۶۰٪). -B/70% مشخص می‌کند که کمتر از ۳۰٪ از فایل اصلی باید در نتیجه باقی بماند تا گیت آن را یک بازنویسی کامل در نظر بگیرد (یعنی در غیر این صورت وصله حاصل مجموعه‌ای از حذف و درج‌های درهم‌آمیخته همراه با خطوط زمینه خواهد بود).

هنگامی که همراه با -M استفاده شود، یک فایل بازنویسی‌شده کامل نیز به عنوان منبع یک تغییر نام در نظر گرفته می‌شود (معمولاً -M تنها فایلی را که ناپدید شده به عنوان منبع تغییر نام در نظر می‌گیرد)، و عدد <n> این جنبه از گزینه -B را کنترل می‌کند (به طور پیش‌فرض ۵۰٪). -B20% مشخص می‌کند که تغییری با افزودن و حذف در مقایسه با ۲۰٪ یا بیشتر از اندازه فایل، واجد شرایط انتخاب به عنوان یک منبع احتمالی برای تغییر نام به فایلی دیگر است.

-M[<n>], --find-renames[=<n>]

تشخیص تغییر نام‌ها. اگر <n> مشخص شود، آستانه‌ای برای شاخص شباهت است (یعنی مقدار افزودن/حذف در مقایسه با اندازه فایل). برای مثال، -M90% بدین معنی است که گیت در صورتی باید یک جفت حذف/افزودن را تغییر نام در نظر بگیرد که بیش از ۹۰٪ فایل تغییر نکرده باشد. بدون علامت %، این عدد به عنوان یک کسر با یک ممیز اعشاری پیش از آن خوانده می‌شود؛ یعنی -M5 تبدیل به ۰٫۵ می‌شود و بنابراین همانند -M50% است. به طور مشابه، -M05 همان -M5% است. برای محدود کردن تشخیص به تغییر نام‌های دقیق، از -M100% استفاده کنید. شاخص شباهت پیش‌فرض ۵۰٪ است.

-C[<n>], --find-copies[=<n>]

تشخیص کپی‌ها و همچنین تغییر نام‌ها. همچنین ببینید --find-copies-harder. اگر <n> مشخص شود، همان معنایی را دارد که برای -M<n> دارد.

--find-copies-harder

به دلایل کارایی و عملکرد، به طور پیش‌فرض گزینه -C کپی‌ها را تنها در صورتی می‌یابد که فایل اصلیِ کپی در همان changeset تغییر یافته باشد. این فلگ باعث می‌شود دستور فایل‌های تغییرنیافته را نیز به عنوان نامزدهای منبع کپی بررسی کند. این یک عملیات بسیار پرهزینه برای پروژه‌های بزرگ است، بنابراین با احتیاط از آن استفاده کنید. دادن بیش از یک گزینه -C همان اثر را دارد.

-D, --irreversible-delete

حذف preimage برای موارد حذف‌شده، یعنی فقط هدر چاپ می‌شود و diff بین preimage و /dev/null چاپ نمی‌گردد. وصله حاصل قرار نیست با patch یا git apply اعمال شود؛ این صرفاً برای افرادی است که می‌خواهند فقط بر بازبینی متن پس از تغییر تمرکز کنند. علاوه بر این، خروجی به وضوح فاقد اطلاعات کافی برای اعمال معکوس چنین وصله‌ای (حتی به صورت دستی) است، از این رو این نام برای گزینه انتخاب شده است.

هنگامی که همراه با -B استفاده شود، preimage در بخش حذف از یک جفت حذف/ایجاد را نیز نادیده می‌گیرد.

-l<num>

گزینه‌های -M و -C شامل برخی مراحل مقدماتی هستند که می‌توانند زیرمجموعه‌هایی از تغییر نام‌ها/کپی‌ها را با هزینه کم تشخیص دهند، و به دنبال آن یک بخش جامع جایگزین وجود دارد که تمام مقصدهای جفت‌نشده باقی‌مانده را با تمام منابع مرتبط مقایسه می‌کند. (برای تغییر نام‌ها، تنها منابع جفت‌نشده باقی‌مانده مرتبط هستند؛ برای کپی‌ها، تمام منابع اصلی مرتبط هستند). برای N منبع و مقصد، این بررسی جامع از مرتبه O(N^2) است. این گزینه در صورتی که تعداد فایل‌های منبع/مقصد درگیر از تعداد مشخص‌شده فراتر رود، از اجرای بخش جامع تشخیص تغییر نام/کپی جلوگیری می‌کند. مقدار پیش‌فرض آن diff.renameLimit است. توجه داشته باشید که مقدار 0 به عنوان نامحدود در نظر گرفته می‌شود.

--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]

تنها فایل‌هایی را انتخاب می‌کند که افزوده‌شده (A)، کپی‌شده (C)، حذف‌شده (D)، تغییریافته (M)، تغییرنام‌یافته (R)، نوع آن‌ها (یعنی فایل معمولی، پیوند نمادین، زیرماژول و ...) تغییر کرده (T)، ادغام‌نشده (U)، ناشناخته (X)، یا جفت‌شدگی آن‌ها شکسته شده باشد (B). از هر ترکیبی از نویسه‌های فیلتر (شامل هیچ‌کدام) می‌توان استفاده کرد. هنگامی که * (همه یا هیچ) به ترکیب افزوده شود، در صورتی که فایلی وجود داشته باشد که با سایر معیارهای مقایسه مطابقت دارد، تمام مسیرها انتخاب می‌شوند؛ اگر فایلی وجود نداشته باشد که با سایر معیارها مطابقت کند، هیچ چیزی انتخاب نمی‌شود.

همچنین، این حروف بزرگ را می‌توان با حروف کوچک نوشت تا مستثنی شوند؛ به عنوان مثال --diff-filter=ad مسیرهای افزوده‌شده و حذف‌شده را مستثنی می‌کند.

توجه داشته باشید که همه diffها نمی‌توانند شامل همه انواع باشند. برای مثال، اگر تشخیص برای آن انواع غیرفعال باشد، موارد کپی‌شده و تغییرنام‌یافته نمی‌توانند ظاهر شوند.

-S<string>

به دنبال تفاوت‌هایی می‌گردد که تعداد رخدادهای <string> مشخص‌شده را در یک فایل تغییر می‌دهند (یعنی افزودن/حذف). برای استفاده اسکریپت‌نویسان در نظر گرفته شده است.

هنگامی که به دنبال یک بلوک دقیق از کد (مانند یک struct) هستید و می‌خواهید تاریخچه آن بلوک را از زمان پیدایش اولیه آن بدانید بسیار مفید است: از این قابلیت به صورت تکرارشونده استفاده کنید تا بلوک مورد نظر در preimage را مجدداً به -S بدهید، و این کار را ادامه دهید تا به اولین نسخه آن بلوک برسید.

فایل‌های باینری نیز جستجو می‌شوند.

-G<regex>

به دنبال تفاوت‌هایی می‌گردد که متن وصله آن‌ها شامل خطوط افزوده‌شده/حذف‌شده‌ای باشد که با <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)

<tree-ish>

شناسه یک شیء درختی برای مقایسه با آن.

--cached

به هیچ‌وجه فایل روی دیسک را در نظر نگیر.

--merge-base

به جای مقایسه مستقیم <tree-ish>، از پایه ادغام (merge base) بین <tree-ish> و HEAD استفاده کن. مقدار <tree-ish> باید یک کامیت باشد.

-m

به طور پیش‌فرض، فایل‌های ثبت‌شده در ایندکس که خارج نشده‌اند (not checked out) به عنوان حذف‌شده گزارش می‌شوند. این فلگ باعث می‌شود git diff-index اعلام کند که تمام فایل‌های خارج‌نشده به‌روز هستند.

قالب خروجی خام در git-diff-index، git-diff-tree، git-diff-files و git diff --raw بسیار مشابه یکدیگر است.

این دستورات همگی دو مجموعه از موارد را با یکدیگر مقایسه می‌کنند؛ اما آنچه مقایسه می‌شود متفاوت است:

git-diff-index <tree-ish>

<tree-ish> و فایل‌های موجود در فایل‌سیستم را مقایسه می‌کند.

git-diff-index --cached <tree-ish>

<tree-ish> و ایندکس را مقایسه می‌کند.

git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]

درخت‌های مشخص‌شده توسط دو آرگومان را مقایسه می‌کند.

git-diff-files [<pattern>...]

ایندکس و فایل‌های موجود در فایل‌سیستم را مقایسه می‌کند.

تمام این دستورات به ازای هر فایل تغییریافته یک خط خروجی چاپ می‌کنند، به جز git diff-files در مورد فایل‌های ادغام‌نشده (unmerged) که هر دو خط “unmerged” و “in-place edit” را چاپ می‌کند.

یک خط خروجی به این صورت قالب‌بندی می‌شود:

in-place edit  :100644 100644 bcd1234 0123456 M file0
copy-edit      :100644 100644 abcd123 1234567 C68 file1 file2
rename-edit    :100644 100644 abcd123 1234567 R86 file1 file3
create         :000000 100644 0000000 1234567 A file4
delete         :100644 000000 1234567 0000000 D file5
unmerged       :000000 000000 0000000 0000000 U file6

بدین صورت که از چپ به راست:

1.یک علامت دو‌نقطه (colon).
2.حالت (mode) برای “src”؛ مقدار 000000 در صورت ایجاد فایل، یا اگر “src” از ایندکس آمده باشد و ادغام‌نشده باشد.
3.یک فاصله (space).
4.حالت (mode) برای “dst”؛ مقدار 000000 در صورت حذف فایل، یا اگر “dst” از ایندکس آمده باشد و ادغام‌نشده باشد.
5.یک فاصله (space).
6.شناسه sha1 برای “src”؛ مقدار 0{40} در صورت ایجاد فایل، یا اگر “src” از ایندکس آمده باشد و ادغام‌نشده باشد.
7.یک فاصله (space).
8.شناسه sha1 برای “dst”؛ مقدار 0{40} در صورت حذف فایل، اگر “dst” از ایندکس آمده باشد و ادغام‌نشده باشد، یا اگر “dst” از درخت کاری بوده و با ایندکس ناهماهنگ باشد.
9.یک فاصله (space).
10.وضعیت (status)، به همراه یک عدد اختیاری “امتیاز” (score).
11.یک کاراکتر tab یا NUL در صورتی که از گزینه -z استفاده شده باشد.
12.مسیر برای “src”
13.یک کاراکتر tab یا NUL در صورتی که از گزینه -z استفاده شده باشد؛ فقط برای C یا R وجود دارد.
14.مسیر برای “dst”؛ فقط برای C یا R وجود دارد.
15.یک کاراکتر LF یا NUL در صورتی که از گزینه -z برای پایان دادن به رکورد استفاده شده باشد.

حروف وضعیت ممکن عبارتند از:

•A: افزودن یک فایل
•C: رونوشت (کپی) از یک فایل در فایلی جدید
•D: حذف یک فایل
•M: تغییر در محتوا یا حالت (mode) یک فایل
•R: تغییر نام یک فایل
•T: تغییر در نوع فایل (فایل معمولی، پیوند نمادین یا زیرماژول)
•U: فایل ادغام‌نشده است (پیش از ثبت/کامیت کردن، باید ادغام را تکمیل کنید)
•X: نوع تغییر “ناشناخته” است (به احتمال زیاد یک باگ است، لطفاً آن را گزارش دهید)

حروف وضعیت C و R همیشه با یک امتیاز همراه هستند (که نشان‌دهنده درصد شباهت میان مبدا و مقصد جابجایی یا رونوشت است). حرف وضعیت M ممکن است برای بازنویسی‌های فایل با یک امتیاز (که نشان‌دهنده درصد عدم شباهت است) همراه باشد.

اگر فایلی در فایل‌سیستم با ایندکس ناهماهنگ باشد، شناسه sha1 برای “dst” تماماً به‌صورت 0 نمایش داده می‌شود.

مثال:

:100644 100644 5be4a4a 0000000 M file.c

بدون گزینه -z، نام مسیرهایی که دارای نویسه‌های “غیرمعمول” هستند همان‌طور که برای متغیر پیکربندی core.quotePath توضیح داده شده است، نقل‌قول (quote) می‌شوند (نگاه کنید به git-config(1)). با استفاده از -z، نام فایل عیناً در خروجی قرار می‌گیرد و خط با یک بایت NUL پایان می‌یابد.

دستورات git-diff-tree، git-diff-files و git-diff --raw می‌توانند گزینه -c یا --cc را برای تولید خروجی تفاضل (diff) برای کامیت‌های ادغام (merge commits) نیز دریافت کنند. خروجی به روش‌های زیر با قالب توصیف‌شده در بالا تفاوت دارد:

1.برای هر والد (parent) یک دو نقطه (:) وجود دارد
2.حالت‌های "src" و sha1های "src" بیشتری وجود دارند
3.وضعیت به‌صورت کاراکترهای وضعیت متصل‌شده (الحاق‌شده) برای هر والد است
4.هیچ عدد اختیاری "امتیاز" (score) وجود ندارد
5.نام مسیر(های) فایل که با کاراکتر تب جدا شده‌اند

برای -c و --cc، تنها مسیر مقصد یا نهایی نشان داده می‌شود، حتی اگر نام فایل در هر طرف از تاریخچه تغییر کرده باشد (تغییر نام داده شده باشد). با --combined-all-paths، نام مسیر در هر والد و به دنبال آن نام مسیر در کامیت ادغام نمایش داده می‌شود.

مثال‌هایی برای -c و --cc بدون --combined-all-paths:

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM       desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM       bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR       phooey.c

مثال‌ها زمانی که --combined-all-paths به -c یا --cc اضافه شده باشد:

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM       desc.c  desc.c  desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM       foo.sh  bar.sh  bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR       fooey.c fuey.c  phooey.c

توجه داشته باشید که combined diff (تفاضل ترکیبی) فقط فایل‌هایی را فهرست می‌کند که نسبت به همه والدین اصلاح شده باشند.

اجرای 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 تولید می‌کند کمی با قالب تفاضل سنتی متفاوت است:

1.پیش از آن یک هدر "git diff" قرار دارد که شبیه به این است:
diff --git a/file1 b/file2

نام فایل‌های a/ و b/ یکسان هستند مگر آنکه تغییر نام/رونوشت در میان باشد. به‌ویژه، حتی برای ایجاد یا حذف فایل، /dev/null به جای نام فایل‌های a/ یا b/ استفاده نمی‌شود.

هنگامی که تغییر نام/رونوشت رخ داده باشد، file1 و file2 به ترتیب نام فایل مبدا تغییر نام/رونوشت و نام فایلی که تغییر نام/رونوشت تولید می‌کند را نشان می‌دهند.

2.پس از آن یک یا چند خط هدر گسترش‌یافته می‌آید:
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> گنجانده می‌شود؛ در غیر این صورت، خطوط جداگانه حالت‌های قدیمی و جدید را مشخص می‌کنند.

3.نام مسیرهایی که دارای کاراکترهای «غیرمعمول» هستند، همان‌گونه که برای متغیر پیکربندی core.quotePath توضیح داده شده است نقل‌قول می‌شوند (ببینید git-config(1)).
4.همه فایل‌های file1 در خروجی به فایل‌های قبل از کامیت اشاره دارند، و همه فایل‌های file2 به فایل‌های پس از کامیت اشاره دارند. اعمال متوالی هر تغییر بر روی هر فایل نادرست است. برای نمونه، این وصله a و b را با هم جابه‌جا می‌کند:
diff --git a/a b/b
rename from a
rename to b
diff --git a/b b/a
rename from b
rename to a
5.هدرهای قطعه (Hunk headers) نام تابعی را که قطعه بر آن اعمال می‌شود ذکر می‌کنند. برای جزئیات مربوط به نحوه تطبیق این مورد با زبان‌های خاص، بخش "Defining a custom hunk-header" را در gitattributes(5) ببینید.

هر دستوری که خروجی تفاضل (diff) تولید می‌کند، می‌تواند گزینه -c یا --cc را برای تولید یک تفاضل ترکیبی (combined diff) هنگام نمایش ادغام (merge) دریافت کند. این قالب پیش‌فرض هنگام نمایش ادغام‌ها با 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);
1.در ابتدا با یک هدر "git diff" شروع می‌شود که شبیه به این است (زمانی که گزینه -c استفاده شده باشد):
diff --combined file

یا شبیه به این (زمانی که گزینه --cc استفاده شده باشد):

diff --cc file
2.سپس با یک یا چند خط هدر گسترش‌یافته دنبال می‌شود (این مثال یک ادغام با دو والد را نشان می‌دهد):
index <hash>,<hash>..<hash>
mode <mode>,<mode>..<mode>
new file mode <mode>
deleted file mode <mode>,<mode>

خط mode <mode>,<mode>..<mode> تنها در صورتی ظاهر می‌شود که حداقل یکی از <mode>ها با بقیه متفاوت باشد. هدرهای گسترش‌یافته شامل اطلاعاتی درباره جابجایی محتوای شناسایی‌شده (تشخیص تغییر نام و رونوشت) طوری طراحی شده‌اند که با تفاضل دو <tree-ish> کار کنند و توسط قالب تفاضل ترکیبی استفاده نمی‌شوند.

3.سپس با یک هدر دوخطی from-file/to-file دنبال می‌شود:
--- 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

این قالب گسترش‌یافته در صورتی که تشخیص تغییر نام یا رونوشت فعال باشد می‌تواند مفید باشد، تا به شما امکان دهد نام اصلی فایل را در والدین مختلف مشاهده کنید.

4.قالب هدر تکه (chunk) اصلاح شده است تا از ارسال تصادفی آن به patch -p1 جلوگیری شود. قالب تفاضل ترکیبی برای بازبینی تغییرات کامیت ادغام ایجاد شده است و قرار نبوده اعمال (apply) شود. این تغییر شبیه به تغییر در هدر گسترش‌یافته index است:
@@@ <from-file-range> <from-file-range> <to-file-range> @@@

تعداد (تعداد والدین + ۱) نویسه @ در هدر تکه (chunk) برای قالب تفاضل ترکیبی وجود دارد.

برخلاف قالب سنتی تفاضل یکپارچه (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 استیج ۳ با عنوان «نسخه آن‌ها» است).

گزینه --summary فایل‌های تازه اضافه‌شده، حذف‌شده، تغییرنام‌یافته و رونوشت‌شده را توصیف می‌کند. گزینه --stat نمودار diffstat(1) را به خروجی اضافه می‌کند. این گزینه‌ها می‌توانند با سایر گزینه‌ها، مانند -p ترکیب شوند و برای خواندن توسط انسان طراحی شده‌اند.

هنگام نمایش تغییری که شامل تغییر نام یا رونوشت است، خروجی --stat با ترکیب پیشوند و پسوند مشترک نام مسیرها، آن‌ها را به شکلی فشرده قالب‌بندی می‌کند. برای مثال، تغییری که arch/i386/Makefile را به arch/x86/Makefile منتقل کرده و هم‌زمان ۴ خط را تغییر می‌دهد، به این صورت نمایش داده خواهد شد:

arch/{i386 => x86}/Makefile    |   4 +--

گزینه --numstat اطلاعات diffstat(1) را ارائه می‌دهد اما برای پردازش و خواندن آسان‌تر توسط ماشین طراحی شده است. یک ورودی در خروجی --numstat شبیه به این است:

1       2       README
3       1       arch/{i386 => x86}/Makefile

یعنی از چپ به راست:

1.تعداد خطوط اضافه‌شده؛
2.یک نویسه تب (tab)؛
3.تعداد خطوط حذف‌شده؛
4.یک نویسه تب (tab)؛
5.نام مسیر (احتمالاً همراه با اطلاعات تغییر نام/رونوشت)؛
6.یک خط جدید (newline).

هنگامی که گزینه خروجی -z فعال باشد، خروجی به این صورت قالب‌بندی می‌شود:

1       2       README NUL
3       1       NUL arch/i386/Makefile NUL arch/x86/Makefile NUL

یعنی:

1.تعداد خطوط اضافه‌شده؛
2.یک نویسه تب (tab)؛
3.تعداد خطوط حذف‌شده؛
4.یک نویسه تب (tab)؛
5.یک نویسه NUL (تنها در صورت تغییر نام/رونوشت وجود دارد)؛
6.نام مسیر در پیش‌تصویر (preimage)؛
7.یک نویسه NUL (تنها در صورت تغییر نام/رونوشت وجود دارد)؛
8.نام مسیر در پس‌تصویر (postimage) (تنها در صورت تغییر نام/رونوشت وجود دارد)؛
9.یک نویسه NUL.

نویسه اضافی NUL قبل از مسیر پیش‌تصویر در حالت تغییر نام، به اسکریپت‌هایی که خروجی را می‌خوانند اجازه می‌دهد بدون خواندن رو به جلو تشخیص دهند که رکورد فعلی که خوانده می‌شود یک رکورد تک‌مسیره است یا یک رکورد تغییر نام/رونوشت. پس از خواندن خطوط اضافه‌شده و حذف‌شده، خواندن تا NUL نام مسیر را به دست می‌دهد، اما اگر آن مقدار NUL باشد، رکورد دو مسیر را نشان خواهد داد.

می‌توانید انتخاب کنید که آیا می‌خواهید کاملاً به فایل ایندکس اعتماد کنید (با استفاده از فلگ --cached) یا از منطق تفاضل (diff) بخواهید هر فایلی را که با وضعیت stat مطابقت ندارد به عنوان «به طور آزمایشی تغییریافته» نشان دهد. در واقع هر دوی این عملیات بسیار مفید هستند.

اگر --cached مشخص شده باشد، به شما امکان می‌دهد بپرسید:

show me the differences between HEAD and the current index
contents (the ones I'd write using 'git write-tree')

به عنوان مثال، فرض کنید روی دایرکتوری کاری خود کار کرده‌اید، برخی فایل‌ها را در ایندکس به‌روزرسانی کرده‌اید و آماده کامیت هستید. شما می‌خواهید دقیقاً ببینید چه چیزی را قرار است کامیت کنید، بدون اینکه مجبور باشید یک شیء درختی جدید بنویسید و آن را بدین شیوه مقایسه کنید؛ برای انجام این کار، تنها کافی است دستور زیر را اجرا نمایید:

git diff-index --cached HEAD

مثال: فرض کنید نام commit.c را به git-commit.c تغییر داده بودم، و دستور update-index را اجرا کرده بودم تا این تغییر در فایل ایندکس اعمال شود. دستور git diff-files هیچ خروجی‌ای نشان نمی‌داد، زیرا فایل ایندکس با دایرکتوری کاری من مطابقت دارد. اما اجرای git diff-index تفاوت را نشان می‌دهد:

torvalds@ppc970:~/git> git diff-index --cached HEAD
:100644 000000 4161aecc6700a2eb579e842af0b7f22b98443f74 0000000000000000000000000000000000000000 D    commit.c
:000000 100644 0000000000000000000000000000000000000000 4161aecc6700a2eb579e842af0b7f22b98443f74 A    git-commit.c

به راحتی می‌توانید ببینید که خروجی بالا نشان‌دهنده یک تغییر نام است.

در واقع، git diff-index --cached باید همیشه کاملاً معادل اجرای واقعی یک git write-tree و مقایسه آن باشد. با این تفاوت که این دستور برای حالتی که فقط می‌خواهید بررسی کنید در چه وضعیتی هستید بسیار خوشایندتر و راحت‌تر است.

بنابراین اجرای git diff-index --cached اصولاً زمانی بسیار مفید است که از خود می‌پرسید: «چه مواردی را تا کنون برای کامیت شدن علامت‌گذاری کرده‌ام، و تفاوت آن با درخت قبلی چیست؟».

حالت «non-cached» رویکرد متفاوتی را در پیش می‌گیرد و از میان این دو گزینه بالقوه مفیدتر است، از این جهت که عملکرد آن را نمی‌توان با ترکیب git write-tree + git diff-tree شبیه‌سازی کرد. بنابراین، این حالت به صورت پیش‌فرض انتخاب شده است. نسخه non-cached این سؤال را مطرح می‌کند:

show me the differences between HEAD and the currently checked out
tree - index contents _and_ files that aren't up to date

که مشخصاً این نیز سؤال بسیار مفیدی است، زیرا به شما می‌گوید چه چیزهایی را می‌توانید کامیت کنید. مجدداً، خروجی با خروجی git diff-tree -r مو به مو مطابقت دارد، اما با یک تفاوت ظریف.

این تفاوت این است که اگر فایلی با ایندکس مطابقت نداشته باشد، شیء ذخیره‌سازی پشتیبان برای آن نداریم و برای نشان دادن این موضوع از مقدار جادویی sha1 «تمام‌صفر» استفاده می‌کنیم. بنابراین فرض کنید فایل kernel/sched.c را ویرایش کرده‌اید، اما هنوز دستور git update-index را روی آن اجرا نکرده‌اید - در این صورت هیچ «شیئی» متناظر با وضعیت جدید وجود ندارد و شما چنین خروجی‌ای دریافت می‌کنید:

torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD
:100644 100644 7476bb5ba 000000000 M  kernel/sched.c

یعنی نشان می‌دهد که درخت تغییر کرده است و فایل kernel/sched.c به‌روز نیست و ممکن است حاوی موارد جدیدی باشد. شناسه sha1 تمام‌صفر به این معناست که برای به دست آوردن تفاضل واقعی، باید مستقیماً به شیء موجود در دایرکتوری کاری نگاه کنید نه اینکه یک تفاضل شیء به شیء انجام دهید.


نکته

همانند سایر دستورات این نوع، git diff-index در واقع به هیچ وجه به محتوای فایل نگاه نمی‌کند. بنابراین شاید فایل kernel/sched.c واقعاً تغییری نکرده باشد و شما فقط آن را touch کرده باشید. در هر دو حالت، این یک یادآوری است مبنی بر اینکه باید git update-index را روی آن اجرا کنید تا ایندکس همگام شود.


نکته

می‌توانید ترکیبی از فایل‌ها داشته باشید که هم‌زمان به صورت «به‌روزرسانی شده» و «هنوز در دایرکتوری کاری دست‌خورده (dirty) است» ظاهر شوند. همیشه می‌توانید تشخیص دهید کدام فایل در کدام وضعیت است، زیرا موارد «به‌روزرسانی شده» یک شناسه sha1 معتبر نشان می‌دهند و موارد «ناهماهنگ با ایندکس» همیشه دارای شناسه sha1 ویژه تمام‌صفر خواهند بود.

git-diff(1), git-diff-files(1), git-diff-tree(1), gitdiffcore(7), git(1)

بخشی از مجموعه git(1)

2026-06-29 Git 2.55.0