GIT-COMMIT-TREE(1) Git Manual GIT-COMMIT-TREE(1)

git-commit-tree - ایجاد یک شیء کامیت جدید

git commit-tree <tree> [(-p <parent>)...]
git commit-tree [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]
                  [(-F <file>)...] <tree>

این دستور معمولاً چیزی نیست که یک کاربر نهایی بخواهد مستقیماً اجرا کند. به جای آن git-commit(1) را ببینید.

یک شیء کامیت جدید بر اساس شیء درخت ارائه‌شده ایجاد می‌کند و شناسه شیء کامیت جدید را در خروجی استاندارد صادر می‌نماید. پیام وقایع‌نگاری از ورودی استاندارد خوانده می‌شود، مگر اینکه گزینه‌های -m یا -F مشخص شده باشند.

گزینه‌های -m و -F می‌توانند به هر تعداد بار و با هر ترتیبی داده شوند. پیام وقایع‌نگاری کامیت به همان ترتیبی که گزینه‌ها مشخص شده‌اند تشکیل خواهد شد.

یک شیء کامیت ممکن است هر تعداد والد داشته باشد. با داشتن دقیقاً یک والد، یک کامیت معمولی است. داشتن بیش از یک والد، کامیت را به یک ادغام (merge) میان چندین خط تاریخچه تبدیل می‌کند. کامیت‌های اولیه (ریشه) هیچ والدی ندارند.

در حالی که یک درخت نمایانگر وضعیت دایرکتوری خاصی از یک دایرکتوری کاری است، یک کامیت آن وضعیت را در «زمان» نشان می‌دهد و چگونگی رسیدن به آن را توضیح می‌دهد.

معمولاً یک کامیت یک وضعیت جدید برای «HEAD» را مشخص می‌کند، و در حالی که گیت اهمیتی نمی‌دهد که یادداشت مربوط به آن وضعیت را در کجا ذخیره می‌کنید، در عمل معمولاً نتیجه را فقط در فایلی می‌نویسیم که توسط .git/HEAD به آن اشاره می‌شود، تا همیشه بتوانیم ببینیم آخرین وضعیت کامیت‌شده چه بوده است.

<tree>

یک شیء درخت (tree object) موجود.

-p <parent>

هر گزینه -p شناسه یک شیء کامیت والد را مشخص می‌کند.

-m <message>

یک بند (پاراگراف) در پیام وقایع‌نگاری کامیت. این گزینه می‌تواند بیش از یک بار داده شود و هر <message> به یک بند جداگانه تبدیل می‌شود.

-F <file>

پیام وقایع‌نگاری کامیت را از فایل داده‌شده بخوانید. از - برای خواندن از ورودی استاندارد استفاده کنید. این گزینه می‌تواند بیش از یک بار داده شود و محتوای هر فایل به بند جداگانه‌ای تبدیل می‌شود.

-S[<keyid>], --gpg-sign[=<keyid>], --no-gpg-sign

امضای کامیت‌ها با GPG. شناسه keyid اختیاری است و به طور پیش‌فرض روی هویت کامیت‌کننده تنظیم می‌شود؛ در صورت تعیین، باید بدون فاصله به گزینه چسبانده شود. --no-gpg-sign برای لغو گزینه --gpg-sign که پیش‌تر در خط فرمان داده شده، مفید است.

یک کامیت موارد زیر را دربرمی‌گیرد:

•تمام شناسه‌های شیءهای والد
•نام، رایانامه و تاریخ نویسنده (author)
•نام، رایانامه و زمان ثبت‌کننده کامیت (committer).

توضیح کامیت از ورودی استاندارد خوانده می‌شود. اگر ورودی گزارش تغییرات از طریق تغییر مسیر «<» ارائه نشود، دستور git commit-tree منتظر می‌ماند تا توضیحی وارد شده و با ^D خاتمه یابد.

متغیرهای محیطی GIT_AUTHOR_DATE و GIT_COMMITTER_DATE از قالب‌های تاریخ زیر پشتیبانی می‌کنند:

قالب داخلی گیت (Git internal format)

به صورت <unix-timestamp> <time-zone-offset> است، که در آن <unix-timestamp> تعداد ثانیه‌ها از مبدأ یونیکس (UNIX epoch) است. <time-zone-offset> یک انحراف مثبت یا منفی از زمان هماهنگ جهانی (UTC) است. به عنوان مثال CET (که ۱ ساعت جلوتر از UTC است) +0100 می‌باشد.

امن‌تر است که پیش از <unix-timestamp> نویسه @ قرار داده شود (مثلاً @0 +0000)، که گیت را وادار می‌کند آن را به عنوان یک برچسب زمانی خام تفسیر کند. این کار برای مقادیر کمتر از ۱۰۰٬۰۰۰٬۰۰۰ (که کمتر از ۹ رقم دارند) الزامی است تا از اشتباه گرفته شدن با سایر قالب‌های تاریخ مانند YYYYMMDD جلوگیری شود.

RFC 2822

قالب استاندارد تاریخ مطابق با توضیحات RFC 2822، برای مثال Thu, 07 Apr 2005 22:13:13 +0200.

ISO 8601

زمان و تاریخ مشخص‌شده توسط استاندارد ISO 8601، برای مثال 2005-04-07T22:13:13. تجزیه‌کننده همچنین به جای کاراکتر T فاصله را نیز می‌پذیرد. بخش‌های کسری ثانیه نادیده گرفته می‌شوند، برای مثال 2005-04-07T22:13:13.019 به عنوان 2005-04-07T22:13:13 در نظر گرفته خواهد شد.

نکته
علاوه بر این، بخش تاریخ در قالب‌های زیر نیز پذیرفته می‌شود: YYYY.MM.DD, MM/DD/YYYY و DD.MM.YYYY.

گیت تا حدودی نسبت به کدگذاری نویسه‌ها (character encoding) بی‌تفاوت (مستقل) است.

•محتوای شیءهای blob دنباله‌هایی از بایت‌ها هستند که تفسیر نمی‌شوند. هیچ تبدیل کدگذاری در سطح هسته وجود ندارد.
•نام‌های مسیر با قالب تصحیح شکل C یونیکد (UTF-8 normalization form C) کدگذاری می‌شوند. این امر برای شیءهای درخت، فایل ایندکس، نام‌های ارجاع، و همچنین نام‌های مسیر در آرگومان‌های خط فرمان، متغیرهای محیطی و فایل‌های پیکربندی (.git/config (ببینید git-config(1))، gitignore(5)، gitattributes(5) و gitmodules(5)) اعمال می‌شود.

توجه داشته باشید که گیت در سطح هسته با نام‌های مسیر صرفاً به عنوان دنباله‌ای از بایت‌های غیر NUL رفتار می‌کند و هیچ تبدیل کدگذاری برای نام مسیرها وجود ندارد (به جز در مک و ویندوز). بنابراین، استفاده از نام‌های مسیر غیر ASCII حتی در پلتفرم‌ها و سیستم‌های فایلی که از کدگذاری‌های قدیمی ASCII گسترش‌یافته استفاده می‌کنند نیز اکثراً کار خواهد کرد. با این حال، مخازن ایجادشده در چنین سیستم‌هایی روی سیستم‌های مبتنی بر UTF-8 (مانند لینوکس، مک، ویندوز) به درستی کار نخواهند کرد و برعکس. علاوه بر این، بسیاری از ابزارهای مبتنی بر گیت صرفاً فرض می‌کنند که نام‌های مسیر UTF-8 هستند و در نمایش صحیح سایر کدگذاری‌ها ناموفق خواهند بود.

•پیام‌های وقایع‌نگاری کامیت معمولاً با UTF-8 کدگذاری می‌شوند، اما سایر کدگذاری‌های ASCII گسترش‌یافته نیز پشتیبانی می‌شوند. این شامل ISO-8859-x، CP125x و بسیاری موارد دیگر است، اما نه UTF-16/32، EBCDIC و کدگذاری‌های چندبایتی CJK (مانند GBK، Shift-JIS، Big5، EUC-x، CP9xx و غیره).

اگرچه توصیه می‌کنیم که پیام‌های وقایع‌نگاری کامیت با UTF-8 کدگذاری شوند، اما هم هسته و هم لایه کاربری گیت (Git Porcelain) به گونه‌ای طراحی شده‌اند که UTF-8 را به پروژه‌ها تحمیل نکنند. اگر همه مشارکت‌کنندگان یک پروژه خاص استفاده از کدگذاری‌های قدیمی را راحت‌تر بدانند، گیت آن را منع نمی‌کند. با این وجود، چند نکته وجود دارد که باید در نظر داشته باشید.

1.دستورات git commit و git commit-tree در صورتی که پیام وقایع‌نگاری کامیت داده‌شده به آن‌ها شبیه یک رشته معتبر UTF-8 نباشد هشدار صادر می‌کنند، مگر اینکه صریحاً اعلام کنید که پروژه شما از یک کدگذاری قدیمی استفاده می‌کند. روش اعلام این موضوع، قرار دادن i18n.commitEncoding در فایل .git/config است، مانند این:
[i18n]
        commitEncoding = ISO-8859-1

شیءهای کامیت ایجادشده با تنظیمات فوق، مقدار i18n.commitEncoding را در هدر encoding خود ثبت می‌کنند. این کار برای کمک به افراد دیگری است که بعداً به آن‌ها نگاه می‌کنند. عدم وجود این هدر به این معنی است که پیام وقایع‌نگاری کامیت با UTF-8 کدگذاری شده است.

2.دستورات git log، git show، git blame و نظایر آن‌ها هدر encoding یک شیء کامیت را بررسی می‌کنند و سعی می‌کنند پیام وقایع‌نگاری را به UTF-8 بازکدگذاری کنند مگر اینکه خلاف آن مشخص شده باشد. می‌توانید کدگذاری خروجی مورد نظر را با i18n.logOutputEncoding در فایل .git/config مشخص کنید، مانند این:
[i18n]
        logOutputEncoding = ISO-8859-1

اگر این متغیر پیکربندی را نداشته باشید، مقدار i18n.commitEncoding به جای آن استفاده می‌شود.

توجه داشته باشید که ما عمداً تصمیم گرفتیم هنگام ایجاد کامیت، پیام وقایع‌نگاری کامیت را برای تحمیل UTF-8 در سطح شیء کامیت بازکدگذاری نکنیم، زیرا تبدیل مجدد به UTF-8 لزوماً یک عملیات برگشت‌پذیر نیست.

/etc/mailname

git-write-tree(1) git-commit(1)

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

2026-06-29 Git 2.55.0