Git
Chapters ▾ 2nd Edition

1.3 شروع به کار - گیت چیست؟

گیت چیست؟

بنابراین به طور مختصر گیت چیست؟ این بخش مهمی برای یادگیری است، چراکه اگر بدانید گیت چیست و مقدمات اینکه چطوری کار می‌کند را درک کنید، کار کردن با گیت احتمالاً به طور چشم‌گیری برای شما آسان‌تر خواهد بود. همانطور که گیت را می‌آموزید، سعی کنید ذهن خود را از چیزهایی که ممکن است درباره دیگه VCSها مانند CVS، ساب‌ورژن یا Perforce می‌دانید پاک نگه‌دارید — این کار کمک می‌کند که از پیچیدگی‌های حاصله ناخودآگاه به هنگام استفاده از این نرم‌افزار دوری بمانید. اگرچه رابط کاربری گیت بسیار مشابه با دیگر VCSها است،‌ اما گیت دربارهٔ اطلاعات و ذخیره‌سازی آنها نگرش بسیار متفاوتی دارد و درک این تفاوت‌ها به شما کمک می‌کند تا از گیج شدن حین استفاده خودداری کنید.

اسنپ‌شات‌ها، نه تفاوت‌ها

تفاوت اصلی بین گیت و هر VCS دیگری (ساب‌ورژن و دوستان) در نحوهٔ نگرش گیت به داده‌هایش است. از منظر مفهومی، بیشتر دیگر سیستم‌ها اطلاعات را به عنوان لیستی از تغییرات اعمال شده روی یک فایل پایه ذخیره می‌کنند. این دسته از سیستم‌ها (CVS، ساب‌ورژن، Perforce، Bazaar، و غیره) به اطلاعاتی که ذخیره می‌کنند به عنوان مجموعه‌ای از فایل‌ها و تغییراتی که در طی زمان به آنها اعمال شده می‌نگرند (به طور کل این رفتار کنترل نسخه دلتا-پایه نامیده می‌شود).

Storing data as changes to a base version of each file.
Figure 4. ذخیره داده‌ها به عنوان تغییرات اعمال شده به روی یک نسخه پایه از هر فایل.

گیت به داده یا ذخیره‌کردن آن به این نحو نمی‌نگرد. در عوض، گیت به داده‌هایش بیشتر به مانند یک سری از اسنپ‌شات‌هایی از یک فایل‌سیستم مینیاتوری می‌نگرد. با گیت، هر بار که کامیت (Commit/واگذاری) — یا وضعیت پروژه را ذخیره — می‌کنید، گیت یک تصویر از تمام شمایل فایل‌های شما در آن لحظه می‌گیرد و یک رفرنس را به آن اسنپ‌شات در خود ذخیره می‌کند. برای بهینه بودن، اگر فایل‌ها تغییری نکرده بودند، گیت دیگر آن فایل را ذخیره نمی‌کند و فقط یک لینک به نسخه قبلی عیناً مشابه آن فایل که قبلاً ذخیره کرده بود را جایگزین می‌کند. گیت به داده‌هایش بیشتر به مثل جریانی از اسنپ‌شات‌ها می‌نگرد.

Git stores data as snapshots of the project over time.
Figure 5. ذخیره داده‌ها به عنوان اسنپ‌شات‌هایی از پروژه در طول زمان.

این نقطه تمایز مهمی بین گیت و تقریباً تمام دیگر VCSهاست؛ باعث این است که گیت غالب دیدگاه‌های کنترل نسخه را که بیشتر سیستم‌ها از نسل‌های قبل کپی کرده بودند را بازبینی کند. همین اصل گیت را بیشتر یک فایل‌سیستم کوچک با ابزارهای افزودهٔ خارق‌العاده قدرتمند می‌کند تا یک VCS خشک و خالی. در ادامه، هنگامی که برنچ‌سازی در شاخه‌سازی در گیت توضیح داده شد، مفصل‌تر مزایای دیدن داده‌هایتان به روش گیت را بررسی خواهیم کرد.

غالب عملیات‌ها محلی است

اکثر عملیات‌ها در گیت فقط به فایل‌های محلی و منابع نیاز دارند تا کار کنند — عموماً اطلاعاتی از کامپیوتر دیگری روی شبکهٔ شما احتیاج نیست. اگر به یک CVCS دیگر عادت دارید که بیشتر عملیات‌ها آن تأخیر مازاد شبکه را دارند، این جنبه از گیت باعث می‌شود که فکر کنید خدایان سرعت گیت را با قدرت‌های ماورا طبیعی تجهیز کردند. چراکه شما تمام تاریخچه پروژه را همین جا روی هارد‌دیسک خود دارید، اکثر عملیات‌ها تقریباً درجا انجام می‌شوند.

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

علاوه بر آن به این معناست که تنها تعداد کمی از کار‌ها را هنگام آفلاین بودن یا آف-VPN بودن نمی‌توانید انجام دهید. اگر سوار هواپیما یا قطار شده‌اید و می‌خواهید کمی کار کنید، می‌توانید با سعادت کامیت کنید (البته به کپی محلی خودتان، به‌یاد‌ دارید؟) تا به یک شبکه متصل شوید تا آپلود لازمه را انجام دهید. اگر به خانه رفته‌اید و کلاینت VPN شما پاسخگو نیست، همچنان می‌توانید کار کنید. در بسیاری از دیگر سیستم‌ها، انجام این کارها یا بسیار دردناک است یا غیرممکن. در Perforce، به طور مثال، مادامی که به سرور متصل نیستید نمی‌توانید کار خاصی بکنید؛ در ساب‌ورژن و CVS، شما می‌توانید فایل‌ها را ویرایش کنید، اما نمی‌توانید تغییرات را به پایگاه‌داده‌تان کامیت کنید (چون پایگاه‌داده شما آفلاین است). شاید این مشکل بزرگی به نظر نرسد، اما در عمل از تفاوت احتمالی عظیمی که ایجاد می‌کند، متعجب خواهید شد.

گیت یکپارچگی دارد

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

سازوکاری که گیت برای چک‌سام کردن استفاده می‌کند هش یا درهم‌سازی SHA-1 نام دارد. این هش یک رشته ۴۰-حرفی ساخته شده از کاراکترهای هگزادسیمال (0-9 و a-f) است و بر اساس محتوای یک فایل یا ساختار پوشه در گیت محاسبه می‌شود. یک هش SHA-1 چیزی شبیه به این است:

24b9da6552252987aa493b52f8696cd6d3b00373

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

به طور کلی گیت فقط داده می‌افزاید

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

این‌ها همه استفاده از گیت را به یکی از لذت‌های دنیوی تبدیل می‌کند چراکه می‌دانیم که می‌توانیم آزمون و خطای بدون خطر خراب‌کاری کردن داشته باشیم. برای نظارهٔ عمیق اینکه چگونه گیت داده‌هایش را ذخیره می‌کند و اینکه چگونه می‌توانید اطلاعاتی که به نظر از دست‌رفته می‌آیند را بازگردانی کنید به برگشت کارها مراجعه کنید.

سه حالت ممکنه

حال توجه کنید — مسئله اصلی که باید درباره گیت بخاطر بسپارید اگر می‌خواهید که فرآیند یادگیری شما به سادگی پیش رود، اینجاست. گیت سه حالت اصلی دارد که فایل‌های شما می‌توانند به خود بگیرند: ویرایش‌شده، استیج‌شده و کامیت‌شده:

  • ویرایش‌شده (Modified) به این معناست که شما تغییری در فایل ایجاد کرده‌اید اما هنوز آنرا به پایگاه داده خود کامیت نکرده‌اید.

  • استیج‌شده به این معناست که شما ویرایشی در فایل را نسخهٔ حال آن علامت‌گذاری کرده‌اید تا به اسنپ‌شاتِ کامیت بعدی شما اضافه شود.

  • کامیت‌شده به این معناست که اطلاعات با امنیت کامل در پایگاه‌داده محلی شما ذخیره شده‌اند.

پس از این به سه بخش اصلی یک پروژه گیت می‌رسیم: درخت فعال/کاری (Working Tree)، صحنه (Staging Area) و پوشه گیت.

Working tree, staging area, and Git directory.
Figure 6. درخت کاری، صحنه و پوشه گیت.

درخت کاری یا درخت فعال یک چک‌اوت از یکی از نسخه‌های پروژه است. این فایل‌ها از پایگاه‌داده فشرده درون پوشه گیت بیرون کشیده شده و روی دیسک برای استفاده یا ویرایش شما گذاشته می‌شوند.

صحنه یا استیج یک فایل است، عموماً در پوشه گیت شماست، که اطلاعاتی درباره اینکه در کامیت بعدی چه چیزی باشد را شامل می‌شود. نام فنی آن در ادبیات گیتی «ایندکس» است، اما عبارت «صحنه» هم به کار گرفته می‌شود.

پوشه گیت جایی است که گیت فراداده‌ها (Metadata) و آبجکت‌های پایگاه‌داده را برای پروژه شما نگه‌داری می‌کند. این مهمترین جز گیت است، و چیزی است که وقتی یک مخزن را از کامپیوتری دیگر کلون می‌کنید کپی می‌شود.

روند کاری پایه گیت به این شکل است:

  1. شما فایل‌هایی را در درخت کاری خود ویرایش می‌کنید.

  2. به طور انتخابی آن‌هایی را که می‌خواهید در کامیت بعدیتان باشند را به صحنه می‌آورید — استیج می‌کنید — که باعث می‌شود فقط آن تغییرات به صحنه اضافه شوند ولاغیر آن چیزی که انتخاب کردید.

  3. یک کامیت می‌گیرید، که فایل‌ها را آنگونه که در صحنه بودند را به طور دائمی به اسنپ‌شاتی در پوشه گیت شما تبدیل می‌کند.

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