گیت (نرم‌افزار)

بندانگشتی|تصویری از یک پروژه گیت در صفحه ی وب
**گیت**  یک نرم‌افزار کنترل نسخه می‌باشد.

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

## تعریف مسئله
فرض کنید قرار است یک گزارش بنویسید. پس از تایپ، می‌فهمید که بهتر است تغییراتی در نوشتار بدهید، اما چه نامی برای فایل جدید باید بگذارید و در کجا بگذارید تا هم فایل قبلی در دسترس باشد و هم فایل جدید به عنوان فایل اصلی نمایان شود؟ حال همکار شما نیز می‌خواهد تغییراتی اعمال کند، اما اساساً برنامه واژه پرداز او با شما فرق دارد. گیت علاج کار است؛ یعنی نسخه‌های متفاوت گزارش‌ها را بایگانی می‌کند. هر بار که گزارشی سپارش (commit) می‌شود، مخزن به هنگام می‌شود.

## خصوصیات
**گیت** از مدل نرم‌افزارهای آزاد و متن‌باز برای بازنگری کد منبع توزیع شده و مدیریت منبع کد استفاده می‌کند که برای دنبال کردن تغییر فایل‌ها و دنبال کردن کارهای انجام شده روی آن‌ها توسط افراد مختلف است. هدف اولیه این نرم‌افزار برای استفاده در پروژه‌های نرم‌افزاری بوده است ولی می‌توان از آن تنها برای دنبال کردن تغییر فایل‌ها هم استفاده کرد.
از ۲۶ ژوئیه ۲۰۱۵ جونیو همنو مسئول نگهداری از پروژهٔ گیت است.

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

## نام
لینوس تروالدز در مورد نام گیت بیان نمود که، در زبان انگلیسی اصطلاحی است برای انسانی احمق و ناخوشایند. توروالدز گفت: من فردی از خود راضی هستم، و تمام پروژه‌هایم را به افتخار خودم نامگذاری نموده‌ام. اول لینوکس و الان هم گیت. در صفحه راهنمای گیت در شل لینوکس، گیت به عنوان یک ردیاب محتوای احمق توصیف شده است.

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

تا قبل از ۲۰۰۲ برای گسترش کرنل از هیچ نرم‌افزار کنترل نسخه استفاده نمی‌شد و هر فردی که در گسترش کرنل نقش داشت به شکل خصوصی از نرم‌افزارهایی مانند SVN/CVS استفاده می‌کرد و دلیلش آن بود که هیچ‌کدام از نرم‌افزارهای کنترل نسخه این توانایی را نداشتند که حجم تغییرهایی که در لینوکس اتفاق می‌افتاد را پشتیبانی کنند. در این سال لینوس از BitKeeper به عنوان نرم‌افزار کنترل نسخه رسمی لینوکس استفاده کرد که به گسترش دهنده‌های کرنل (هر پروژهٔ متن باز) اجازه می‌داد به صورت رایگان از BitKeeper استفاده کنند.

در سال ۲۰۰۵، پس از ایجاد اختلاف میان توسعه‌دهندگان لینوکس و شرکت سازندهٔ BitKeeper، دسترسی رایگان به این ابزار برای توسعهٔ هستهٔ لینوکس قطع شد. این رویداد، لینوس توروالدز را بر آن داشت تا یک سیستم کنترل نسخه جدید طراحی کند. وی در کمتر از دو هفته، نسخهٔ اولیهٔ گیت را توسعه داد؛ ابزاری که ویژگی‌هایی چون سرعت بالا، امنیت، ساختار توزیع‌شده و شاخه‌سازی کارآمد را ارائه می‌داد.

توسعه گیت در ماه آوریل سال ۲۰۰۵ آغاز شد و تنها ۲ هفته بعد از شروع توسعه، گیت قادر بود شاخه‌ها (branch) را ادغام (merge) کند. ۲ ماه بعد گیت به عنوان نرم‌افزار کنترل نسخه رسمی برای گسترش لینوکس مورد استفاده قرار گرفت.

## ساختار گیت
در طراحی گیت از نرم‌افزارهای Bitkeeper و Monotone الهام گرفته شده است. گیت در ابتدا به صورت یک نرم نرم‌افزار کنترل نسخه سطح پایین نوشته شد به این صورت که دیگران بتوانند برای آن نرم‌افزار لایه رویی بنویسند. با این که گیت از bitkeeper تأثیرها و الهام زیادی داشته است در آن تلاش شده است که روش‌های استفاده شده منحصر به فرد باشند.

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

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

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

#### تطبیق‌پذیری با سیستم‌های خارجی و پروتکل‌ها
تاریخچه می‌تواند در فرمت‌های مختلفی از جمله پروتکل انتقال ابرمتن (HTTP) و پروتکل انتقال فایل (FTP) و آرسینک یا یک پروتوکل گیت تحت سوکت یا پوسته ایمن (SSH) منتشر شود. همچنین یک سازنده سرور سیستم نسخه‌های هم‌روند دارد که توسط آن سیستم نسخه‌های هم‌روند کاربر و محیط یکپارچه توسعه نرم‌افزار (IDE) می‌توانند به تاریخچه گیت دسترسی پیدا کنند.

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

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

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

#### استراتژی‌های ادغام‌سازی قابل اتصال
الگوریتم ادغام‌سازی گیت یک ادغام‌سازی کامل نیست؛ و در مواردی که نتواند ادغام‌سازی را انجام دهد به کاربر اطلاع داده و از اون می‌خواهد تا استراتژی مورد نظر خود برای ادغام‌سازی را انتخاب کند.

#### آشغال‌ها باقی می‌مانند تا وقتی جمع‌آوری شوند
بعضی از قابلیت‌ها و بعضی از پردازه‌های استفاده نشده در پروژه برای پروژه بدون استفاده خواهند بود ولی در گیت باقی می‌مانند و به آن‌ها اصطلاحاً آشغال گفته می‌شود. وقتی حافظه مربوط به آشغال‌ها پر شود گیت به صورت خودکار جمع‌آوری آشغال را انجام می‌دهد. همچنین می‌توان با این دستور آن را انجام داد. 
```text
git gc --prune
```


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

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

این پایگاه داده چهار نوع داده را ذخیره می‌کند.
* حباب (blob) شامل اطلاعات یک فایل است. blob دارای نام یا تاریخ نیست و نام آن از اطلاعات داخل آن نشئت می‌گیرد.
* درخت (tree) نشئت گرفته از یک پوشه است و لیستی از مجموعه فایل‌ها را ذخیره می‌کند. در این لیست لینک‌های مربوط به حباب‌ها ذخیره می‌شود.
* اعمال (commit) مجموعه‌ای از درخت‌ها را در خود ذخیره می‌کند. شامل اسم درخت‌ها، تاریخ اعمال، توضیحات (log message) و نام‌ها مربوط به اعمال‌های والدین خود است.
* برچسب (tag) شامل یک اشاره به دادهٔ دیگر است که در آن فراداده مورد نظر ذخیره می‌شود. اخیراً از آن برای نگهداری امضای مربوطه نیز استفاده می‌شود.
سرورهای گیت عموماً از پورت (TCP port 9418) استفاده می‌کنند.

### رابطه‌ها
هر داده‌ای داخل گیت که به آن رابطه‌ای شناسانده نشده باشد می‌تواند با اجرای دستور جمع‌آوری زباله یا به صورت خودکار حذف شود. رابطه‌ها ممکن است از یک داده به داده‌ای دیگر یا به صورت مجزا باشند. گیت مدل‌های مختلفی از رابطه دارد؛ و دستورها مختلفی برای دسترسی به آن‌ها وجود دارد. چند نمونه از انواع رابطه:
* سر (head): به صورت محلی به یک داده اشاره دارد.
* کنترل از دور (remote): به یک داده خارجی اشاره دارد.
* ذخیره‌ای (stash): به یک داده که هنوز اعمال نشده اشاره دارد.
* برچسب (tag): در بالاتر توضیح داده شد.

در پوشهٔ پایهٔ هر پروژه که با استفاده از گیت مدیریت می‌شود پوشه‌ای با نام git. (نقطه git) وجود دارد که تمامی اطلاعات مربوط به پروژه (تاریخچه، برچسب‌ها، ...) را در خود نگه می‌دارد. این ساختار برخلاف ساختار سابورژن است که در هر زیرشاخه یک پوشهٔ svn. (نقطه svn) دارد. از جمله پرونده‌هایی که در پوشهٔ git. وجود دارند، config است که تنظیمات مخزن را در خود نگه می‌دارد.

## پیاده‌سازی
بندانگشتی|نمایی از نسخه گرافیکی گیت(gitg)
گیت در ابتدا برای لینوکس نوشته شده است ولی علاوه بر آن سیستم‌های عامل دیگری از جمله ویندوز و مک و Solaris و BSD را نیز پشتیبانی می‌کند.

اولین نسخه‌ای از گیت که در ویندوز اجرا شد بر روی یک مجازی‌ساز لینوکس در ویندوز بود. گیت در ویندوز تعدادی ابزار برای اجرای فایل‌بندی‌های مربوط به لینوکس و تعدادی دیگر از امکانات لینوکس از جمله perl 5 و mysys 2.0 و یک نسخه از Cigwin و کامپایلر MinGW است. امروزه نسخه نصب گیت برای ویندوزهای ورژن ۳۲ بیتی و ۶۴ بیتی وجود دارد.

همچنین برای استفاده در جاوا JGit نوشته شده است و مثلاً ابزار Eclipse از یک نسخه کاربر از این ابزار استفاده می‌کند.

ابزار Dulwitch برای استفاده از گیت در python نوشته شده است.

همچنین libgit2 یک کتابخانه تحت ANSI C نوشته شده است که به هیچ زبان دیگری نیاز ندارد. این ابزار در محیط‌های مختلفی از جمله ویندوز ویندوز و لینوکس و مک قابل استفاده است و از زبان‌های برنامه‌نویسی مختلفی از جمله Rubby و Python و Haskell پشتیبانی می‌کند.

برای زبان java script نیز کتابخانه JS-Git نوشته شده است.

## سرور گیت
از گیت می‌توان به صورت یک سرور استفاده کرد. از جمله قابلیت‌های سرور گیت می‌توان به نمایش تاریخچه گیت در بستر وب و مدیریت تاریخچه‌های مختلف اشاره کرد.

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

## توسعه
Eclipse Foundation در گزارشی در ماه مه سال ۲۰۱۴ گزارش کرد که امروزه گیت پراستفاده‌ترین ابزار مدیریت متن برنامه می‌باشد. در سال ۲۰۱۴، از بین متخصصان برنامه‌نویسی ۴۲٫۹٪ از گیت به عنوان ابزار اصلی مدیریت متن برنامه خود استفاده می‌کنند. این عدد برای سال ۲۰۱۳ به میزان ۳۶٫۳٪ و در سال ۲۰۱۲، ۳۲٪ بوده است.

هم چنین طبق گزارشی از Stack Overflow در سال ۲۰۱۵، ۶۹٫۳٪ از برنامه نویسان از گیت و ۳۶٫۹٪ از ورژن‌های جانبی آن و ۱۲٫۲٪ از TFS و ۷٫۹٪ از Mercurial استفاده می‌کنند.

سایت کارهای فناوری اطلاعات کانادا گزارش کرده است که از اواخر سپتامبر ۲۰۱۶، در ۲۹٫۲۷٪ از پیشنهادهای شغلی توسعه نرم‌افزار به گیت اشاره شده است. در کنار ۱۲٫۱۷٪ برای ماکروسافت و ۱۰٫۶۰٪ برای Subversion و ۱٫۳۰٪ برای Mercurial و ۰٫۴۸٪ برای Visual SourceSafe.

## امنیت
گیت ابزارهای امنیت کنترل دسترسی ارائه نمی‌دهد؛ ولی بستر لازم برای استفاده از آن‌ها را تعبیه کرده است.

در ۱۷ دسامبر ۲۰۱۴ یک راه نفوذ به نسخه‌ها کاربر تحت ویندوز و مک پیدا شد. حمله‌کننده قادر بود تا یک کد مخرب را با استفاده از یک درخت دستکاری شده در کامپیوتر مقصد اجرا کند. برای این کار یک کد مخرب در پوشه‌ای قرار داده می‌شد و توسط درخت درستکاری شده، وقتی کاربر برای دریافت تغییرها پروژه درخواست می‌داد، در دستگاه کاربر ذخیره می‌شد. در همان روز گیت در نسخه ۲٫۲٫۱ خود این مشکل را حل کرده و آن را عرضه کرد و فردای آن روز این مشکل را گزارش کرد.

در نسخه ۲٫۶٫۱ عرضه شده در ۲۹ سپتامبر ۲۰۱۵ گیت یک افزونه برای یک آسیب‌پذیری امنیتی ارائه داد؛ که در آن مهاجم با متقاعد کردن کاربر به استفاده از یک لینک، که در آن دستوری برای انتقال به آدرسی دیگر وجود داشت می‌توانست حتی با وجود رمزنگاری شده بودن ارتباط، حمله مرد میانی را انجام دهد.

## دستورها
برای استفاده از گیت ابتدا باید آن را نصب کرد که طریقه نصب برای سیستم‌های مختلف متفاوت است.

در ادامه تعدادی از دستورها پرکاربرد گیت آمده است.

برای راهنمایی گرفتن دربارهٔ یک دستور:
```text
git help دستور
```
برای اجرای تنظیم‌ها از config استفاده می‌شود. جزئیات استفاده از این دستور را می‌توان با دستور زیر به‌دست آورد.
```bash
git help config
```
دستور ایجاد پوشه اصلی:
```bash
git init <آدرس پوشه اصلی>
```
دستور استفاده از یک گیت از قبل ساخته شده:
```bash
git clone ssh://<user> @ <host> /path/to/repo.git
```
استفاده می‌شود.

دستور اضافه کردن فایل جدید:
```bash
git add <نام فایل>
```
دستور حذف فایل
```bash
git rm --cached <نام فایل>
```
دستور مشاهده وضعیت:
```bash
git status
```
بررسی تفاوت‌ها در کد نوشته شده و اعمال نشده:
```bash
git diff
```
این دستور تغییرهای اعمال شده و ثبت نشده را نشان می‌دهد.

دستور اطلاع از تاریخچه
```bash
git log
```
دستور قراردادن تغییرها:
```bash
git push
```
دستور اعمال تغییرها:
```bash
git commit
```
دستور دریافت تغییرها از روی تاریخچه:
```bash
git pull
```
دستور الحاق برچسب:
```bash
git tag
```
دستور بازگرداندن یک فایل به آخرین وضعیت ذخیره شده:
```bash
git checkout HEAD <نام فایل>
```
برای برگرداندن تغییرهای یک اِعمال خاص:
```bash
git revert <commit-id>
```
اصلاح یک اِعمال:
```bash
git commit -amend
```


## جستارهای وابسته
* کنترل تغییرات
* آپاچی ساب‌ورژن
* گیت‌هاب
* گیت‌لب

## منابع

* 

## پیوند به بیرون
* وبگاه رسمی گیت
* راهنمای گیت


رده:سیستم نسخه‌های هم‌روند
رده:لینوس توروالدز
رده:نرم‌افزارهای آزاد برنامه‌نویسی‌شده با پرل
رده:نرم‌افزارهای آزاد مرتبط با کنترل نسخه
رده:نرم‌افزارهای آزاد نوشته‌شده با سی
رده:نرم‌افزارهای ۲۰۰۵ (میلادی)
رده:نرم‌افزارهایی که از پروانه جی‌پی‌ال استفاده می‌کنند