| GIT-DIFF-PAIRS(1) | راهنمای Git | GIT-DIFF-PAIRS(1) |
نام (NAME)
git-diff-pairs - مقایسه جفت فایلهای خام
خلاصه دستور (SYNOPSIS)
git diff-pairs -z [<diff-options>]
توضیحات (DESCRIPTION)
نمایش تغییرات برای جفتفایلهای ارائهشده در stdin. ورودی این دستور باید در قالب خروجی خام پایانیافته با NUL باشد، همانگونه که توسط دستوراتی چون git diff-tree -z -r --raw تولید میشود. بهطور پیشفرض، تفاضلهای خروجی محاسبه شده و پس از بسته شدن stdin در قالب وصله (patch) نمایش داده میشوند.
میتوان یک بایت NUL منفرد را میان خطوط ورودی خام در stdin نوشت تا تفاضل جفتفایلها تا همان نقطه محاسبه شود، بدون آنکه نیاز به انتظار برای بسته شدن stdin باشد. همچنین یک بایت NUL در خروجی نوشته میشود تا میان این دستههای تفاضل مرزبندی کند.
استفاده از این دستور امکان تجزیه خطلوله سنتی diff را به مراحل مجزا فراهم میکند، بهطوری که diff-pairs به عنوان مرحله خروجی عمل میکند. سایر دستورات، مانند diff-tree، میتوانند به عنوان رابط پیشین (frontend) برای محاسبه قالب تفاضل خام مورد استفاده به عنوان ورودی عمل کنند.
به جای محاسبه تفاضلها از طریق git diff-tree -p -M در یک مرحله، دستور diff-tree میتواند جفتفایلها و اطلاعات تغییر نام را بدون تفاضلهای blob محاسبه کند. این خروجی را میتوان برای تولید تفاضلهای blob زیربنایی، مطابق با مثال زیر به diff-pairs هدایت کرد:
git diff-tree -z -r -M $a $b | git diff-pairs -z
محاسبه اولیه تفاضل درخت همراه با اطلاعات تغییر نام به خروجی وصله از diff-pairs اجازه میدهد تا در طول چندین فراخوانی احتمالی، به صورت تدریجی محاسبه شود.
الگوهای مسیر (pathspecها) در حال حاضر توسط diff-pairs پشتیبانی نمیشوند. محدودسازی الگوی مسیر باید توسط دستور بالادستی که تفاضلهای خام ورودی را تولید میکند انجام شود.
اشیای درختی (tree objects) در حال حاضر به عنوان ورودی پشتیبانی نمیشوند و رد میگردند.
شناسههای کوتاهشده شیء در ورودی diff-pairs پشتیبانی نمیشوند. شناسههای شیء خروجی را میتوان با استفاده از گزینه --abbrev کوتاه کرد.
گزینهها (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) مراجعه کنید.
برای توضیحات دقیقتر درباره این گزینههای رایج، همچنین به 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 --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 استیج ۳ با عنوان «نسخه آنها» است).
همچنین ببینید (SEE ALSO)
git-diff(1), git-diff-tree(1), git-diff-files(1), git-diff-index(1), gitdiffcore(7), git(1)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |