Chapters ▾ 2nd Edition

1.3 شروع به کار (getting started) - گیت چیست؟ (What is Git?)

گیت چیست؟ (What is Git?)

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

اسنپ شات ها، بدون تغییرات (Snapshots, Not Differences)

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

Storing data as changes to a base version of each file
نمودار 4. Storing data as changes to a base version of each file

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

Git stores data as snapshots of the project over time
نمودار 5. Storing data as snapshots of the project over time

این یک تمایز مهم بین گیت و تقریبا تمام VCS های دیگر است. این باعث می شود که گیت تقریباً هر جنبه ای از کنترل نسخه را که اکثر سیستم های دیگر از نسل قبلی کپی کرده اند، دوباره در نظر بگیرد. این باعث می شود که گیت بیشتر شبیه به یک فایل سیستم کوچک با برخی از ابزارهای فوق العاده قدرتمند ساخته شده در بالای آن باشد، نه فقط یک VCS. ما برخی از مزایایی را که با فکر کردن به داده های خود به این شکل به دست می آورید، بررسی خواهیم کرد وقتی که شاخه سازی گیت را در انشعاب‌گیری در گیت (Git Branching) پوشش می دهیم.

تقریبا همه عملیات ها محلی هستند (Nearly Every Operation Is Local)

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

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

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

گیت دارای یکپارچگی است (Git Has Integrity)

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

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

24b9da6552252987aa493b52f8696cd6d3b00373

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

گیت به طور کلی فقط داده ها را اضافه می کند (Git Generally Only Adds Data)

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

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

سه مرحله (The Three States)

حالا توجه کنید — این مهم ترین چیزی است که باید در مورد گیت به خاطر بسپارید اگر می خواهید بقیه فرآیند یادگیری شما بدون مشکل پیش برود. گیت سه حالت اصلی دارد که فایل های شما می توانند در آن باشند: modified، staged، و committed:

  • اصلاح شده به این معنی است که شما فایل را تغییر داده اید اما هنوز آن را به پایگاه داده خود اختصاص نداده اید.

  • مرحله ای به این معنی است که شما یک فایل اصلاح شده را در نسخه فعلی آن برای رفتن به عکس فوری بعدی خود علامت گذاری کرده اید.

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

این ما را به سه بخش اصلی یک پروژه گیت می رساند: درخت کار، منطقه مرحله بندی، و دایرکتوری گیت.

Working tree, staging area, and Git directory
نمودار 6. Working tree, staging area, and Git directory

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

منطقه مرحله بندی یک فایل است، که معمولا در دایرکتوری گیت شما قرار دارد، که اطلاعات مربوط به آنچه که در کامیت بعدی شما قرار می گیرد را ذخیره می کند. نام فنی آن در زبان گیت “index” است، اما عبارت “staging area” نیز به خوبی کار می کند.

دایرکتوری گیت جایی است که گیت متاداتا و پایگاه داده شی را برای پروژه شما ذخیره می کند. این مهم ترین بخش گیت است، و این چیزی است که کپی می شود زمانی که شما یک مخزن را از یک کامپیوتر دیگر کپی می کنید.

روند کار گیت چیزی شبیه به این است:

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

  2. شما به طور انتخابی فقط آن تغییرات را که می خواهید بخشی از commit بعدی خود باشید، که فقط آن تغییرات را به منطقه مرحله بندی اضافه می کند.

  3. شما یک کامیت انجام می دهید، که فایل ها را همانطور که در منطقه مرحله بندی هستند می گیرد و آن عکس را به طور دائم در دایرکتوری گیت شما ذخیره می کند.

اگر یک نسخه خاص از یک فایل در دایرکتوری گیت باشد، تعهد شده محسوب می شود. اگر آن را اصلاح کرده اند و به منطقه مرحله اضافه شد، آن را staged است. و اگر از زمان چک کردن آن تغییر کرده باشد، اما مرحله ای نشده باشد، تعدیل شده است. در مقدمات گیت (git basics chapter)، شما بیشتر در مورد این حالت ها خواهید آموخت و اینکه چگونه می توانید از آنها استفاده کنید یا بخش مرحله ای را به طور کامل حذف کنید.

خط فرمان (Command Line)

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

پس انتظار می‌رود که بتوانید ترمینال را در مک یا Command Prompt / PowerShell را در ویندوز باز کنید. اگر با این موضوع آشنایی ندارید، بهتر است قبل از ادامه کمی دربارهٔ آن تحقیق کنید تا بتوانید مثال‌ها و توضیحات کتاب را بهتر دنبال کنید.

scroll-to-top