GIT-COMMIT(1) دستورات عمومی کاربر GIT-COMMIT(1)

git-commit - ثبت تغییرات در مخزن

git commit [-a | --interactive | --patch] [-s] [-v] [-u[<mode>]] [--amend]
           [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|reword):]<commit>]
           [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
           [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
           [--date=<date>] [--cleanup=<mode>] [--[no-]status]
           [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]
           [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]
           [--] [<pathspec>...]

یک کامیت جدید شامل محتویات فعلی ایندکس و پیام گزارش ارائه‌شده برای توصیف تغییرات ایجاد می‌کند. کامیت جدید فرزند مستقیم HEAD است، که معمولاً نوک شاخه فعلی می‌باشد، و شاخه به‌روزرسانی می‌شود تا به آن اشاره کند (مگر اینکه هیچ شاخه‌ای با درخت کاری مرتبط نباشد، که در این صورت همان‌طور که در git-checkout(1) شرح داده شده است، HEAD در وضعیت «جداشده» (detached) قرار دارد).

محتوایی که قرار است کامیت شود را می‌توان به چندین روش مشخص کرد:

1.با استفاده از git-add(1) برای «اضافه کردن» گام‌به‌گام تغییرات به ایندکس پیش از استفاده از دستور commit (توجه: حتی فایل‌های تغییریافته نیز باید «اضافه» شوند)؛
2.با استفاده از git-rm(1) برای حذف فایل‌ها از درخت کاری و ایندکس، مجدداً پیش از استفاده از دستور commit؛
3.با فهرست کردن فایل‌ها به عنوان آرگومان‌های دستور commit (بدون گزینه‌های --interactive یا --patch)، که در این حالت کامیت، تغییرات آماده‌سازی‌شده (استیج‌شده) در ایندکس را نادیده می‌گیرد و در عوض محتوای فعلی فایل‌های فهرست‌شده را (که باید از قبل برای گیت شناخته‌شده باشند) ثبت می‌کند؛
4.با استفاده از گزینه -a همراه با دستور commit برای «اضافه کردن» خودکار تغییرات از تمام فایل‌های شناخته‌شده (یعنی تمام فایل‌هایی که از قبل در ایندکس فهرست شده‌اند) و «حذف کردن» خودکار فایل‌هایی از ایندکس که از درخت کاری حذف شده‌اند، و سپس انجام کامیت واقعی؛
5.با استفاده از گزینه‌های --interactive یا --patch همراه با دستور commit برای تصمیم‌گیری تک‌به‌تک در مورد اینکه کدام فایل‌ها یا قطعه‌تغییرها (hunks) علاوه بر محتویات ایندکس باید بخشی از کامیت باشند، پیش از نهایی کردن عملیات. بخش “Interactive Mode” در git-add(1) را ببینید تا با نحوه کار با این حالت‌ها آشنا شوید.

گزینه --dry-run می‌تواند برای دریافت خلاصه‌ای از آنچه که طبق هر یک از روش‌های بالا با دادن همان مجموعه پارامترها (گزینه‌ها و مسیرها) در کامیت بعدی گنجانده می‌شود، استفاده شود.

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

-a, --all

به‌طور خودکار فایل‌هایی را که تغییر یافته یا حذف شده‌اند آماده‌سازی (استیج) می‌کند، اما فایل‌های جدیدی که به گیت معرفی نکرده‌اید تحت تأثیر قرار نمی‌گیرند.

-p, --patch

استفاده از رابط تعاملی انتخاب وصله (patch) برای انتخاب تغییراتی که باید کامیت شوند. برای جزئیات به git-add(1) مراجعه کنید.

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

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

--inter-hunk-context=<n>

نمایش زمینه بین قطعه‌های diff، تا سقف تعداد خطوط مشخص‌شده در <number> که در نتیجه قطعه‌های نزدیک به یکدیگر را ادغام می‌کند. مقدار پیش‌فرض برابر با diff.interHunkContext یا در صورت تنظیم نشدن گزینه پیکربندی، 0 است.

-C <commit>, --reuse-message=<commit>

یک شیء <commit> موجود را می‌گیرد و هنگام ایجاد کامیت، از پیام گزارش و اطلاعات نویسندگی (از جمله برچسب زمانی) آن مجدداً استفاده می‌کند.

-c <commit>, --reedit-message=<commit>

مانند -C، اما با -c ویرایشگر باز می‌شود تا کاربر بتواند پیام کامیت را بیشتر ویرایش کند.

--fixup=[(amend|reword):]<commit>

یک کامیت جدید ایجاد می‌کند که در صورت اعمال با git rebase --autosquash، کامیت <commit> را «اصلاح» (fix up) می‌کند. حالت ساده --fixup=<commit> یک کامیت «!fixup» ایجاد می‌کند که محتوای <commit> را تغییر می‌دهد اما به پیام گزارش آن دست نمی‌زند. --fixup=amend:<commit> مشابه است اما یک کامیت «!amend» ایجاد می‌کند که پیام گزارش <commit> را نیز با پیام گزارش کامیت «!amend» جایگزین می‌کند. --fixup=reword:<commit> یک کامیت «!amend» ایجاد می‌کند که پیام گزارش <commit> را با پیام گزارش خود جایگزین می‌کند اما تغییری در محتوای <commit> ایجاد نمی‌کند.

کامیتی که توسط حالت ساده --fixup=<commit> ایجاد می‌شود دارای عنوانی متشکل از «!fixup» به‌همراه عنوان <commit> است، و به‌طور ویژه توسط git rebase --autosquash شناسایی می‌شود. گزینه -m می‌تواند برای تکمیل پیام گزارش کامیت ایجادشده استفاده شود، اما توضیحات اضافی پس از آن‌که کامیت «!fixup» توسط git rebase --autosquash در <commit> ترکیب (squash) شد، دور ریخته می‌شود.

کامیتی که توسط --fixup=amend:<commit> ایجاد می‌شود مشابه است اما عنوان آن با پیشوند «!amend» شروع می‌شود. پیام گزارش <commit> در پیام گزارش کامیت «!amend» کپی شده و در یک ویرایشگر باز می‌شود تا اصلاح و بازبینی شود. هنگامی که git rebase --autosquash کامیت «!amend» را در <commit> ترکیب (squash) می‌کند، پیام گزارش <commit> با پیام گزارش اصلاح‌شده کامیت «!amend» جایگزین می‌شود. خالی بودن پیام گزارش کامیت «!amend» خطا محسوب می‌شود مگر این‌که --allow-empty-message مشخص شده باشد.

--fixup=reword:<commit> کوتاه‌شده‌ای برای --fixup=amend:<commit> --only است. این گزینه یک کامیت «!amend» را تنها با یک پیام گزارش ایجاد می‌کند (و هرگونه تغییری را که در ایندکس استیج شده باشد نادیده می‌گیرد). هنگامی که توسط git rebase --autosquash ترکیب (squash) می‌شود، پیام گزارش <commit> را بدون ایجاد هیچ تغییر دیگری جایگزین می‌کند.

هیچ‌کدام از کامیت‌های «!fixup» یا «!amend» هنگام اعمال توسط git rebase --autosquash، نویسنده <commit> را تغییر نمی‌دهند. برای جزئیات به git-rebase(1) مراجعه کنید.

--squash=<commit>

یک پیام کامیت برای استفاده با git rebase --autosquash می‌سازد. عنوان پیام کامیت از کامیت مشخص‌شده همراه با پیشوند "squash! " گرفته می‌شود. می‌تواند همراه با گزینه‌های اضافی پیام کامیت (-m/-c/-C/-F) استفاده شود. برای جزئیات به git-rebase(1) مراجعه کنید.

--reset-author

هنگامی که با گزینه‌های -C/-c/--amend استفاده شود، یا هنگام کامیت کردن پس از یک cherry-pick دارای تداخل، اعلام می‌کند که نویسندگی کامیت حاصل اکنون به کامیت‌کننده تعلق دارد. این کار همچنین برچسب زمانی نویسنده را تجدید می‌کند.

--short

هنگام اجرای آزمایشی (dry-run)، خروجی را در قالب کوتاه ارائه می‌دهد. برای جزئیات به git-status(1) مراجعه کنید. متضمن گزینه --dry-run است.

--branch

اطلاعات شاخه و ردیابی را حتی در قالب کوتاه نمایش می‌دهد. برای جزئیات به git-status(1) مراجعه کنید.

--porcelain

هنگام اجرای آزمایشی (dry-run)، خروجی را در قالبی مناسب برای اسکریپت‌ها (porcelain) ارائه می‌دهد. برای جزئیات به git-status(1) مراجعه کنید. متضمن گزینه --dry-run است.

--long

هنگام اجرای آزمایشی (dry-run)، خروجی را در قالب بلند ارائه می‌دهد. این خروجی پیش‌فرض git-status(1) است. متضمن گزینه --dry-run است.

-z, --null

هنگام نمایش خروجی short یا porcelain در git-status(1)، نام فایل را عیناً چاپ می‌کند و مدخل‌ها را به‌جای LF، با NUL پایان می‌دهد. اگر قالبی مشخص نشده باشد، متضمن قالب خروجی --porcelain است. بدون گزینه -z، نام فایل‌های دارای نویسه‌های «نامعمول» همان‌طور که برای متغیر پیکربندی core.quotePath توضیح داده شده است، داخل کوتیشن قرار می‌گیرند (به git-config(1) مراجعه کنید).

-F <file>, --file=<file>

پیام کامیت را از <file> می‌گیرد. برای خواندن پیام از ورودی استاندارد (standard input) از - استفاده کنید.

--author=<author>

نویسنده کامیت را بازنویسی می‌کند. یک نویسنده مشخص را با استفاده از قالب استاندارد A U Thor <author@example.com> تعیین کنید. در غیر این صورت <author> به‌عنوان یک الگو در نظر گرفته می‌شود و برای جستجوی یک کامیت موجود توسط آن نویسنده استفاده می‌شود (یعنی git rev-list --all -i --author=<author>)؛ سپس نویسنده کامیت از اولین کامیتِ پیدا شده کپی می‌شود.

--date=<date>

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

-m <msg>, --message=<msg>

از <msg> به عنوان پیام کامیت استفاده می‌کند. اگر چندین گزینه -m داده شود، مقادیر آن‌ها به عنوان بندهای جداگانه به یکدیگر متصل می‌شوند.

گزینه -m با گزینه‌های -c، -C و -F هم‌زمان قابل استفاده نیست (مانعة‌الجمع است).

-t <file>, --template=<file>

هنگام ویرایش پیام کامیت، ویرایشگر را با محتویات موجود در <file> باز می‌کند. متغیر پیکربندی commit.template اغلب برای اعمال ضمنی این گزینه به دستور استفاده می‌شود. این سازوکار می‌تواند توسط پروژه‌هایی که مایلند مشارکت‌کنندگان را با راهنمایی‌هایی درباره این‌که چه متنی را به چه ترتیبی در پیام بنویسند هدایت کنند، به کار رود. اگر کاربر بدون ویرایش پیام از ویرایشگر خارج شود، کامیت لغو خواهد شد. در صورتی که پیام از راه‌های دیگری مانند گزینه‌های -m یا -F ارائه شده باشد، این گزینه تأثیری ندارد.

-s, --signoff, --no-signoff

یک تریلر (دنباله) Signed-off-by توسط کامیت‌کننده در انتهای پیام گزارش کامیت اضافه می‌کند. معنای signoff به پروژه‌ای که به آن کامیت می‌کنید بستگی دارد. برای مثال، ممکن است تأیید کند که کامیت‌کننده حق ارسال اثر تحت پروانه (لایسنس) پروژه را دارد یا با تعهدنامه‌های مشارکت‌کنندگان مانند Developer Certificate of Origin موافقت می‌کند. (برای مشاهده موردی که توسط هسته لینوکس و پروژه‌های گیت استفاده می‌شود، به https://developercertificate.org مراجعه کنید.) برای درک نحوه استفاده از signoff در پروژه‌ای که به آن مشارکت می‌کنید، با مستندات یا راهبران آن پروژه مشورت کنید.

گزینه --no-signoff می‌تواند برای ابطال گزینه --signoff قبلی در خط فرمان استفاده شود.

گیت متغیر پیکربندی برای فعال‌سازی پیش‌فرض گزینه خط فرمان --signoff ندارد (و نخواهد داشت)؛ برای جزئیات بیشتر به مدخل commit.signoff در gitfaq(7) مراجعه کنید.

--trailer <token>[(=|:)<value>]

یک جفت (<token>, <value>) را مشخص می‌کند که باید به‌عنوان یک تریلر (دنباله) اعمال شود. (مثلاً git commit --trailer "Signed-off-by:C O Mitter \ <committer@example.com>" --trailer "Helped-by:C O Mitter \ <committer@example.com>" تریلر (دنباله) Signed-off-by و تریلر (دنباله) Helped-by را به پیام کامیت اضافه می‌کند.) متغیرهای پیکربندی trailer.* (git-interpret-trailers(1)) می‌توانند برای تعیین این‌که آیا تریلر تکراری حذف شود، هر تریلر در کجای توالی تریلرها قرار گیرد، و سایر جزئیات استفاده شوند.

-n, --verify, --no-verify

قلاب‌های pre-commit و commit-msg را دور می‌زند. همچنین githooks(5) را ببینید.

--allow-empty

معمولاً ثبت کامیتی که دقیقاً همان درخت کامیت والد یگانه خود را دارد یک اشتباه است، و این دستور از ایجاد چنین کامیتی جلوگیری می‌کند. این گزینه این سازوکار ایمنی را دور می‌زند و کاربرد اصلی آن برای اسکریپت‌های واسط SCM خارجی است.

--allow-empty-message

یک کامیت با پیام کامیت خالی بدون استفاده از دستورات لوله‌کشی (plumbing) مانند git-commit-tree(1) ایجاد می‌کند. همانند --allow-empty، این دستور در درجه اول برای استفاده توسط اسکریپت‌های واسط SCM خارجی است.

--cleanup=<mode>

نحوه پاک‌سازی پیام کامیت ارائه‌شده قبل از کامیت کردن را تعیین می‌کند. <mode> می‌تواند strip، whitespace، verbatim، scissors یا default باشد.

strip

خطوط خالی ابتدا و انتها، فاصله‌های خالی انتهایی و خطوط توضیحات را حذف می‌کند و خطوط خالی متوالی را یکی می‌کند.

whitespace

همانند strip است، با این تفاوت که خطوط توضیحات با # حذف نمی‌شوند.

verbatim

پیام را به هیچ وجه تغییر نمی‌دهد.

scissors

همانند whitespace است، با این تفاوت که اگر قرار است پیام ویرایش شود، همه‌چیز از خط زیر (و شامل آن) به بعد بریده و حذف می‌شود. کاراکتر "#" می‌تواند با core.commentChar شخصی‌سازی شود.
# ------------------------ >8 ------------------------

default

اگر قرار است پیام ویرایش شود، همانند strip است؛ در غیر این صورت whitespace می‌باشد.

حالت پیش‌فرض می‌تواند با متغیر پیکربندی commit.cleanup تغییر کند (ببینید: git-config(1)).

-e, --edit

به کاربر امکان می‌دهد پیامی را که از <file> با -F <file>، از خط فرمان با -m <message> و از <commit> با -C <commit> گرفته شده است، بیشتر ویرایش کند.

--no-edit

از پیام کامیت انتخاب‌شده بدون باز کردن ویرایشگر استفاده می‌کند. برای مثال، git commit --amend --no-edit یک کامیت را بدون تغییر پیام کامیت آن اصلاح می‌کند.

--amend

نوک شاخه کنونی را با ایجاد یک کامیت جدید جایگزین می‌کند. درخت ثبت‌شده طبق معمول آماده می‌شود (شامل تأثیر گزینه‌های -i و -o و pathspec صریح)، و در صورتی که هیچ پیام دیگری از خط فرمان از طریق گزینه‌هایی مانند -m، -F، -c و غیره مشخص نشده باشد، پیام کامیت اصلی به جای یک پیام خالی به عنوان نقطه شروع استفاده می‌شود. کامیت جدید دارای همان والدین و نویسنده‌ای است که کامیت فعلی دارد (گزینه --reset-author می‌تواند این رفتار را لغو کند).

این گزینه تقریباً معادل دستورات زیر است:

$ git reset --soft HEAD^
$ ... do something else to come up with the right tree ...
$ git commit -c ORIG_HEAD

اما می‌تواند برای اصلاح یک کامیت ادغام (merge commit) نیز استفاده شود.

اگر کامیتی را که قبلاً منتشر شده است اصلاح می‌کنید، باید پیامدهای بازنویسی تاریخچه را درک کنید. (بخش "RECOVERING FROM UPSTREAM REBASE" را در git-rebase(1) ببینید.)

--no-post-rewrite

قلاب post-rewrite را دور می‌زند.

-i, --include

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

-o, --only

با در نظر گرفتن محتوای به‌روزشده درخت کاری در مسیرهای مشخص‌شده در خط فرمان و نادیده گرفتن هرگونه محتوای استیج‌شده برای سایر مسیرها، یک کامیت ایجاد می‌کند. در صورتی که هر مسیری در خط فرمان مشخص شده باشد، این حالتِ عملکرد پیش‌فرض git commit است که در این صورت می‌توان این گزینه را حذف کرد. اگر این گزینه به همراه --amend مشخص شود، نیازی به تعیین مسیر نیست، که می‌توان از آن برای اصلاح آخرین کامیت بدون کامیت کردن تغییراتی که قبلاً استیج شده‌اند استفاده کرد. در صورت استفاده همراه با --allow-empty نیز نیازی به مسیرها نیست و یک کامیت خالی ایجاد خواهد شد.

--pathspec-from-file=<file>

الگوی مسیر (pathspec) را به جای آرگومان‌های خط فرمان در <file> ارسال می‌کند. اگر <file> دقیقاً - باشد، از ورودی استاندارد استفاده می‌شود. عناصر pathspec با LF یا CR/LF از یکدیگر جدا می‌شوند. عناصر pathspec می‌توانند همان‌طور که برای متغیر پیکربندی core.quotePath توضیح داده شده نقل‌قول شوند (ببینید: git-config(1)). همچنین --pathspec-file-nul و گزینه سراسری --literal-pathspecs را ببینید.

--pathspec-file-nul

تنها همراه با --pathspec-from-file معنادار است. عناصر pathspec با نویسه NUL جدا می‌شوند و تمام نویسه‌های دیگر به صورت تحت‌اللفظی در نظر گرفته می‌شوند (شامل خطوط جدید و نقل‌قول‌ها).

-u[<mode>], --untracked-files[=<mode>]

فایل‌های ردگیری‌نشده را نمایش می‌دهد.

پارامتر <mode> اختیاری است (پیش‌فرض آن all است) و برای مشخص کردن نحوه برخورد با فایل‌های ردگیری‌نشده به کار می‌رود؛ زمانی که -u استفاده نشود، حالت پیش‌فرض normal است، یعنی نمایش فایل‌ها و دایرکتوری‌های ردگیری‌نشده.

گزینه‌های ممکن عبارتند از:

no

هیچ فایل ردگیری‌نشده‌ای را نشان نمی‌دهد

normal

فایل‌ها و دایرکتوری‌های ردگیری‌نشده را نشان می‌دهد

all

همچنین فایل‌های مجزا در دایرکتوری‌های ردگیری‌نشده را نشان می‌دهد.

تمام نگارش‌های معمول برای مقدار بولی true به عنوان normal و false به عنوان no در نظر گرفته می‌شوند. این پیش‌فرض می‌تواند با استفاده از متغیر پیکربندی status.showUntrackedFiles مستندشده در git-config(1) تغییر داده شود.

-v, --verbose

تفاوت یکپارچه (unified diff) بین کامیت HEAD و آنچه قرار است کامیت شود را در انتهای الگوی پیام کامیت نمایش می‌دهد تا با یادآوری تغییرات موجود در کامیت، به کاربر در توصیف کامیت کمک کند. توجه داشته باشید که خطوط این خروجی diff دارای پیشوند # نیستند. این diff بخشی از پیام کامیت نخواهد بود. متغیر پیکربندی commit.verbose را در git-config(1) ببینید.

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

-q, --quiet

پیام خلاصه کامیت را سرکوب می‌کند (نمایش نمی‌دهد).

--dry-run

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

--status

هنگام استفاده از یک ویرایشگر برای آماده‌سازی پیام کامیت، خروجی git-status(1) را در الگوی پیام کامیت قرار می‌دهد. این گزینه به طور پیش‌فرض روشن است، اما می‌تواند برای لغو متغیر پیکربندی commit.status استفاده شود.

--no-status

هنگام استفاده از یک ویرایشگر برای آماده‌سازی پیام کامیت پیش‌فرض، خروجی git-status(1) را در الگوی پیام کامیت قرار نمی‌دهد.

-S[<key-id>], --gpg-sign[=<key-id>], --no-gpg-sign

کامیت‌ها را با GPG امضا می‌کند. <key-id> اختیاری است و پیش‌فرض آن هویت کامیت‌کننده است؛ در صورت تعیین، باید بدون فاصله به گزینه چسبیده باشد. --no-gpg-sign برای لغو هر دو مورد متغیر پیکربندی commit.gpgSign و گزینه قبلی --gpg-sign مفید است.

--

هیچ‌یک از آرگومان‌های بعدی را به عنوان گزینه تفسیر نمی‌کند.

<pathspec>...

هنگامی که <pathspec> در خط فرمان داده می‌شود، محتویات فایل‌هایی را که با pathspec مطابقت دارند بدون ثبت تغییراتی که قبلاً به ایندکس اضافه شده‌اند کامیت می‌کند. محتویات این فایل‌ها علاوه بر آنچه از قبل آماده‌سازی شده است، برای کامیت بعدی نیز آماده‌سازی (استیج) می‌شوند.

برای جزئیات بیشتر، مدخل pathspec را در gitglossary(7) ببینید.

هنگام ثبت کارهای خود، محتوای فایل‌های تغییریافته در درخت کاری شما با دستور git add موقتاً در یک ناحیه آماده‌سازی موسوم به «ایندکس» (index) ذخیره می‌شود. یک فایل می‌تواند با دستور git restore --staged <file> تنها در ایندکس (و نه در درخت کاری) به حالت آخرین کامیت بازگردانده شود، که عملاً اثر git add را خنثی کرده و از قرار گرفتن تغییرات این فایل در کامیت بعدی جلوگیری می‌کند. پس از ایجاد تدریجی وضعیتی که باید کامیت شود با این دستورات، از git commit (بدون هیچ پارامتر مسیر فایل) برای ثبت هر آنچه تا کنون آماده‌سازی شده است، استفاده می‌شود. این ابتدایی‌ترین شکل این دستور است. یک مثال:

$ edit hello.c
$ git rm goodbye.c
$ git add hello.c
$ git commit

به جای آماده‌سازی فایل‌ها پس از هر تغییر جداگانه، می‌توانید به git commit بگویید که تغییرات فایل‌هایی که محتوای آن‌ها در درخت کاری شما ردگیری می‌شود را متوجه شده و دستورات متناظر git add و git rm را برای شما انجام دهد. به این ترتیب، اگر تغییر دیگری در درخت کاری شما وجود نداشته باشد، این مثال همان کار مثال قبلی را انجام می‌دهد:

$ edit hello.c
$ rm goodbye.c
$ git commit -a

دستور git commit -a ابتدا به درخت کاری شما نگاه می‌کند، متوجه می‌شود که hello.c را تغییر داده‌اید و goodbye.c را حذف کرده‌اید، و اقدامات لازم git add و git rm را برای شما انجام می‌دهد.

پس از آماده‌سازی تغییرات چندین فایل، می‌توانید با دادن نام مسیرها به git commit، ترتیبی که تغییرات در آن ثبت می‌شوند را تغییر دهید. هنگامی که نام مسیرها داده می‌شود، این دستور کامیتی ایجاد می‌کند که تنها تغییرات اعمال‌شده روی مسیرهای مشخص‌شده را ثبت می‌کند:

$ edit hello.c hello.h
$ git add hello.c hello.h
$ edit Makefile
$ git commit Makefile

این دستور کامیتی می‌سازد که تغییرات Makefile را ثبت می‌کند. تغییرات آماده‌سازی‌شده برای hello.c و hello.h در کامیت حاصل گنجانده نمی‌شوند. با این حال، تغییرات آن‌ها از دست نرفته است — آن‌ها همچنان آماده‌سازی‌شده هستند و صرفاً به عقب افتاده‌اند. پس از توالی بالا، اگر دستور زیر را اجرا کنید:

$ git commit

این کامیت دوم همان‌طور که انتظار می‌رود، تغییرات روی hello.c و hello.h را ثبت خواهد کرد.

پس از اینکه یک ادغام (که توسط git merge یا git pull آغاز شده) به دلیل تداخل‌ها متوقف شود، مسیرهایی که بدون تداخل ادغام شده‌اند از قبل برای کامیت شدن توسط شما آماده‌سازی می‌شوند و مسیرهایی که دچار تداخل هستند در وضعیت ادغام‌نشده باقی می‌مانند. شما باید ابتدا با git status بررسی کنید کدام مسیرها تداخل دارند و پس از رفع دستی آن‌ها در درخت کاری خود، نتیجه را طبق معمول با git add آماده‌سازی کنید:

$ git status | grep unmerged
unmerged: hello.c
$ edit hello.c
$ git add hello.c

پس از حل تداخل‌ها و آماده‌سازی نتیجه، دستور git ls-files -u دیگر مسیر دارای تداخل را ذکر نخواهد کرد. وقتی کارتان تمام شد، git commit را اجرا کنید تا در نهایت ادغام ثبت شود:

$ git commit

همانند حالت ثبت تغییرات خودتان، می‌توانید از گزینه -a برای صرفه‌جویی در تایپ استفاده کنید. یک تفاوت این است که در هنگام حل تداخل‌های ادغام، نمی‌توانید از git commit به همراه نام مسیرها برای تغییر ترتیب کامیت شدن تغییرات استفاده کنید، زیرا ادغام باید به عنوان یک کامیت واحد ثبت شود. در واقع، این دستور در صورت دریافت نام مسیرها از اجرا خودداری می‌کند (البته گزینه -i را ببینید).

اطلاعات مؤلف و کامیت‌کننده در صورت تنظیم بودن، از متغیرهای محیطی زیر گرفته می‌شود:

•GIT_AUTHOR_NAME
•GIT_AUTHOR_EMAIL
•GIT_AUTHOR_DATE
•GIT_COMMITTER_NAME
•GIT_COMMITTER_EMAIL
•GIT_COMMITTER_DATE

(نکته: کاراکترهای «<»، «>» و «\n» حذف می‌شوند)

نام مؤلف و کامیت‌کننده بنا بر عرف شکلی از نام شخصی است (یعنی نامی که دیگر افراد شما را با آن خطاب می‌کنند)، هرچند گیت قالب خاصی را تحمیل یا الزامی نمی‌کند. هر کاراکتر یونیکد دلخواهی با رعایت محدودیت‌های ذکرشده در بالا می‌تواند استفاده شود. این نام هیچ تأثیری بر احراز هویت ندارد؛ برای آن، متغیر credential.username را در git-config(1) ببینید.

در صورتی که (برخی از) این متغیرهای محیطی تنظیم نشده باشند، اطلاعات از موارد پیکربندی user.name و user.email، یا در صورت عدم وجود، از متغیر محیطی EMAIL، یا در صورت تنظیم نبودن آن، از نام کاربری سیستم و نام میزبانی که برای ایمیل‌های ارسالی استفاده می‌شود (که از /etc/mailname گرفته شده و در صورت عدم وجود آن فایل، به نام میزبان کاملاً واجد شرایط بازمی‌گردد) اخذ می‌شود.

گزینه‌های author.name و committer.name و گزینه‌های ایمیل متناظر آن‌ها در صورت تنظیم بودن، بر user.name و user.email اولویت دارند و خودشان توسط متغیرهای محیطی بازنویسی می‌شوند.

کاربرد معمول این است که فقط متغیرهای user.name و user.email تنظیم شوند؛ گزینه‌های دیگر برای موارد استفاده پیچیده‌تر ارائه شده‌اند.

متغیرهای محیطی 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.

علاوه بر تشخیص تمام قالب‌های تاریخ فوق، گزینه --date تلاش خواهد کرد سایر قالب‌های تاریخ انسان‌محورتر، مانند تاریخ‌های نسبی نظیر «yesterday» یا «last Friday at noon» را نیز درک و تفسیر کند.

اگرچه الزامی نیست، اما ایده خوبی است که پیام کامیت با یک سطر کوتاه (حداکثر ۵۰ نویسه) آغاز شود که تغییرات را خلاصه می‌کند، و پس از آن یک سطر خالی و سپس توضیح کامل‌تر و دقیق‌تری آورده شود. متن تا اولین سطر خالی در پیام کامیت، به عنوان عنوان کامیت در نظر گرفته می‌شود و این عنوان در سراسر گیت مورد استفاده قرار می‌گیرد. به عنوان مثال، git-format-patch(1) یک کامیت را به ایمیل تبدیل می‌کند، و از این عنوان در سطر موضوع (Subject) و از بقیه پیام کامیت در بدنه نامه استفاده می‌کند.

گیت تا حدودی نسبت به کدگذاری نویسه‌ها (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 لزوماً یک عملیات بازگشت‌پذیر نیست.

ویرایشگر مورداستفاده برای ویرایش پیام وقایع‌نگاری کامیت به ترتیب از متغیر محیطی GIT_EDITOR، متغیر پیکربندی core.editor، متغیر محیطی VISUAL، یا متغیر محیطی EDITOR انتخاب خواهد شد. برای جزئیات بیشتر به git-var(1) مراجعه کنید.

تمام موارد بالاتر از این سطر در این بخش از مستندات git-config(1) برگرفته نشده است. محتوایی که در ادامه می‌آید همان مواردی است که در آنجا یافت می‌شود:

commit.cleanup

این تنظیم، مقدار پیش‌فرض گزینه --cleanup در git commit را بازنویسی می‌کند. تغییر دادن پیش‌فرض زمانی می‌تواند مفید باشد که همیشه می‌خواهید سطرهایی را که با نویسه توضیح ( core.commentChar، پیش‌فرض #) شروع می‌شوند در پیام وقایع‌نگاری خود نگه دارید؛ در این صورت دستور git config commit.cleanup whitespace را اجرا می‌کنید (توجه داشته باشید که اگر این کار را انجام دهید، باید سطرهای راهنما را که با نویسه توضیح در قالب پیام کامیت شروع می‌شوند، خودتان حذف کنید).

commit.gpgSign

یک مقدار بولی (boolean) برای تعیین اینکه آیا همه کامیت‌ها باید با GPG امضا شوند یا خیر. استفاده از این گزینه هنگام انجام عملیاتی مانند بازنشانی پایه (rebase) می‌تواند منجر به امضا شدن تعداد زیادی کامیت شود. ممکن است استفاده از یک عامل احراز هویت (agent) برای جلوگیری از تایپ چندباره گذرواژه GPG مناسب باشد.

commit.status

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

commit.template

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

commit.verbose

یک مقدار بولی یا عدد صحیح (int) برای تعیین سطح پرگویی (verbosity) در git commit.

این دستور می‌تواند قلاب‌های commit-msg، prepare-commit-msg، pre-commit، post-commit و post-rewrite را اجرا کند. برای اطلاعات بیشتر githooks(5) را ببینید.

$GIT_DIR/COMMIT_EDITMSG

این فایل حاوی پیام کامیتِ مربوط به یک کامیت در حال انجام است. اگر git commit قبل از ایجاد یک کامیت به دلیل خطا خارج شود، هر پیام کامیتی که توسط کاربر ارائه شده باشد (مثلاً در یک نشست ویرایشگر) در این فایل در دسترس خواهد بود، اما با اجرای بعدی دستور git commit بازنویسی خواهد شد.

git-add(1), git-rm(1), git-mv(1), git-merge(1), git-commit-tree(1)

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

2026-06-29 Git 2.55.0