| GIT-DIFF-TREE(1) | Git Manual | GIT-DIFF-TREE(1) |
نام (NAME)
git-diff-tree - مقایسه محتوا و حالت اشیاء blob یافتشده از طریق دو شیء درخت
خلاصه دستور (SYNOPSIS)
git diff-tree [--stdin] [-m] [-s] [-v] [--no-commit-id] [--pretty]
[-t] [-r] [-c | --cc] [--combined-all-paths] [--root] [--merge-base]
[<common-diff-options>] <tree-ish> [<tree-ish>] [<path>...]
توضیحات (DESCRIPTION)
محتوا و حالت (mode) اشیاء blob یافتشده از طریق دو شیء درخت را مقایسه میکند.
اگر تنها یک <tree-ish> داده شود، کامیت با والدین خود مقایسه میشود (گزینه --stdin در ادامه را ببینید).
توجه داشته باشید که git diff-tree میتواند از درختی که درون یک شیء کامیت کپسولهسازی شده است استفاده کند.
گزینهها (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) مراجعه کنید.
<tree-ish>
<path>...
-r
-t
--root
--merge-base
--stdin
هنگامی که دو درخت داده شوند، درخت اول را با دومی مقایسه میکند. هنگامی که یک کامیت منفرد داده شود، آن کامیت را با والدین خود مقایسه مینماید. کامیتهای باقیمانده، در صورت ارائه، به عنوان والدین کامیت اول لحاظ میشوند.
هنگام مقایسه دو درخت، شناسه هر دو درخت (که با فاصله جدا شده و به خط جدید ختم میشود) پیش از تفاضل چاپ میگردد. هنگام مقایسه کامیتها، شناسه اولین (یا تنها) کامیت به همراه یک خط جدید چاپ میشود.
گزینههای زیر رفتار دستور را هنگام مقایسه کامیتها (و نه درختها) بیشتر تحت تأثیر قرار میدهند.
-m
-s
-v
--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
--no-commit-id
-c
--cc
--combined-all-paths
--always
قالبهای نمایشی (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
قالب خروجی خام (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 باشد، رکورد دو مسیر را نشان خواهد داد.
GIT
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |