ذخیره سازی تغییرها
git add / git commit / git diff / git stash / .gitignore
هنگام کار با Git یا سایر سیستم های کنترل نسخه، مفهوم "ذخیره سازی" فرایند دقیق تری نسبت به ذخیره در پردازشگر Word یا سایر برنامه های ویرایش فایل سنتی است. عبارت نرم افزاری سنتی "ذخیره سازی" با اصطلاح committing"" در Git مترادف است. یک Commit معادل یک "ذخیره" در Git است. ذخیره ی سنتی را باید به عنوان یک عملکرد سیستم فایل در نظر گرفت که برای رونویسی یک فایل موجود یا نوشتن یک فایل جدید استفاده می شود. از سوی دیگر، Commit در Git عملیاتی است که روی مجموعه ای از فایل ها و مسیر ها عمل می کند.
ذخیره ی تغییرها در Git در مقابل SVN نیز فرایند متفاوتی است. Commit های SVN یا «check-ins» عملیاتی هستند که از راه دور روی یک سرور متمرکز Push می شوند. این بدان معناست که یک Commit در SVN برای "ذخیره سازی" کامل در تغییرهای پروژه، به دسترسی اینترنت نیاز دارد. Commit های Git می توانند به صورت محلی ثبت و ساخته شوند، سپس در صورت لزوم با استفاده از دستور زیر به یک سرور از راه دور Push می شوند.
git push -u origin master
تفاوت این دو روش، تفاوت اساسی بین الگو های معماری است. Git یک مدل کاربردی توزیع شده است در حالی که SVN یک مدل متمرکز است. برنامه های توزیع شده معمولا قدرت بیشتری دارند زیرا مانند یک سرور متمرکز، یک نقطه ی شکست ندارند.
دستورهای زیر همگی به صورت ترکیبی برای ذخیره یک snapshot از وضعیت فعلی یک پروژه در Git استفاده می شوند.
git add
git status
git commit
Git دارای یک مکانیسم اضافی ذخیره سازی به نام "stash" (به معنی ذخیره کردن) است. Stash یک انبار ذخیره سازی زودگذر برای تغییرهایی است که کاربر آماده ی انجام آن نیستند. Stash در Working Directory، روی شاخه ی اول از سه درخت، کار می کند و گزینه های زیادی برای استفاده دارد. برای کسب اطلاعات بیشتر به صفحه ی git stash مراجعه کنید.
یک مخزن Git می تواند به گونه ای پیکربندی شود که از فایل ها یا مسیرهای خاص چشم پوشی کند. با این کار Git از ذخیره ی تغییرها در هر گونه محتوای ignore شده، جلوگیری می کند. Git چندین روش پیکربندی دارد که لیست ignore را مدیریت می کند. پیکربندی ignore در Git، با جزئیات بیشتر در صفحه gitignore مورد بحث قرار گرفته است.
git add
دستور git add
تغییرهایی را در در ناحیه ی عملیاتی Working Directory اضافه می کند. این دستور به Git می گوید که شما می خواهید به روزرسانی های یک فایل خاص را در Commit بعدی قرار دهید. با این حال،git add به هیچ وجه روی مخزن تاثیر نمی گذارد، در واقع تا زمانی که دستور git commit
را اجرا نکنید، تغییرها ثبت نمی شوند.
همراه با این دستورها، برای مشاهده ی وضعیت Working Directory و ناحیه ی عملیاتی به دستور git commit
نیز نیاز خواهید داشت.
دستور git add چگونه کار می کند.
دستورهای git add
و git commit
گردش کاری Git را تشکیل می دهند. هر کاربر Git بدون توجه به مدل همکاری تیم خود، باید این دو دستور را درک کند. آن ها وسیله ای برای ثبت نسخه های یک پروژه، در تاریخچه ی مخزن هستند.
توسعه ی یک پروژه، پیرامون الگوی اساسی edit/stage/commit است. ابتدا فایل های خود را در Working Directory ویرایش می کنید. هنگامی که آماده ی ذخیره ی یک نسخه از وضعیت فعلی پروژه هستید، با دستور git add
تغییرها را اضافه کنید. بعد از اینکه از snapshot مرحله ی عملیاتی یا همان stage رضایت داشتید، با استفاده از دستور git commit
آن را در تاریخچه ی پروژه Commit کنید. از دستور git reset
برای Undo کردن یک Commit یا snapshot مرحله ی عملیاتی استفاده می شود.
افزون بر دستورهای git add
وgit commit
، سومین دستور به صورت git push
برای گردش کار مشترک Git ضروری است. از git push
برای ارسال تغییرهای Commit شده به مخازن از راه دور، استفاده می شود. این کار به سایر اعضای تیم این امکان را می دهد که به مجموعه ای از تغییرهای ذخیره شده، دسترسی پیدا کنند.
دستور git add
نباید با svn add
اشتباه شود، که یک فایل را به مخزن اضافه می کند. در عوض، git add کارهایی را در سطح انتزاعی تر و مستقل روی تغییرها انجام می دهد. یعنی git add هر زمان که فایل را تغییر می دهید باید فراخوانی شود، در حالی که svn add
برای هر فایل، فقط یک بار فراخوانی می شود. ممکن است اضافی به نظر برسد، اما این گردش کار، سازماندهی یک پروژه را بسیار آسان تر می کند.
ناحیه ی عملیاتی
کار اصلی دستور git add
این است که تغییرهایی که در صف انتظار در Working Directory هستند را به ناحیه ی git staging منتقل کند. ناحیه ی عملیاتی یکی از ویژگی های منحصر به فرد Git است. اگر شما قبلا با SVN (یا حتی Mercurial) کار کرده باشید، ممکن است مدتی طول بکشد تا کار با آن برای شما راحت شود. ناحیه عملیاتی به شما کمک می کند تا آن را به عنوان یک بافر بین Working Directory و تاریخچه ی پروژه در نظر بگیرید. ناحیه ی عملیاتی یکی از "سه درخت"Git همراه با گردش کار و تاریخچه ی Commit ها در نظر گرفته شده است.
به جای Commit همه تغییرهایی که از آخرین Commit اعمال شده دارید، Stage به شما این امکان را می دهد که قبل از Commit واقعی در تاریخچه ی پروژه، تغییرهای مربوط به آن را به snapshot های متمرکز، دسته بندی کنید. یعنی شما می توانید انواع ویرایش ها را روی فایل های غیرمرتبط انجام دهید، سپس برگردید و آن ها را با افزودن تغییرهای مربوط به Stage، به Commit های منطقی تقسیم کرده و آن ها را قطعه قطعه کنید. در هر سیستم کنترل نسخه، ایجاد Commit اصلی مهم است، تا ردیابی اشکال ها و برگرداندن تغییرها به حالت قبل را آسان کند به طوری که حداقل تاثیر را بر بقیه ی پروژه بگذارد.
گزینه های مشترک
git add <file>
تمام تغییرها را در <file>
برای Commit بعدی مرحله بندی کنید.
git add <directory>
تمام تغییرها را در <directory>
برای Commit بعدی مرحله بندی کنید.
git add -p
یک staging session تعاملی را شروع کنید که به شما این امکان را می دهد که بخش هایی از فایل را برای افزودن به Commit بعدی انتخاب کنید. این کار بخش بزرگی از تغییرها را به شما ارائه می دهد و شما می توانید از دستورهای زیر استفاده کنید.
- ازy برای مرحله بندی یا stage کردن تکه ها (chunk)
- از n برای ignore کردن
- از s برای تقسیم کردن به تکه های کوچک تر
- ازe برای ویرایش دستی قطعه
- از q برای خارج شدن
مثال ها
هنگام شروع یک پروژه جدید، دستورgit add
عملکردی مشابه svn import
دارد. برای ایجاد یک Commit اولیه از دایرکتوری جاری، از دو دستور زیر استفاده کنید:
git add .
git commit
هنگامی که پروژه ی خود را فعال کردید، می توانید با دستورgit add
، فایل های جدید اضافه کنید:
git add hello.py
git commit
از دستورهای بالا می توان برای ثبت تغییرها در فایل های موجود نیز استفاده کرد. Git، همچنان بین مرحله بندی تغییرها در فایل های جدید در مقابل تغییر در فایل هایی که قبلا به مخزن اضافه شده اند، تفاوتی نمی گذارد.
خلاصه
اگر بخواهیم مروری بر دستوارت این بخش داشته باشیم می توانیم بگوییم که:
git add
اولین دستور در یک زنجیره ی عملیاتی است که Git را به "ذخیره ی" یک snapshot از وضعیت فعلی پروژه، در تاریخچه ی Commit ها هدایت می کند. هنگامی که git add به طور خودکار مورد استفاده قرار می گیرد، تغییرها در صف انتظار را از Working Directory به ناحیه ی عملیاتی ارتقا می دهد.- از دستور
git status
برای بررسی وضعیت فعلی مخزن استفاده می شود. - از دستور
git reset
برای Undo کردن یک git add استفاده می شود. - سپس از دستور
git commit
برای Commit یک snapshot از دایرکتوری staging به تاریخچه ی Commit مخزن ها استفاده می شود.