Git
Chapters ▾ 2nd Edition

1.3 Úvod - Základy systému Git

Základy systému Git

Co že to vlastně Git v jádru je? Pochopení této podkapitoly je důležité, protože pokud porozumíte, co Git je a na jakých základech pracuje, bude pro vás i jeho efektivní používání mnohem snadnější. Při seznamování s Gitem se pokuste vyčistit mysl od věcí, které možná znáte z jiných systémů pro správu verzí, jako jsou Subversion a Perforce. Při jeho používání se tím vyhnete určitým zmatkům. Ačkoli je uživatelské rozhraní velmi podobné jiným systémům, Git uvažuje o ukládaných informacích velmi odlišně. Pochopení těchto rozdílů vám pomůže předejít nejasnostem, které by mohly při používání Gitu vzniknout.

Snímky, nikoli rozdíly

Hlavním rozdílem mezi systémem Git a všemi ostatními systémy pro správu verzí (včetně Subversion a spol) je způsob, jakým Git o datech uvažuje. Většina ostatních systémů ukládá informace jako seznamy změn souborů. Tyto systémy (CVS, Subversion, Perforce, Bazaar atd.) chápou uložené informace jako sadu souborů a změn každého z těchto souborů v čase.

Ukládání dat jako změn vůči základní verzi každého souboru.
Figure 4. Ukládání dat jako změn vůči základní verzi každého souboru.

Git o ukládání dat tímto způsobem neuvažuje. Místo toho Git o datech uvažuje jako o sadě snímků miniaturního systému souborů. Pokaždé, když v systému Git zapíšete (commit[1]) stav projektu, v podstatě „vyfotí“, jak vypadají všechny vaše soubory v daném okamžiku, a uloží odkaz na tento snímek. Pokud se soubor nezměnil, pak ho Git v zájmu efektivnosti znovu neukládá, ale jen se odkáže na předchozí identický soubor, který už byl uložen. Git o svých datech uvažuje spíše jako o sérii snímků.

Git ukládá data jako snímky projektu v daném čase.
Figure 5. Ukládání dat v podobě snímků projektu v daném čase.

Jde o důležitý rozdíl mezi systémem Git a téměř všemi ostatními systémy pro správu verzí. Git díky tomu znovu zkoumá skoro každý aspekt správy verzí, který většina ostatních systémů okopírovala z předchozí generace. Díky tomu Git vypadá (spíše než jiné systémy pro správu verzí) jako malý souborový systém, nad kterým pracuje sada neuvěřitelně výkonných nástrojů. Některými výhodami, které získáme při tomto uvažování o datech, se budeme zabývat při výkladu větvení v kapitole Větve v systému Git.

Téměř každá operace je lokální

Většina operací v systému Git vyžaduje ke své činnosti pouze lokální soubory a zdroje. Obecně platí, že informace z jiných počítačů v síti nejsou potřebné. Pokud jste zvyklí pracovat s centralizovanými systémy správy verzí, kde je většina operací poznamenána latencí sítě, patrně vás při práci s Git napadne, že mu bohové rychlosti dali do vínku nadpřirozené schopnosti. Protože máte celou historii projektu uloženou přímo na svém lokálním disku, probíhá většina operací takřka okamžitě.

Pokud například chcete procházet historii projektu, Git kvůli tomu nemusí vyhledávat informace na serveru — načte je jednoduše přímo z vaší lokální databáze. Znamená to, že se historie projektu zobrazí téměř hned. Pokud si chcete prohlédnout změny provedené mezi aktuální verzí souboru a týmž souborem před měsícem, Git vyhledá měsíc starý soubor a provede lokální výpočet rozdílů, aniž by o to musel žádat vzdálený server nebo stahovat starší verzi souboru ze vzdáleného serveru a poté provádět lokální výpočet.

To také znamená, že je jen velmi málo operací, které nemůžete provádět offline nebo bez připojení k VPN. Jste-li v letadle nebo ve vlaku a chcete pokračovat v práci, můžete beze všeho zapisovat nové revize. Ty odešlete až po opětovném připojení k síti. Jestliže přijedete domů a zjistíte, že VPN klient nefunguje, stále můžete pracovat. V mnoha jiných systémech je takový postup nemožný nebo přinejmenším obtížný. Například v systému Perforce toho lze bez připojení k serveru dělat jen velmi málo. V systémech Subversion a CVS můžete sice upravovat soubory, ale nemůžete zapisovat změny do databáze (neboť ta je offline). Možná to vypadá jako maličkost, ale divili byste se, jak velký je v tom rozdíl.

Git udržuje integritu

Než se v Gitu cokoli uloží, nejdříve se z toho vypočítá kontrolní součet, který se pak používá k odkazu na uložená data. To znamená, že není možné změnit obsah jakéhokoli souboru nebo adresáře, aniž by o tom Git nevěděl. Tato funkčnost je do Gitu zabudována na nejnižších úrovních a je nedílnou součástí jeho filosofie. Nemůže tak dojít ke ztrátě informací při přenosu dat nebo k poškození souboru, aniž by to Git byl schopen zjistit.

Pro vytváření kontrolních součtů používá Git mechanismus zvaný SHA-1. Jde se o řetězec o 40 hexadecimálních znacích (0–9, a–f) vypočítaný na základě obsahu souboru nebo adresářové struktury systému Git. Otisk SHA-1 může vypadat například takto:

24b9da6552252987aa493b52f8696cd6d3b00373

S těmito otisky se budete setkávat v Gitu všude, protože je používá opravdu často. Git vlastně ve své databázi nic neukládá podle názvu souboru, ale podle otisku jeho obsahu.

Git obvykle jen přidává data

Pokud v Gitu provádíte nějaké akce, pak téměř všechny z nich data do databáze pouze přidávají. Přimět systém, aby udělal něco, co nelze vzít zpět, nebo aby smazal jakákoli data, je velice obtížné. Stejně jako v jiných systémech pro správu verzí můžete ztratit nebo poničit úpravy, které ještě nebyly zapsány. Jakmile však snímek zapíšete do Gitu, je téměř nemožné ho ztratit, zvlášť pokud databázi pravidelně odesíláte (push) do jiného repozitáře.

Díky tomu je práce s Gitem radostí, protože víme, že můžeme experimentovat bez nebezpečí závažného poškození hotových věcí. Podrobnější informace o tom, jak Git ukládá data a jak lze obnovit zdánlivě ztracenou práci, najdete v podkapitole Návrat do předchozího stavu.

Tři stavy

A nyní pozor. Pokud chcete dále hladce pokračovat ve studiu Gitu, budou pro vás následující informace stěžejní. Git používá pro spravované soubory tři základní stavy: zapsáno (committed), změněno (modified) a připraveno k zapsání (staged). Zapsáno znamená, že jsou data bezpečně uložena ve vaší lokální databázi. Změněno znamená, že v souboru byly provedeny změny, avšak soubor ještě nebyl zapsán do databáze. Připraveno k zapsání znamená, že jste změněný soubor v jeho aktuální verzi určili k tomu, aby byl zapsán do dalšího snímku (commit snapshot).

Z toho vyplývá, že projekt je v systému Git rozdělen do tří hlavních částí: adresář systému Git (Git directory), pracovní adresář (working directory) a oblast připravených změn (staging area).

Pracovní adresář, oblast připravených změn a adresář Git.
Figure 6. Pracovní adresář, oblast připravených změn a adresář Git.

Adresář Git je místo, kde Git uchovává metadata a databázi objektů vašeho projektu. Je to nejdůležitější část systému Git a zároveň je to adresář, který se zkopíruje, když klonujete repozitář z jiného počítače.

Pracovní adresář obsahuje lokální kopii jedné verze projektu. Tyto soubory jsou vytaženy ze zkomprimované databáze v adresáři Git a umístěny na disk, kde je můžete používat nebo upravovat.

Oblast připravených změn je soubor, většinou uložený v adresáři Git, který obsahuje informace o tom, co bude obsahovat příští objekt revize (commit[2]). Někdy se setkáme s označením „index“, ale běžně se používá i pojem oblast připravených změn (staging area).

Základní pracovní postup vypadá v Gitu následovně:

  1. Změníte soubory ve svém pracovním adresáři.

  2. Soubory připravíte k zapsání tak, že vložíte jejich snímky do oblasti připravených změn.

  3. Provedete zápis (commit), který vezme soubory nacházející se v oblasti připravených změn, a tento snímek trvale uloží do adresáře Gitu.

Nachází-li se konkrétní verze souboru v adresáři Gitu, je soubor ve stavu „zapsaný“. Pokud byl soubor upraven a přidán do oblasti připravených změn, je ve stavu „připraven k zapsání“. A pokud byl vůči stavu v databázi upraven, ale nebyl připraven k zapsání, je ve stavu „změněný“. V kapitole Základy práce se systémem Git se o stavech souborů dozvíte více. Naučíte se, jak jich můžete využívat, nebo jak můžete stav „připraven k zapsání“ úplně přeskočit.