Úvod do Gitu

Tento článek obsahuje úplné základy Gitu pro začátečníky. Nejprve si Git krátce představíme, poté si ukážeme nějaké základní příkazy pro nastavení a také ovládání. Nakonec si ukážeme co jsou to větve a jak s nimi pracovat.

Git obecně

Git je systém správy verzí (anglicky Version Control System – „VCS“). Je tedy systémem, který zaznamenává změny sledovaných adresářů a souborů v průběhu času. Takže se může uživatel například kdykoliv vrátit k původní verzi souboru, kterou někdy v minulosti napsal. Je to také nepostradatelný nástroj pro vývoj většího projektu v týmu. Systémů pro správu verzí existuje velká řada a dělíme je podle způsobu ukládání dat. Máme VCS lokální, centralizované a distribuované. Nejznámějšími představiteli centralizovaných systémů správy verzí jsou CVS a Subversion. Jak centralizovaný, tak i lokální systém správy verzí, uchovávají verzované soubory na jednom místě (buď u sebe v databázi na lokále, nebo na serveru) a my pracujeme s aktuální verzí, kterou jsme si stáhli. To má značné nevýhody: např. riziko výpadku disku (a možnou ztrátu dat) nebo to, že většina operací je značně zpomalena z důvodu častého dotazování serveru (např. prohlížení obsahu nějaké starší revize). Naopak u distribuovaných VCS má každý uživatel u sebe kompletní kopii repozitáře. Z toho plyne mnoho výhod, mezi kterými je například to, že při kolapsu serveru existují zálohy u všech nedávno aktivních uživatelů. Git se od ostatních známých systémů také liší možností práce offline. Programátor tak může např. pracovat v dopravním prostředku a poté, co přijede na místo s připojením k internetu, jen synchronizovat svojí práci. Z přítomnosti celého repozitáře také plyne to, že se některé operace staly lokálními – např. se urychlí procházení historie, protože už k tomu není potřeba žádná komunikace se serverem.

Princip Gitu

Na rozdíl od jiných VCS Git uchovává snímky, nikoliv rozdíly. To v praxi znamená, že Git každou revizi vlastně „vyfotí“ přesně ve stavu, v jakém zrovna je. Revizí rozumíme stav, ve kterém uložíme náš systém souborů (do kterého se můžeme později vrátit). Na soubory, které se od poslední revize nezměnily, uložíme v naší nové revizi pouze ukazatel. Pokud bychom přeci jen měli zájem o rozdíly mezi soubory jednotlivých revizí, Git je schopný je dopočítat.

Struktura Gitu

V jeho struktuře rozlišujeme tyto části:

Každá tato část obsahuje jiný druh souborů, které si dále popíšeme:

Základní příkazy Gitu

Nyní si ukážeme několik základních příkazů, které umožní s Gitem pracovat.

Ignorované soubory:

Soubory, které nechceme sledovat a nechceme, aby nás na to Git upozorňoval ve statusu. Seznam takových souborů a adresářů zapíšeme do souboru .gitignore.

Nastavení Gitu:

Vyvolání nápovědy:

Následující příkazy jsou ekvivalentní a slouží k vyvolání nápovědy z manuálové stránky pro příkaz z Gitu.

Odstraňování souborů:

Přesouvání souborů:

Commit revize:

Historie revizí:

Přepsání revize:

Přepsání poslední revize se může hodit, když např. zapomeneme tzv. “addnout” soubor:

Větvení

Větvení je důležitá část Gitu, která nám umožňuje pracovat ve více lidech na jednom projektu. Nová větev projektu se také může hodit, když potřebujeme otestovat nějaký fix. Při vývoji tohoto fixu může být náš projekt nestabilní a proto ho vytváříme v jiné větvi a poté pouze namergujeme do naší staré větve. Níže si ve zkratce vysvětlíme co větve jsou, jak se vytvářejí, slučují a další důležité operace. Všechny uvedené obrázky byly převzaty z českého překladu knihy Pro Git, jejíž autorem je Scott Chacon (r. 2009, v češtině vydal CZ.NIC, z. s. p. o.).

Větev

Větev je ukazatel na nějakou revizi. Může to být např. ukazatel na naší aktuální revizi, na které pracujeme. Ty “zvláštní” kombinace čísel a písmen na obrázku (98ca9, 34ac2, f30ab) jsou tzv. hashe revize. Jsou to jednoznačné identifikátory jednotlivých revizí. Pokud známe hash revize, můžeme se na ní zpátky přesunout a pracovat na ní.

Vytvoření nové větve

Vytvoření nové větve provedeme příkazem $ git branch <nazevVetve>. Na obrázku vidíme výsledek tohoto příkazu: $ git branch testing – Právě pracujeme na větvi s názvem “hlavní větev” a vytvořili jsme novou větev s názvem “testing” (jelikož větev je vlastně ukazatel na revizi, tak “hlavní větev” a “testing” ukazují v tuto chvíli na stejné místo). V této části je důležité zmínit ukazatel HEAD. Ten určuje na které větvi se zrovna nacházíme. Vlastní ukazatel HEAD můžeme mít tedy v dané chvíli pouze jeden. Na následujícím obrázku ukazatel HEAD specifikuje, že jsme na “hlavní větvi” i když větev “testing” zrovna ukazuje na tutéž revizi.

Přepnutí na jinou větev

Přepnutí na jinou větev provedeme pomocí $git checkout <nazevVetve>. Vezmněme si náš předchozí příklad a z “hlavní větve” se přepneme příkazem $git checkout testing na “testing” větev. Tím jsme vlastně přenastavili ukazatel HEAD tak, aby ukazoval na novou větev a pokud se teď rozhodneme commitnout, bude změna provedena na té druhé větvi. Nyní se v našem příkladě přepneme zpět na “hlavní větev” ($git checkout hlavni) a provedeme commit i tam. Výsledek si zobrazíme na následujícím obrázku:

Slučování větví

Vývoj tedy může pokračovat na 2 různých větvích, ale časem dojdeme do situace, kdybychom je zase rádi sloučili. To uděláme tzv. mergem větví. Na obrázku vidíme příklad merge “hlavní větve” a větve “iss53”. Na “hlavní větvi” jsme provedli jeden commit a na “iss53” dva. V době kdy jsme Git o merge požádali jsme zrovna pracovali na “hlavní větvi” a proto se bude “iss53” větev “přilévat” do naší aktuální “hlavní větve”. Výsledek si můžeme prohlédnout na obrázku: Důležitá poznámkou k mergování je to, že Git merguje nejen na základě toho, jak vypadají oba slévané snímky revizí, ale také vezme do úvahy posledního společného předka těchto revizí. Na našem obrázku výše tedy merguje s ohledem na snímky C6,C5 a společného předka C2. Merge, který jsme si předvedli výše na obrázku, si nyní předvedeme pomocí příkazů řádky.

Konflikty vzniklé slučováním větví

Konflikt nám může nastat, např. pokud jsme s kolegou každý na jiné větvi modifikovali stejný soubor. Git při mergování těchto větví nebude vědět, jak s takovým souborem naložit. Řešení je v takovém případě ponecháno na uživateli, který merge pustil. Buď má možnost si soubor upravit sám (na základě toho, jak vypadaly slučované soubory) a změnu commitne, nebo vezme soubor z jedné či druhé slučované větve (v takovém případě se využijí příkazy s přepínači –theirs nebo –ours).

Vzdálené větve

Vzdálené větve jsou reference na stav větví ve vzdálených repozitářích, které nejde přesouvat. Název je ve formátu (vzdálený repozitář)/(větev). Odesílat vlastní větve na server můžeme pomocí jednoho z těchto příkazů:

Pokud chceme přijmout větev a začlenit ji k sobě na lokál, provedeme to pomocí $ git pullVytvoření sledovací větve na ukazateli vzdálené větve:

Reference na vzdálený server aktualizujeme příkazem $ git fetch a mazání vzdálené větve provedeme příkazem $ git push [vzdálený sever] :[větev]

Závěr

V článku jsme si ukázali všechno důležité pro začátek práce s Gitem. Pro další studium doporučuji nahlédnout do výše zmiňované knihy Pro Git od Scotta Chancona (dostupná i v českém vydání od CZ.NIC). Pokud byste měli k článku nějaký dotaz, napište mi na info@bcvsolutions.eu.

Like this:

Další témata