Git

**Git** — бесплатен, отворен и распределен систем за контрола на ревизии кој е мошне брз, ефикасно може да се употребува во големи проекти и содржи иновативен систем на гранење кој поддржува нелинеарен развој . Една од главните карактерситики на Git е распределениот пристап кон контролата на преработки (верзии), при што клиентите не ги преземаат само најновите промени од централен опслужувач, туку тие месно прават целосен резервен примерок на скалдиштето (анг. *repository*). Тоа значи дека, доколку некој од опслужувачите е недостапен поради пад, било кој од клиентските складишта кои соработуваат на дадениот проект може да се искористи за опоравување на опслужувачот. Всушност, секое преземање (анг. *checkout*) на клиентот е целосен резервен прмерок на сите податоци од складиштето во месниот систем. За разлика од распределениот пристап, во централизираните системи за контрола на преработки како што се CVS и Subversion, постои централен опслужувач кој ги содржи сите преработки на податотеките, а клиентите прават преземање од тоа централно место. Главен недостаток на овие системи е тоа што опслужувачот претставува критична точка и во случај на пад корисниците не можат да соработуваат или да зачувуваат промени на податотеките со кои работат. Од таа гледна точка *Git*, преку распределениот пристап, едноставно ги надминува сите проблеми кои се јавуваат во централизираните системи, што го прави робустен систем за соработка.

### Особености
Значајна карактерситика на *Git*, како систем за контрола на преработки, претставува начинот на кој се претставуваат податоците. Концептуално, останатите системи, информациите за преработките ги чуваат како список на промени кои се направени врз секоја податотека во текот на времето. Односно, податоците престауваат множество на податотеки и промени врз тие податотеки. Во *Git* податоците се чуваат како множество од целосни слики (анг. *snapshots*) од сите податотеки (*Git* ја следи целосната содржина, наместо поединечи промени на податотеки). Секогаш кога се прави потврда (анг. *commit*) или се зачувува состојбата на проектот во *Git*, системот на некој начин прави слика од тоа како изгледаат сите податотекти во моментот и зачувува референца кон таа слика. Притоа, за поголема ефикасност, доколку одредени податотеки не се променети, *Git* не ги зачувува повторно, туку само зачувува врска кон претходната идентична податотека која претставува дел од претходната преработка.

Бидјеќи *Git* прави меснен примерок на целото складиште, при работа на развивачите не е потребна врска кон некој друг компјутер или мрежа. Поради тоа, при работењето на заеднички проект голем дел од стандардните операции се извршуваат неверојатно брзо бидејќи целосната историја на складиштето се чува месно. Притоа, може едноставно да се прегледуваат разликите помеѓу одредени преработки на проектот, или пак да се работи на нови функионалности кои месно се додаваат. Всушност, ова својство е уникатно за *Git* бидејќи им овозможува на корисниците да работат и во случај на недостапност на мрежната врска, а сите промени да бидат прикачени подоцна кога истата ќе стане достапна.

Гранењето и спојувањето претставуваат особено важна одлика што значајно го издвојува *Git* од останатите системи за управување со изворен код. *Git* ја овозможува и охрабрува употребата на повеќе месни гранки до кои се пристапува целосно независно. Притоа, создавањето, спојувањето и бришењето во *Git* е доста брзо и трае само неколку секунди. Тоа овозможува создавање на гранки за испробување на одредена идеја, тестирање и додадавње на нови функционалности, без да постои какво било влијание врз главната линија на развој во проектот. Исто така, создавање на гранки кои содржат продукциски код и едноставно менување на контекстот на работа помеѓу подобрување, тестирање, или експериментирање. При спојување, можат експлицитно да се изберат гранките кои ќе се споделат, што им овозможува на членовите од тимот месно да испробуваат идеи без да се грижат како и кога ќе можат тие новини да се спојат со главната линија на развој.

Главните предности на *Git* претставуват распределениот пристап кон контролата на ревизии (што го прави доверлив во случај на падови на делови од системот), малите памтилни побарувања и брзината на извршување, иновативниот пристап на гранење и соединување (кој обезбедува ефикасно работење на поединечно и групно ниво), сцената (анг. *staging area*) која нуди дополнително ниво на флексибилност и безбедност пред потврдување на одредени промени, како и фактот што Git е целосно бесплатен со отворен код и може да се употребува во отворени и во комерцијални проекти. Особено позитивна претставува резенц однос *[[peer-to-peer]]*  меѓу развивачите што ја поедноставува соработката бидејќи не наметнува хиерархиска структура, и во процесот на развој  воведува поголема координација и соработка на учесниците.

## Начин на работа
Податотеките кои се дел од даден проект можат да бидат во три главни состојби во *Git*, и тоа: потврдени (анг. *committed*), изменети (анг. *modified*) и подготвени (анг. *staged*) . Потврдени значи дека податоците се безбедно зачувани во месна база на податоци. Изменети значи дека одредена податотека е изменета, но тие измени не се запишани во месната база на податоци. Подготвени, значи дека изменетата податотека во тековната преработка од проектот е означена да биде запишана при следната потврда (анг. *commit*). Овие состојби всушност ги дефнираат трите главни делови во еден *Git* проект: *Git* именик, работен именик (анг. *working directory*) и сцена (анг. *staging area*).

*Git* именикот е местот каде што *Git* ги зачувува мета-податоците и објектната база на податоци од дадениот развоен проект. Овој именик претставува најважниот дел од *Git*, и е именкиот кој се копира при преземање на одредено складиште од еден во друг компјутер.
Работниот именик претставува единствено преземање (анг. *checkout*) на една преработка на проектот. Овие податотеки се повлекуваат од компресираната база на податои од *Git* именикот и се зачувуваат на месниот диск за употреба или изменување.
Сцената (анг. *staging area*) не е ништо повеќе од обична податотека, која најчесто е дел од *Git* именикот, и која содржи информации за тоа што влегува во следното потврдување (анг. *commit*).

Основниот тек на работа наједноставно може да се опише преку следните чекори:
#Корисникот изменува податотеки од работниот именик
#Податотеките се означуваат како подготвени, и се додава запис за нив во сцената
#Се врши потврда (анг. *commit*), која ги превезема сите податотеки од сцената и перманентно ја зачувува сликата (анг. *snapshot*) во *Git* именикот.

Сите податотеки од работниот именик дополнително можат да бидат во една од две состојби: следени (анг. *tracked*) и не-следени (анг. *untracked*). Следените податотеки се оние кои биле дел од претходната слика (анг. *snapshot*), и тие можат да бидат: не-изменети, изменети и потдогвени (анг. *staged*). Не-следените податотеки означуваат податотеки од работниот именик кои не биле дел од претходната слика и не се дел од сцената. При првото преземање на одредено складиште, сите податотеки се означуваат како следени и не-изменети. Како што се работи со податотеките, *Git* започнува да ги разграничува како изменти, оние кои се различни во однос на претходната потврда. Откатко ќе бидат означени како подготвени и ќе се изврши потврда (што ги запишува сите промени), циклусот се повторува.

## Поврзано
* Контрола на преработки

## Наводи

Категорија:Системи за контрола на преработки