-
1. شروع به کار (getting started)
-
2. مقدمات گیت (git basics chapter)
- 2.1 گرفتن یک مخزن گیت (Getting a Git Repository)
- 2.2 ثبت تغییرات در مخزن (Recording Changes to the Repository)
- 2.3 مشاهده تاریخچه کامیتها (Viewing the Commit History)
- 2.4 بازگرداندن تغییرات (Undoing Things)
- 2.5 کار کردن با ریموت ها (Working with Remotes)
- 2.6 تگ کردن (Tagging)
- 2.7 نام مستعار گیت (Git Aliases)
- 2.8 خلاصه (summary)
-
3. انشعابگیری در گیت (Git Branching)
-
4. گیت روی سرور (Git on the server)
- 4.1 پروتکلها (The Protocols)
- 4.2 راهاندازی گیت روی یک سرور (Getting Git on a Server)
- 4.3 ایجاد کلید عمومی SSH شما (Generating Your SSH Public Key)
- 4.4 نصب و راهاندازی سرور (Setting up server)
- 4.5 سرویسدهنده گیت (Git Daemon)
- 4.6 HTTP هوشمند (Smart HTTP)
- 4.7 گیتوب (GitWeb)
- 4.8 گیتلب (GitLab)
- 4.9 گزینههای میزبانی شخص ثالث (Third Party Hosted Options)
- 4.10 خلاصه (Summary)
-
5. گیت توزیعشده (Distributed git)
-
6. GitHub (گیت هاب)
-
7. ابزارهای گیت (Git Tools)
- 7.1 انتخاب بازبینی (Revision Selection)
- 7.2 مرحلهبندی تعاملی (Interactive Staging)
- 7.3 ذخیره موقت و پاکسازی (Stashing and Cleaning)
- 7.4 Signing Your Work (امضای کارهای شما)
- 7.5 جستجو (Searching)
- 7.6 بازنویسی تاریخچه (Rewriting History)
- 7.7 بازنشانی به زبان ساده (Reset Demystified)
- 7.8 ادغام پیشرفته (Advanced Merging)
- 7.9 بازاستفاده خودکار از حل تضادها (Rerere)
- 7.10 اشکالزدایی با گیت (Debugging with Git)
- 7.11 سابماژول ها (Submodules)
- 7.12 بستهبندی (Bundling)
- 7.13 جایگزینی (Replace)
- 7.14 ذخیرهسازی اطلاعات ورود (Credential Storage)
- 7.15 خلاصه (Summary)
-
8. سفارشیسازی Git (Customizing Git)
-
9. گیت و سیستمهای دیگر (Git and Other Systems)
-
10. (Git Internals)
- 10.1 ابزارها و دستورات سطح پایین (Plumbing and Porcelain)
- 10.2 اشیا گیت (Git Objects)
- 10.3 مراجع گیت (Git References)
- 10.4 فایلهای بسته (Packfiles)
- 10.5 نگاشت (The Refspec)
- 10.6 پروتکلهای انتقال (Transfer Protocols)
- 10.7 نگهداری و بازیابی دادهها (Maintenance and Data Recovery)
- 10.8 متغیرهای محیطی (Environment Variables)
- 10.9 (Summary)
-
A1. پیوست A: گیت در محیطهای دیگر (Git in Other Environments)
- A1.1 رابط های گرافیکی (Graphical Interfaces)
- A1.2 Git در ویژوال استودیو (Git in Visual Studio)
- A1.3 Git در Visual Studio Code (Git in Visual Studio Code)
- A1.4 Git در IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine (Git in IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine)
- A1.5 Git در Sublime Text (Git in Sublime Text)
- A1.6 گیت در بش (Git in Bash)
- A1.7 Git در Zsh (Git in Zsh)
- A1.8 Git در PowerShell (Git in PowerShell)
- A1.9 خلاصه (Summary)
-
A2. پیوست B: گنجاندن گیت در برنامههای شما (Embedding Git in your Applications)
-
A3. پیوست C: دستورات گیت (Git Commands)
- A3.1 تنظیم و پیکربندی (Setup and Config)
- A3.2 گرفتن و ایجاد پروژهها (Getting and Creating Projects)
- A3.3 نمونهبرداری پایهای (Basic Snapshotting)
- A3.4 انشعابگیری و ادغام (Branching and Merging)
- A3.5 بهاشتراکگذاری و بهروزرسانی پروژهها (Sharing and Updating Projects)
- A3.6 بازرسی و مقایسه (Inspection and Comparison)
- A3.7 عیبیابی (Debugging)
- A3.8 اعمال تغییرات به صورت پچ (Patching)
- A3.9 ایمیل (Email)
- A3.10 سیستمهای خارجی (External Systems)
- A3.11 مدیریت (Administration)
- A3.12 دستورات سطح پایین گیت (Plumbing Commands)
1.3 شروع به کار (getting started) - گیت چیست؟ (What is Git?)
گیت چیست؟ (What is Git?)
پس، گیت به طور خلاصه چیست؟ این بخش مهمی است که باید به خوبی درک شود، زیرا اگر بفهمید گیت چیست و اصول پایهای نحوه کار آن چگونه است، استفاده مؤثر از گیت برای شما احتمالاً بسیار آسانتر خواهد بود. وقتی در حال یادگیری گیت هستید، سعی کنید ذهن خود را از چیزهایی که ممکن است درباره سایر سیستمهای کنترل نسخه مانند CVS، سابورژن یا پروفورس بدانید پاک کنید — این کار به شما کمک میکند تا هنگام استفاده از این ابزار از سردرگمیهای ظریف جلوگیری کنید. اگرچه رابط کاربری گیت تا حدی شبیه به این سیستمهای کنترل نسخه است، گیت اطلاعات را به روشی بسیار متفاوت ذخیره و پردازش میکند و درک این تفاوتها به شما کمک میکند تا هنگام استفاده از آن دچار سردرگمی نشوید.
اسنپ شات ها، بدون تغییرات (Snapshots, Not Differences)
تفاوت اصلی بین گیت و هر سیستم کنترل نسخهی دیگری (از جمله سابورژن و مشابهها) در نحوهی تفکر گیت درباره دادههایش است. به طور مفهومی، بیشتر سیستمهای دیگر اطلاعات را به صورت فهرستی از تغییرات مبتنی بر فایل ذخیره میکنند. این سیستمهای دیگر (CVS، سابورژن، پروفورس و غیره) اطلاعاتی که ذخیره میکنند را به عنوان مجموعهای از فایلها و تغییراتی که در هر فایل در طول زمان ایجاد شده است، در نظر میگیرند (که معمولاً به آن کنترل نسخه مبتنی بر دلتا گفته میشود).

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

این یک تمایز مهم بین گیت و تقریبا تمام 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:
-
اصلاح شده به این معنی است که شما فایل را تغییر داده اید اما هنوز آن را به پایگاه داده خود اختصاص نداده اید.
-
مرحله ای به این معنی است که شما یک فایل اصلاح شده را در نسخه فعلی آن برای رفتن به عکس فوری بعدی خود علامت گذاری کرده اید.
-
تعهد به این معنی است که داده ها به طور ایمن در پایگاه داده محلی شما ذخیره می شوند.
این ما را به سه بخش اصلی یک پروژه گیت می رساند: درخت کار، منطقه مرحله بندی، و دایرکتوری گیت.

درخت کار یک چک کردن واحد از یک نسخه از پروژه است. این فایل ها از پایگاه داده فشرده شده در دایرکتوری گیت بیرون آورده می شوند و روی دیسک قرار می گیرند تا شما بتوانند از آن ها استفاده کنید یا آن ها را تغییر دهید.
منطقه مرحله بندی یک فایل است، که معمولا در دایرکتوری گیت شما قرار دارد، که اطلاعات مربوط به آنچه که در کامیت بعدی شما قرار می گیرد را ذخیره می کند. نام فنی آن در زبان گیت “index” است، اما عبارت “staging area” نیز به خوبی کار می کند.
دایرکتوری گیت جایی است که گیت متاداتا و پایگاه داده شی را برای پروژه شما ذخیره می کند. این مهم ترین بخش گیت است، و این چیزی است که کپی می شود زمانی که شما یک مخزن را از یک کامپیوتر دیگر کپی می کنید.
روند کار گیت چیزی شبیه به این است:
-
شما فایل ها را در درخت کار خود اصلاح می کنید.
-
شما به طور انتخابی فقط آن تغییرات را که می خواهید بخشی از commit بعدی خود باشید، که فقط آن تغییرات را به منطقه مرحله بندی اضافه می کند.
-
شما یک کامیت انجام می دهید، که فایل ها را همانطور که در منطقه مرحله بندی هستند می گیرد و آن عکس را به طور دائم در دایرکتوری گیت شما ذخیره می کند.
اگر یک نسخه خاص از یک فایل در دایرکتوری گیت باشد، تعهد شده محسوب می شود. اگر آن را اصلاح کرده اند و به منطقه مرحله اضافه شد، آن را staged است. و اگر از زمان چک کردن آن تغییر کرده باشد، اما مرحله ای نشده باشد، تعدیل شده است. در مقدمات گیت (git basics chapter)، شما بیشتر در مورد این حالت ها خواهید آموخت و اینکه چگونه می توانید از آنها استفاده کنید یا بخش مرحله ای را به طور کامل حذف کنید.
خط فرمان (Command Line)
راههای مختلفی برای استفاده از گیت وجود دارد. ابزارهای اصلی خط فرمان و همچنین چندین رابط کاربری گرافیکی با امکانات متفاوت در دسترساند. در این کتاب، ما گیت را از طریق خط فرمان به کار خواهیم برد. چرا؟ اول اینکه فقط با خط فرمان میتوانید تمام دستورات گیت را اجرا کنید؛ چون اکثر رابطهای گرافیکی برای سادهتر شدن، فقط بخشی از قابلیتهای گیت را پوشش میدهند. اگر بتوانید نسخه خط فرمان را اجرا کنید، احتمالاً کار با نسخه گرافیکی را هم میتوانید یاد بگیرید، اما برعکس آن همیشه ممکن نیست. همچنین، انتخاب کلاینت گرافیکی بیشتر به سلیقه شخصی شما بستگی دارد، اما همه کاربران معمولا خط فرمان را روی سیستم خود دارند و آن را استفاده میکنند.
پس انتظار میرود که بتوانید ترمینال را در مک یا Command Prompt / PowerShell را در ویندوز باز کنید. اگر با این موضوع آشنایی ندارید، بهتر است قبل از ادامه کمی دربارهٔ آن تحقیق کنید تا بتوانید مثالها و توضیحات کتاب را بهتر دنبال کنید.