برنامه های کنترل نسخه (VCS)
کنترل نسخه چیست و چرا باید به اون اهمیت داد؟
کنترل نسخه به معنای دنبال نمودن تغییرات اعمال شده در فایل های پروژه است. وظیفه یک برنامه کنترل نسخه ثبت تغییرات صورت گرفته بر روی فایل های پروژه مثل ویرایش کردن، افزودن و یا پاک نمودن آن هاست؛ به گونه ای که هرگاه بخواهیم بتوانیم به نسخه های مختلف پروژه دسترسی پیدا کنیم.
برای مثال، تصور کنید که یک گرافیست یا طراح وب هستید و می خواهید همانطور که به مرور زمان روی پروژه خود کار می کنید، در هر مرحله از پیشرفت پروژه یک نسخه از آن را تهیه و در جایی نگهداری کنید تا بعدا در صورت نیاز به آنها دسترسی داشته باشید. برنامه های کنترل نسخه دقیقا آن چیزی هستند که شما به آن نیاز دارید!
یک برنامه کنترل نسخه یا VCS (مخفف شدهی: Version Control System) به شما این امکان را می دهد که فایل های پروژه را به ویرایش های قبلی آن ها بازگردانید، تغییرات اعمال شده هر فایل را بعد از پیشرفت پروژه مشاهده کرده و آن را با وضعیت قبلی اش مقایسه کنید، در صورتی که گروهی روی یک پروژه کار می کنید، ببینید چه کسی در هر مرحله پروژه را ویرایش کرده و اگر در جایی اشتباهی صورت گرفته، پروژه را به حالت قبل از ویرایش بازگردانده و آن را بازیابی کنید، و…
سیستم های کنترل نسخه محلی
یکی از راهکارهای رایجی که عمده مردم برای کنترل پروژه خود از آن استفاده می کنند، کپی گرفتن از فایل های پروژه و نگهداری آن ها با نام متفاوت یا در پوشه های متفاوت است. این راه همان مقدار که ساده است، امکان خطا نیز در آن وجود دارد. ممکن است به سادگی فراموش کنید که چه فایلی در چه پوشه ای را دارید ویرایش می کنید، یا فایلی را به اشتباه تغییر داده و نسخه پشتیبان خود را از بین ببرید.

برای رهایی از این قبیل مشکلات، سال ها پیش برنامه نویسان سیستم های کنترل نسخه ای را ساختند که بر روی یک کامپیوتر نصب می شد و تغییرات همه فایل ها در نسخه های مختلف را در پایگاه داده ساده اش ذخیره می کرد. این مدل برنامه ها، که سیستم های کنترل نسخه محلی یا Local Version Control Systems نامیده می شوند تنها قابل استفاده بر روی یک کامپیوتر مشخص می باشند.
سیستم های کنترل نسخه متمرکز
مشکل هنوز برطرف نشده بود! اگر پروژه ای قرار بود به صورت گروهی انجام شود، سیستمی نیاز بود تا همه ی اعضای گروه بتوانند به صورت مشترک به آن دسترسی داشته باشند و در توسعه و پیشرفت پروژه مشارکت کنند.
برای حل این مشکل سیستم های کنترل نسخه متمرکز یا Centralized Version Control Systems ایجاد شدند. این سیستم ها که Subversion (همان SVN) و Perforce از جمله نمونه های آن هستند، دارای یک سرور هستند که تمام نسخه های پروژه (فایل ها)، و تعداد کامپیوتر هایی که به نسخه های پروژه بر روی سرور دسترسی دارند را شامل می شود. یعنی همه کارهایی که اعضای پروژه انجام می دادند و تغییراتی که ایجاد می کردند بر روی یک سرور مشخص که همه به آن دسترسی داشتند ذخیره می شد و مشخص بود که چه کسی در چه زمانی چه بخشی از پروژه را تغییر داده است.

با همه ی مزایا و امتیازاتی که این سیستم داشت، هنوز یک مشکل بزرگ روند انجام پروژه را تهدید می کرد.
اگر کامپیوتر سرور برای مدتی از دسترس خارج می شد، در طی آن مدت هیچ کدام از اعضا قادر نبودند که در پروژه مشارکت کنند و تغییرات انجام شده بر روی پروژه را روی سرور ذخیره کنند.
بدتر از این! اگر هارد دیسک سرور که پایگاه داده مرکزی بر روی آن قرار گرفته، دچار آسیب می شد و نسخه ی پشتیبان از اطلاعات سرور تهیه نشده بود، تمام پروژه از ابتدا تا انتهای کار، کاملا از دست می رفت.
این مدل برای سال ها به عنوان یک استاندارد کنترل نسخه شناخته می شد. (و البته هنوز مورد استفاده قرار می گیرد.)
سیستم های کنترل نسخه توزیع شده
خب، اینجا همان جایی بود که سیستم های کنترل نسخه توزیع شده یا Distributed Version Control Systems وارد ماجرا شدند
Git، Mercurial، Bazaar و Darcs از جمله این سیستم ها به شمار می روند.
در سیستم های کنترل نسخه توزیع شده که به صورت مخفف DVCS نامیده می شوند، کاربر ها و اعضای یک پروژه، یک نسخه کامل از پروژه را از کامپیوتر سرور، بر روی کامپیوتر خود ایجاد می کنند و اگر حتی کامپیوتر سرور از دسترس خارج شده یا کلا از بین برود
هر یک از اعضای مشترک در پروژه می تواند فایل های پروژه را دوباره بر روی سرور قرار داده و پروژه را بازیابی کند.

روند کنترل نسخه در این مدل به این صورت است که اعضا با ایجاد یک نسخه از پروژه بر روی کامپیوتر خود، به توسعه ی آن می پردازند و نسخه های جدید را به صورت محلی در کامپیوتر خود ذخیره می کنند، و همینطور میتوانند تغییرات انجام شده بر روی کامپیوتر محلی خود را روی سرور قرار دهند تا اعضای دیگر نیز به نسخه های جدید دسترسی پیدا کنند.
تاریخچه git
در حقیقت git بر اثر یک جنجال آتشین به دنیا آمد 
هسته لینوکس که یک برنامه متنباز هست توسط لینوس توروالدز در سال ۱۹۹۱ نوشته شد [برای اطلاع بیشتر به نوشتهی مبانی و مقدمات لینوکس مراجعه کنید]. برای بیشتر عمر این پروژه یعنی از سال ۱۹۹۱ تا ۲۰۰۲، توسعهی هسته لینوکس توسط افراد حاضر در پروژه به صورت شخصی صورت می گرفت؛ یعنی برای توسعه، هرکس بهطور جداگانه از روشی برای کنترل نسخه استفاده می کرد.
در سال ۲۰۰۲، لینوس، برای توسعه هسته لینوکس، از سیستم کنترل نسخهی BitKeeper (مدل DVCS) استفاده کرد که به تمام اعضای حاضر در توسعه پروژه، اجازه می داد به صورت رایگان از سرویس BitKeeper استفاده کنند.
اما در سال ۲۰۰۵، ارتباط تیم توسعه هسته لینوکس با شرکت تجاریای که سرویس BitKeeper را پشتیبانی میکرد از بین رفت و امکان استفاده رایگان از سرویس BitKeeper برداشته شد.
این باعث شد تیم توسعه لینوکس و مشخصا خود لینوس توروالدز که خالق لینوکس بود، ابزار مورد نیاز ویژه خودشان برای کنترل نسخه ها را تولید کنند.
از سایر اهدافی که در این سیستم جدید مدنظر بود، می توان به موارد زیر اشاره کرد:
- سرعت
- طرح ساده
- پشتیبانی قوی برای توسعه غیرخطی (هزاران تغییر همزمان توسط افراد حاضر در توسعه پروژه)
- کاملا توزیع شده (بر اساس مدل DVCS)
- و اینکه برای پروژه هایی به بزرگی لینوکس پاسخگو باشد.
این سیستم که git نامگذاری شد در همان سال (۲۰۰۵)، تنها ۲ ماه پس از شروع توسعهی آن، به عنوان نرم افزار رسمی کنترل نسخه برای توسعه هسته لینوکس مورد استفاده قرار گرفت.