-
1. شروع به کار
- 1.1 دربارهٔ کنترل نسخه
- 1.2 تاریخچهٔ کوتاهی از گیت
- 1.3 گیت چیست؟
- 1.4 خط فرمان
- 1.5 نصب گیت
- 1.6 اولین راهاندازی گیت
- 1.7 کمک گرفتن
- 1.8 خلاصه
-
2. مقدمات گیت
- 2.1 دستیابی به یک مخزن گیت
- 2.2 ثبت تغییرات در مخزن
- 2.3 دیدن تاریخچهٔ کامیتها
- 2.4 بازگردانی کارها
- 2.5 کار با ریموتها
- 2.6 برچسبگذاری
- 2.7 نامهای مستعار در گیت
- 2.8 خلاصه
-
3. شاخهسازی در گیت
- 3.1 شاخهها در یک کلمه
- 3.2 شاخهسازی و ادغام مقدماتی
- 3.3 مدیریت شاخه
- 3.4 روند کاری شاخهسازی
- 3.5 شاخههای ریموت
- 3.6 ریبیسکردن
- 3.7 خلاصه
-
4. گیت روی سرور
- 4.1 پروتکلها
- 4.2 راهاندازی گیت در سرور
- 4.3 ساختن کلید عمومی SSH
- 4.4 نصب و راهاندازی سرور
- 4.5 دیمن گیت
- 4.6 HTTP هوشمند
- 4.7 گیتوب
- 4.8 گیتلب
- 4.9 گزینههای شخصی ثالث میزبانی شده
- 4.10 خلاصه
-
5. گیت توزیعشده
- 5.1 روندهای کاری توزیعشده
- 5.2 مشارکت در یک پروژه
- 5.3 نگهداری یک پروژه
- 5.4 خلاصه
-
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. Customizing Git
- 8.1 Git Configuration
- 8.2 Git Attributes
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Summary
-
9. Git and Other Systems
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Summary
-
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 in Visual Studio
- A1.3 Git in Visual Studio Code
- A1.4 Git in Eclipse
- A1.5 Git in IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.6 Git in Sublime Text
- A1.7 Git in Bash
- A1.8 Git in Zsh
- A1.9 Git in PowerShell
- A1.10 Summary
-
A2. پیوست B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
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 شروع به کار - گیت چیست؟
گیت چیست؟
بنابراین به طور مختصر گیت چیست؟ این بخش مهمی برای یادگیری است، چراکه اگر بدانید گیت چیست و مقدمات اینکه چطوری کار میکند را درک کنید، کار کردن با گیت برای شما، احتمالاً به طور چشمگیری، آسانتر خواهد بود. همانطور که گیت را میآموزید، سعی کنید ذهن خود را از چیزهایی که ممکن است درباره دیگر VCSها مانند CVS، سابورژن یا Perforce میدانید پاک نگهدارید — این کار کمک میکند که از پیچیدگیهای حاصل ناخودآگاه به هنگام استفاده از این نرمافزار دوری کنید. اگرچه رابط کاربری گیت بسیار مشابه با دیگر VCSها است، اما گیت دربارهٔ اطلاعات و ذخیرهسازی آنها نگرش بسیار متفاوتی دارد و درک این تفاوتها به شما کمک میکند تا از گیج شدن حین استفاده اجتناب کنید.
اسنپشاتها، نه تفاوتها
تفاوت اصلی بین گیت و هر VCS دیگری (سابورژن و دوستان) در نحوهٔ نگرش گیت به دادههایش است. از منظر مفهومی، بیشتر دیگر سیستمها اطلاعات را به عنوان لیستی از تغییرات اعمال شده روی یک فایل پایه ذخیره میکنند. این دسته از سیستمها (CVS، سابورژن، Perforce، Bazaar، و غیره) به اطلاعاتی که ذخیره میکنند به عنوان مجموعهای از فایلها و تغییراتی که در طی زمان به آنها اعمال شده مینگرند (به طور کل این رفتار کنترل نسخه دلتا-پایه نامیده میشود).
![Storing data as changes to a base version of each file.](png/deltas.png)
گیت به داده یا ذخیره کردن آن به این نحو نمینگرد. در عوض، گیت به دادههایش بیشتر مانند یک سری از اسنپشاتهایی از یک فایلسیستم مینیاتوری مینگرد. با گیت، هر بار که کامیت (Commit/واگذاری) — یا وضعیت پروژه را ذخیره — میکنید، گیت یک تصویر از تمام شمایل فایلهای شما در آن لحظه میگیرد و یک رفرنس را به آن اسنپشات در خود ذخیره میکند. برای بهینه بودن، اگر فایلها تغییری نکرده بودند، گیت دیگر آن فایل را ذخیره نمیکند و فقط یک لینک به نسخه قبلی عیناً مشابه آن فایل که قبلاً ذخیره کرده بود را ذخیره میکند. گیت به دادههایش بیشتر مثل جریانی از اسنپشاتها مینگرد.
![Git stores data as snapshots of the project over time.](png/snapshots.png)
این نقطه تمایز مهمی بین گیت و تقریباً تمام دیگر 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.](png/areas.png)
درخت کاری یا درخت فعال یک چکاوت از یکی از نسخههای پروژه است. این فایلها از پایگاهداده فشرده درون پوشه گیت بیرون کشیده شده و روی دیسک برای استفاده یا ویرایش شما گذاشته میشوند.
صحنه یا استیج یک فایل است که عموماً در پوشه گیت شماست، که اطلاعاتی درباره اینکه در کامیت بعدی چه چیزی باشد را شامل میشود. نام فنی آن در ادبیات گیتی «ایندکس» است، اما عبارت «صحنه» هم به کار گرفته میشود.
پوشه گیت جایی است که گیت فرادادهها (Metadata) و آبجکتهای پایگاهداده را برای پروژه شما نگهداری میکند. این مهمترین جز گیت است و چیزی است که وقتی یک مخزن را از کامپیوتری دیگر کلون میکنید کپی میشود.
روند کاری پایه گیت به این شکل است:
-
شما فایلهایی را در درخت کاری خود ویرایش میکنید.
-
به طور انتخابی آنهایی را که میخواهید در کامیت بعدیتان باشند را به صحنه میآورید — استیج میکنید — که باعث میشود فقط آن تغییرات به صحنه اضافه شوند ولاغیر آن چیزی که انتخاب کردید.
-
یک کامیت میگیرید که فایلها را آنگونه که در صحنه بودند را به طور دائمی به اسنپشاتی در پوشه گیت شما تبدیل میکند.
اگر نسخه خاصی از فایلی در پوشه گیت است کامیتشده به حساب میآید. اگر ویرایش شده و به صحنه اضافه شده، استیجشده است. و اگر از موقعی که چکاوت شده تغییری در آن ایجاد شده ولکن استیج نشده، ویرایششده است. در مقدمات گیت، بیشتر درباره این حالات و اینکه چطور میتوان از آنها در استیج استفاده کرد یا به طور کلی آنها را دور زد را میآموزید.