| GIT-DIFF(1) | راهنمای Git | GIT-DIFF(1) |
نام (NAME)
git-diff - نمایش تغییرات میان کامیتها، کامیت و درخت کاری، و غیره
خلاصه دستور (SYNOPSIS)
git diff [<options>] [<commit>] [--] [<path>...] git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>...] git diff [<options>] [--merge-base] <commit> [<commit>...] <commit> [--] [<path>...] git diff [<options>] <commit>...<commit> [--] [<path>...] git diff [<options>] <blob> <blob> git diff [<options>] --no-index [--] <path> <path> [<pathspec>...]
توضیحات (DESCRIPTION)
نمایش تغییرات میان درخت کاری و ایندکس یا یک درخت، تغییرات میان ایندکس و یک درخت، تغییرات میان دو درخت، تغییرات حاصل از یک ادغام، تغییرات میان دو شیء blob، یا تغییرات میان دو فایل روی دیسک.
git diff [<options>] [--] [<path>...]
git diff [<options>] --no-index [--] <path> <path> [<pathspec>...]
git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>...]
اگر --merge-base مشخص شود، به جای استفاده از <commit>، از پایه ادغام (merge base) <commit> و HEAD استفاده میکند. git diff --cached --merge-base A معادل است با git diff --cached $(git merge-base A HEAD).
git diff [<options>] [--merge-base] <commit> [--] [<path>...]
اگر --merge-base مشخص شود، به جای استفاده از <commit>، از پایه ادغام (merge base) <commit> و HEAD استفاده میکند. git diff --merge-base A معادل است با git diff $(git merge-base A HEAD).
git diff [<options>] [--merge-base] <commit> <commit> [--] [<path>...]
اگر --merge-base مشخص شود، از پایه ادغام دو کامیت برای سمت «قبل» (before) استفاده میکند. git diff --merge-base A B معادل است با git diff $(git merge-base A B) B.
git diff [<options>] <commit> <commit>...<commit> [--] [<path>...]
git diff [<options>] <commit>..<commit> [--] [<path>...]
git diff [<options>] <commit>...<commit> [--] [<path>...]
فقط در صورتی که کار خاصی انجام میدهید، باید اشاره کرد که تمام <commit> در توضیحات بالا، به جز در مورد --merge-base و در دو حالت آخر که از نمادهای .. استفاده میکنند، میتوانند هر <tree> باشند. یک درخت قابل توجه، درختی است که ارجاعی با نام AUTO_MERGE به آن اشاره میکند و توسط راهبرد ادغام ort هنگام برخورد با تداخلهای ادغام نوشته میشود (ببینید git-merge(1)). مقایسه درخت کاری با AUTO_MERGE تغییراتی را که تاکنون برای حل تداخلهای متنی انجام دادهاید نشان میدهد (مثالهای زیر را ببینید).
برای فهرست کاملتری از روشهای نگارش <commit>، بخش «مشخص کردن بازبینیها» (SPECIFYING REVISIONS) را در gitrevisions(7) ببینید. با این حال، diff درباره مقایسه دو نقطه پایانی است و نه بازهها، و نمادهای بازه (<commit>..<commit> و <commit>...<commit>) به معنای یک بازه به آن مفهومی که در بخش «مشخص کردن بازهها» (SPECIFYING RANGES) در gitrevisions(7) تعریف شده نیستند.
git diff [<options>] <blob> <blob>
گزینهها (OPTIONS)
-p, -u, --patch
-s, --no-patch
-U<n>, --unified=<n>
--output=<file>
--output-indicator-new=<char>, --output-indicator-old=<char>, --output-indicator-context=<char>
--raw
--patch-with-raw
--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
بدون این گزینه، نام مسیرهای دارای کاراکترهای «غیرمعمول» همانطور که برای متغیر پیکربندی core.quotePath توضیح داده شده نقلقول (quote) میشوند (به 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 خطبهخطی که بدون این گزینه تولید میشود و سپس محاسبه تغییرات کلمهبهکلمه درون هر قطعه تغییر (hunk) عمل میکند. این ممکن است خروجی diff بزرگتری نسبت به خروجی یک ابزار اختصاصی word-diff تولید کند. اگر گیت در آینده پیادهسازی متفاوتی را به کار گیرد، خروجی ممکن است تغییر کند. توجه داشته باشید که این مشابه گزینه --diff-algorithm است که آن هم ممکن است خروجی را تغییر دهد.
--word-diff-regex=<regex>
هر تطابق غیرهمپوشان با <regex> یک کلمه در نظر گرفته میشود. هر چیزی میان این تطابقها فاصله خالی تلقی شده و به منظور یافتن تفاوتها نادیده گرفته میشود(!). ممکن است بخواهید |[^[:space:]] را به عبارت باقاعده خود الحاق کنید تا مطمئن شوید که با تمام نویسههای غیرفاصله تطابق دارد. تطابقی که شامل خط جدید (newline) باشد به طور خاموش(!) در محل خط جدید بریده میشود.
برای مثال، --word-diff-regex=. با هر نویسه مانند یک کلمه رفتار کرده و بر این اساس، تفاوتها را نویسهبهنویسه نمایش میدهد.
عبارت باقاعده (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>]]
بر نحوه نمایش تغییری که معادل بازنویسی کامل یک فایل است تأثیر میگذارد؛ به طوری که آن را نه به عنوان مجموعهای از حذف و درجهای درهمآمیخته همراه با چند خط معدود که از نظر متنی به عنوان زمینه (context) مطابقت دارند، بلکه به عنوان یک حذف کامل از تمام محتوای قدیمی به دنبال یک درج کامل از تمام محتوای جدید نشان میدهد، و عدد <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 استفاده شود، preimage در بخش حذف از یک جفت حذف/ایجاد را نیز نادیده میگیرد.
-l<num>
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
همچنین، این حروف بزرگ را میتوان با حروف کوچک نوشت تا مستثنی شوند؛ به عنوان مثال --diff-filter=ad مسیرهای افزودهشده و حذفشده را مستثنی میکند.
توجه داشته باشید که همه diffها نمیتوانند شامل همه انواع باشند. برای مثال، اگر تشخیص برای آن انواع غیرفعال باشد، موارد کپیشده و تغییرنامیافته نمیتوانند ظاهر شوند.
-S<string>
هنگامی که به دنبال یک بلوک دقیق از کد (مانند یک struct) هستید و میخواهید تاریخچه آن بلوک را از زمان پیدایش اولیه آن بدانید بسیار مفید است: از این قابلیت به صورت تکرارشونده استفاده کنید تا بلوک مورد نظر در preimage را مجدداً به -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 برای یافتن درختها (trees) نیز هست.
--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
--exit-code
--quiet
--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) مشخص نشود، عمق به گونهای اندازهگیری میشود که گویی تمام ورودیهای سطح بالا مشخص شدهاند. توجه داشته باشید که این با اندازهگیری از ریشه متفاوت است، زیرا --max-depth=0 همچنان foo را برمیگرداند. این به شما امکان میدهد تا ضمن درخواست زیرمجموعهای از ورودیهای سطح بالا، عمق را نیز محدود کنید.
توجه داشته باشید که این گزینه تنها برای diff میان شیءهای درختی (tree objects) پشتیبانی میشود، نه در برابر ایندکس یا درخت کاری.
برای توضیحات دقیقتر درباره این گزینههای رایج، همچنین به gitdiffcore(7) مراجعه کنید.
-1, --base, -2, --ours, -3, --theirs
ایندکس این مراحل (stages) را تنها برای ورودیهای ادغامنشده (unmerged)، یعنی در حین حل تعارضها، نگهداری میکند. برای اطلاعات دقیقتر به بخش "3-Way Merge" در git-read-tree(1) مراجعه کنید.
-0
<path>...
قالب خروجی خام (RAW OUTPUT FORMAT)
قالب خروجی خام در git-diff-index، git-diff-tree، git-diff-files و git diff --raw بسیار مشابه یکدیگر است.
این دستورات همگی دو مجموعه از موارد را با یکدیگر مقایسه میکنند؛ اما آنچه مقایسه میشود متفاوت است:
git-diff-index <tree-ish>
git-diff-index --cached <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
بدین صورت که از چپ به راست:
حروف وضعیت ممکن عبارتند از:
حروف وضعیت C و R همیشه با یک امتیاز همراه هستند (که نشاندهنده درصد شباهت میان مبدا و مقصد جابجایی یا رونوشت است). حرف وضعیت M ممکن است برای بازنویسیهای فایل با یک امتیاز (که نشاندهنده درصد عدم شباهت است) همراه باشد.
اگر فایلی در فایلسیستم با ایندکس ناهماهنگ باشد، شناسه sha1 برای “dst” تماماً بهصورت 0 نمایش داده میشود.
مثال:
:100644 100644 5be4a4a 0000000 M file.c
بدون گزینه -z، نام مسیرهایی که دارای نویسههای “غیرمعمول” هستند همانطور که برای متغیر پیکربندی core.quotePath توضیح داده شده است، نقلقول (quote) میشوند (نگاه کنید به git-config(1)). با استفاده از -z، نام فایل عیناً در خروجی قرار میگیرد و خط با یک بایت NUL پایان مییابد.
قالب تفاضل برای ادغامها (DIFF FORMAT FOR MERGES)
دستورات git-diff-tree، git-diff-files و git-diff --raw میتوانند گزینه -c یا --cc را برای تولید خروجی تفاضل (diff) برای کامیتهای ادغام (merge commits) نیز دریافت کنند. خروجی به روشهای زیر با قالب توصیفشده در بالا تفاوت دارد:
برای -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 (تفاضل ترکیبی) فقط فایلهایی را فهرست میکند که نسبت به همه والدین اصلاح شده باشند.
تولید متن وصله با 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 --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)
هر دستوری که خروجی تفاضل (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);
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> @@@
تعداد (تعداد والدین + ۱) نویسه @ در هدر تکه (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 استیج ۳ با عنوان «نسخه آنها» است).
سایر قالبهای تفاضل (OTHER DIFF FORMATS)
گزینه --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
یعنی از چپ به راست:
هنگامی که گزینه خروجی -z فعال باشد، خروجی به این صورت قالببندی میشود:
1 2 README NUL 3 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
یعنی:
نویسه اضافی NUL قبل از مسیر پیشتصویر در حالت تغییر نام، به اسکریپتهایی که خروجی را میخوانند اجازه میدهد بدون خواندن رو به جلو تشخیص دهند که رکورد فعلی که خوانده میشود یک رکورد تکمسیره است یا یک رکورد تغییر نام/رونوشت. پس از خواندن خطوط اضافهشده و حذفشده، خواندن تا NUL نام مسیر را به دست میدهد، اما اگر آن مقدار NUL باشد، رکورد دو مسیر را نشان خواهد داد.
مثالها (EXAMPLES)
روشهای گوناگون برای بررسی درخت کاری
$ git diff (1) $ git diff --cached (2) $ git diff HEAD (3) $ git diff AUTO_MERGE (4)
| 1. | تغییرات در درخت کاری که هنوز برای کامیت بعدی استیج نشدهاند. |
| 2. | تغییرات میان ایندکس و آخرین کامیت شما؛ آنچه در صورت اجرای git commit بدون گزینه -a کامیت خواهید کرد. |
| 3. | تغییرات در درخت کاری از زمان آخرین کامیت شما؛ آنچه در صورت اجرای git commit -a کامیت خواهید کرد. |
| 4. | تغییراتی در درخت کاری که تاکنون برای حل تعارضهای متنی اعمال کردهاید. |
مقایسه با کامیتهای دلخواه
$ git diff test (1) $ git diff HEAD -- ./test (2) $ git diff HEAD^ HEAD (3)
| 1. | بهجای استفاده از نوک شاخه فعلی، مقایسه با نوک شاخه «test» انجام میشود. |
| 2. | بهجای مقایسه با نوک شاخه «test»، با نوک شاخه فعلی مقایسه میکند، اما مقایسه را به فایل «test» محدود میسازد. |
| 3. | مقایسه نسخه پیش از آخرین کامیت و خود آخرین کامیت. |
مقایسه شاخهها
$ git diff topic master (1) $ git diff topic..master (2) $ git diff topic...master (3)
| 1. | تغییرات میان نوک شاخههای topic و master. |
| 2. | مشابه مورد بالا. |
| 3. | تغییراتی که روی شاخه master از زمان انشعاب شاخه topic از آن رخ داده است. |
محدود کردن خروجی diff
$ git diff --diff-filter=MRC (1) $ git diff --name-status (2) $ git diff arch/i386 include/asm-i386 (3)
| 1. | تنها نمایش تغییرات، تغییر نام و رونوشت (کپی)، بدون نمایش موارد افزودهشده یا حذفشده. |
| 2. | تنها نمایش نامها و ماهیت تغییرات، بدون نمایش خروجی واقعی diff. |
| 3. | محدود کردن خروجی diff به زیردرختهای نامبرده. |
دستکاری خروجی diff
$ git diff --find-copies-harder -B -C (1) $ git diff -R (2)
| 1. | صرف چرخههای پردازشی بیشتر برای یافتن تغییر نامها، رونوشتها (کپیها) و بازنویسیهای کامل (بسیار پرهزینه). |
| 2. | تولید خروجی diff بهصورت معکوس. |
پیکربندی (CONFIGURATION)
تمام موارد زیر در این بخش بهصورت گزینششده از مستندات git-config(1) گنجانده شدهاند. محتوای آنها با آنچه در آنجا یافت میشود یکسان است:
diff.autoRefreshIndex
diff.dirstat
changes
lines
files
cumulative
<limit>
مثال: دستور زیر فایلهای تغییریافته را شمارش میکند، در حالی که دایرکتوریهای دارای کمتر از ۱۰٪ از کل فایلهای تغییریافته را نادیده میگیرد و شمارش دایرکتوریهای فرزند را در دایرکتوریهای والد تجمیع مینماید: files,10,cumulative.
diff.statNameWidth
diff.statGraphWidth
diff.context
diff.interHunkContext
diff.external
diff.trustExitCode
diff.ignoreSubmodules
diff.mnemonicPrefix
git diff
git diff HEAD
git diff --cached
git diff HEAD:<file1> <file2>
git diff --no-index <a> <b>
diff.noPrefix
diff.srcPrefix
diff.dstPrefix
diff.relative
diff.orderFile
diff.renameLimit
diff.renames
diff.suppressBlankEmpty
diff.submodule
diff.wordRegex
diff.<driver>.command
diff.<driver>.trustExitCode
diff.<driver>.xfuncname
diff.<driver>.binary
diff.<driver>.textconv
diff.<driver>.wordRegex
diff.<driver>.cachetextconv
diff.indentHeuristic
diff.algorithm
default, myers
minimal
patience
histogram
diff.wsErrorHighlight
diff.colorMoved
diff.colorMovedWS
همچنین ببینید (SEE ALSO)
diff(1), git-difftool(1), git-log(1), gitdiffcore(7), git-format-patch(1), git-apply(1), git-show(1)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |