سرفصل‌های آموزشی
آموزش کاربردی گیت برای برنامه نویسان
git commit چیست؟

git commit چیست؟

Git commit

دستور git commit، تغییرهای stage شده ی پروژه را ذخیره می کند. این تغییرهای ذخیره شده را می توان مانند نسخه های امن یک پروژه تصور کرد. Git هیچ گاه آن ها را تغییر نمی دهد، مگر به طور صریح بخواهید که این کار را انجام دهد. قبل از اجرای git commit، از دستور git add استفاده می شود. این دستور تغییرهای پروژه را که قرار است در یک commit ذخیره شوند، stage می کند. این دو دستور (git add و git commit)، بیشترین کاربرد را در Git دارند.

 مقایسه ی Git commit با SVN commit

با این وجود که این دو دستور نام یکسان دارند، اما git commit اصلا شبیه به svn commit نیست. این نام مشترک ممکن است برای تازه واردان Git که سابقه ی کار با svn را دارند، گیج کننده باشد. بنابراین تاکید بر تفاوت آن ها مهم است. مقایسه ی git commit با svn commit، مقایسه یک مدل برنامه متمرکز (SVN) با یک مدل برنامه توزیع شده (Git) است. در SVN، یک commit، تغییرها را از مخزن محلی کاربر به مخزن SVN مشترک که متمرکز (centralized) و remote است؛ push می کند. در Git، مخزن ها توزیع شده (distributed) هستند؛ commit ها در مخزن محلی انجام می شوند و نیاز به هیچ تعاملی با مخزن های دیگر Git ندارند. commit های Git می توانند بعدا به مخن های remote مورد نظر، push شوند.

Git commit چگونه کار می کند؟

در سطح بالا، می توان Git را به عنوان یک ابزار مدیریت جدول زمانی در نظر گرفت. commit ها واحدهای اصلی سازنده ی یک جدول زمانی پروژه Git هستند. commit ها را می توان به عنوان ثبت های لحظه ای یا نقاط عطف در طول جدول زمانی یک پروژه ی Git، در نظر گرفت. commit ها با دستور git commit ایجاد می شوند تا وضعیت یک پروژه را در آن زمان مشخص کنند. این commit ها همیشه به مخزن محلی سپرده می شوند و تا زمانی که آماده نشوید، Git شما را مجبور نمی کند با مخزن مرکزی تعامل کنید؛ بر خلاف SVN که در آن commit ها به مخزن مرکزی سپرده می شوند. همان طور که ناحیه ی staging، یک سپر، میان مسیر کاری و تاریخچه ی پروژه است؛ مخزن محلی هر توسعه دهنده، یک سپر بین فعالیت های او و مخزن مرکزی است.

این روش، مدل توسعه ی اساسی را برای کاربران Git تغییر می دهد. توسعه دهندگان Git به جای ایجاد تغییر و commit مستقیم آن ها به مخزن مرکزی، فرصت جمع آوری commit ها را در مخزن محلی خود دارند. این امر مزایای بسیاری نسبت به SVN دارد از جمله:

  • تقسیم یک ویژگی به commit های کوچک را آسان تر می کند.
  • commit های مرتبط را با هم گروه بندی  می کند و تاریخچه ی محلی را قبل از انتشار در مخزن مرکزی تمیز می کند. 
  •  به توسعه دهندگان این امکان را می دهد تا در یک محیط جداگانه کار کنند و یکپارچه سازی را به تعویق بیندازند تا زمانی که در مرحله ای مناسب برای merge با سایر کاربرها قرار گیرند.

 البته، با این وجود که جداگانه کار کردن و به تعویق انداختن یکپارچه سازی به تنهایی مفید است؛ به نفع یک تیم هم هست که به طور مکرر و در واحدهای کوچک، یکپارچه سازی commit ها را انجام دهند. برای کسب اطلاعات بیشتر در مورد بهترین شیوه های همکاری تیمی Git، چگونگی ساختار تیم ها در را مطالعه کنید.

ثبت در لحظه، نه به هنگام ایجاد تفاوت

گذشته از تفاوت های کاربردی بین SVN و Git، اجرای اساسی آن ها نیز از فلسفه های طراحی کاملا متفاوت پیروی می کند. در حالی که SVN تفاوت های یک فایل را ردیابی می کند، مدل کنترل نسخه ی Git براساس ثبت لحظه ای ساخته شده است. برای مثال، یک SVN commit، شامل یک تفاوت در مقایسه با فایل اصلی اضافه شده به مخزن است. از طرف دیگر، Git تمام محتوای یک فایل را در هر commit ثبت می کند.

این کار باعث می شود بسیاری از کارهای Git، سریع تر از SVN باشد. زیرا لازم نیست نسخه ی خاصی از یک فایل، مجموعه ای از تفاوت های آن باشد (ویرایش هر فایل، بلافاصله از پایگاه داده داخلی Git، در دسترس است). 

مدل ثبت لحظه ای Git تقریبا در همه ی جنبه های مدل کنترل نسخه ی آن تاثیر گسترده ای دارد. از ابزارهای branching و merging گرفته تا گردش کار.

گزینه های رایج

git commit

دستور بالا، یک stage ثبت شده را commit می کند. با این دستور یک ویرایش گر متن راه اندازی می شود و شما را به ایجاد یک پیام commit ترغیب می کند. پس از ورود پیام، فایل را ذخیره کرده و ویرایش گر را ببندید تا commit واقعی ایجاد شود.

git commit -a

دستور بالا، همه ی تغییرهایی که در مسیر کاری هست را commit می کند. این فقط شامل تغییرهایی است که در فایل های ردیابی شده هستند (آن هایی که با دستور git add، اضافه شده اند).

git commit -m "commit message"

دستور بالا، یک دستور میان بر است که بلافاصله یک commit به همراه یک پیام ایجاد می کند. به صورت پیش فرض، git commit یک ویرایش گر محلی پیکربندی شده را باز می کند و برای ورود یک پیام commit درخواست می دهد. وارد کردن گزینه ی -m مانع باز کردن ویرایش گر متن می شود و به جای آن یک پیام برخط را می پذیرد.

git commit -am "commit message"

دستور بالا، یک دستور میان بر است که قدرتمند که گزینه های -a و -m را با هم ترکیب می کند. این ترکیب بدون درنگ یک commit از تمامی تغییرهای stage شده ایجاد می کند و یک پیام commit برخط می گیرد.

git commit --amend

دستور بالا، سطح دیگری از عملکرد را به دستور commit اضافه می کند. اجرای این گزینه آخرین commit را اصلاح می کند. به جای ایجاد commit جدید، تغییرهای stage شده به commit قبلی اضافه می شوند. این دستور، ویرایش گر متن پیکربندی شده ی سیستم را باز کرده و شما را ترغیب به تغییر پیام commit قبلی می کند. 

مثال ها

ذخیره ی تغییرها با commit

مثال زیر فرض می کند که شما برخی مطالب را در فایلی به نام hello.py در شاخه ی فعلی ویرایش کرده اید و آماده ی commit آن به تاریخچه ی پروژه هستید. ابتدا باید با دستور git add، فایل را stage کنید، سپس می توانید stage ثبت شده را commit کنید.

git add hello.py

دستور بالا، hello.py را به ناحیه ی staging اضافه می کند. با استفاده از دستور git status می توانیم نتیجه ی این عمل را بررسی کنیم.

git status 
On branch master 
Changes to be committed:
   (use "git reset HEAD ..." to unstage)
   new file: hello.py 

خروجی سبز رنگ، فایل جدید hello.py را نشان می دهد که hello.py با commit بعدی ذخیره می شود. از طریق  ایجاد commit با اجرای:

git commit

دستور بالا، یک ویرایش گر متن (قابل تنظیم از طریق پیکربندی Git) برای درخواست ثبت یک پیام commit، به همراه لیستی از commit ها، باز می کند:

# Please enter the commit message for your changes. Lines starting 
# with '#' will be ignored, and an empty message aborts the commit. 
# On branch master 
# Changes to be committed:
# (use "git reset HEAD ..." to unstage) 
# 
#modified: hello.py

Git به پیروی از فرمت خاصی برای پیام های commit ها، احتیاج ندارد، اما فرمت متعارف این است که کل commit را در خط اول، در کمتر از 50 کاراکتر خلاصه کنید، یک خط را خالی بگذارید، و سپس توضیحات دقیق درباره ی آنچه تغییر کرده است را وارد کنید. مثلا:

Change the message displayed by hello.py
 - Update the sayHello() function to output the user's name 
- Change the sayGoodbye() function to a friendlier message

این یک روش معمول است که از خط اول پیام commit به عنوان خط موضوع استفاده می شود (مشابه ایمیل). بقیه پیام به عنوان متن اصلی در نظر گرفته می شود و برای انتقال جزئیات تغییرهای commit شده، استفاده می شود. توجه داشته باشید که بسیاری از توسعه دهندگان نیز دوست دارند از زمان حال در پیام commit های خود استفاده کنند. این کار باعث می شود بیشتر به کارهای موجود در مخزن، شبیه باشند، که بسیاری از کارهای بازنویسی تاریخچه بصری را در پی خواهد داشت.

چگونه یک commit را به روز  کنیم

برای ادامه ي مثال بالا با hello.py، بیایید به روز رسانی های بیشتری روی hello.py ایجاد و در ادامه اجرا کنیم:

git add hello.py git commit --amend

دستور بالا، یک بار دیگر ویرایش گر متن پیکربندی شده را باز می کند. این بار، با پیام commit که از قبل وارد کردیم پر می شود و نشان می دهد که ما commit جدیدی ایجاد نمی کنیم، بلکه آخرین مورد را ویرایش می کنیم. 

خلاصه

دستور git commit، یکی از اصلی ترین عملکردهای Git است. استفاده از دستور git add قبل از git commit، برای انتخاب تغییرهایی که در stage قرار خواهند گرفت، لازم است. دستور git commit برای ایجاد یک ثبت لحظه ای از تغییرهای stage، در طول جدول زمانی تاریخچه ي یک پروژه ي Git استفاده می شود. دستور git status می تواند برای پی گیری ناحیه ي staging و commit معلق، استفاده شود.  

مدل commit در  SVN و Git متفاوت هستند اما اغلب به دلیل اصطلاحات مشابه، گیج کننده اند. اگر می خواهید از سابقه ي شخصی استفاده از SVN به Git بروید، خوب است بدانید که در git، commit ها ارزان هستند و باید پیوسته استفاده شوند. در حالی که commit ها در SVN عملی گران هستند که یک درخواست remote می دهند؛ commit های Git به صورت محلی و با الگوریتم کارآمدتری انجام می شوند.

منبع 

https://www.atlassian.com/git/tutorials/saving-changes/git-commit

online-support-icon