Stlačte "Enter" na preskočenie k obsahu

GitHub: Miesto, kde sa nič nestratí

Séria článkov o open-source by v žiadnom prípade nemohla byť kompletná bez zmienky o najväčšej platforme pre spoluprácu a kolaboráciu, platforme GitHub. GitHub je miestom, kde sa stretávajú desiatky miliónov ľudí a firiem, aby spoločne pracovali na projektoch všetkého možného aj nemožného druhu. Tu sa vyvíjajú operačné systémy, webové prehliadače, píšu sa knihy, dizajnujú hudobné nástroje, stavajú sa roboty, skladá hudba, vytvárajú jedlá. Slovom, ak tvoríte a pracujete na čomkoľvek, čoho životnosť je dlhšia než pár dní, GitHub je miestom aj pre Vás.

Napriek tomu často medzi zrakovo postihnutými neprogramátormi hrá skôr rolu strašiaka, okolo ktorého sa treba „nenápadne preplaziť“ aby si človek uchmatol vytúžený softvér. To je veľká škoda, pretože GitHub je miestom veľkého potenciálu a sústredenia obrovského množstva talentov, medzi ktoré môžete patriť aj vy a benefitovať ako z príležitostí, ktoré to prináša, tak aj možností, ktoré vám ponúka samotná platforma.

V tomto článku sa pozrieme na to, ako GitHub funguje. Pokúsime sa vytvoriť si mentálnu predstavu o tom, aké problémy sa snaží riešiť, s akými nástrojmi na tento účel prišiel, a čo znamenajú záhadné pojmy, s ktorými sa môžete na jeho stránkach stretnúť. A aby to bolo čo najuchopiteľnejšie, úplne zabudneme na to, že na GitHube sú nejakí programátori so svojimi kódmi. Vžijeme sa do role spisovateľa píšuceho svoj najnovší vedecko-popularizačno-fantastický bestseller, kombinujúci skutočné vedecké poznatky a výskum, historické udalosti a napínavý trilerový príbeh.

GitHub vs. Git. Aký je medzi nimi rozdiel?

Než sa pustíme na vec, musíme aspoň čiastočne spomenúť túto dilemu, s ktorou sa mnohí potýkajú s rôznou mierou úspešnosti. V skutočnosti to ale nie je až tak zložité. GitHub je akýmsi obalom a distribútorom pre produkty nástroja zvaného Git.

To nemusí znieť oveľa zrozumiteľnejšie, ale s niečím veľmi podobným sa stretávate bežne. Zoberte si, aký je vzťah medzi aplikáciou Kamera na vašom smartfóne a službou YouTube. Pomocou kamery vytvárate videá, ktoré môžete mať uložené na disku, posielať známym, ale ich aj zavesiť na YouTube, kde k nim viete priradiť popis, zaradiť ich do kanála a podobne. Tam ich môžu pozerať iní používatelia, a robiť iné super veci, ako dávať k nim komentáre, lajky, stiahnuť si ich k sebe na disk či sledovať Vašu tvorbu.

Git a GitHub je presne o tom istom. Git vytvára repozitáre, špeciálne priečinky, o ktorých si ešte budeme hovoriť. Vy tieto repozitáre máte uložené na svojom disku, môžete ich poslať známym, ale ich aj zavesiť na GitHub, kde im viete dať popis, licenciu, pripojiť k nim zostavené verzie projektu (napr. hotové PDF ak píšete knihu), viete im tam zapnúť fórum či vlastnú wiki. Ostatní používatelia, pokiaľ ho nastavíte ako verejný, môžu vidieť repozitár a jeho súbory, môžu si ho stiahnuť do počítača (používa sa výraz klonovať – clone), dať mu hviezdičku (ekvivalent lajku), otvárať issues (pripomienky), participovať v diskusii alebo repozitár skopírovať do vlastného účtu aby v ňom mohli vykonať zmeny (fork).

Vývoj nie je priamočiary

Vráťme sa teda k našej roli. Ste spisovateľ, a chystáte sa napísať knihu. Pustíte sa s vervou do toho, píšete stranu za stranou. Vaša práca začne naberať isté kontúry. Zrazu si ale uvedomíte, že si nie ste celkom istý svojim štýlom. Niektoré časti zodpovedajú vašim predstavám, iné zase nie dokonale. Aby ste dosiahli konzistentný zážitok, prepíšete niektoré úseky nanovo. Ibaže, čo v prípade, že sa vám nová verzia nebude až tak pozdávať, a radšej sa rozhodnete predsa len pre tú starú?

Najrozumnejšie čo môžete urobiť je skopírovať si starú verziu do priečinka so zálohou, a ak to urobíte prezieravo, dáte jej aj dátum vytvorenia a nejaký názov, nech ju neskôr viete identifikovať.

Pokračujete v písaní ďalej, pridávate kapitolu za kapitolou. V zálohovom priečinku sa vám kopia kópie vašej práce s alternatívnymi históriami. Zrazu ale zistíte, že vaša práca potrebuje viac než len kozmetickú úpravu. Niektorá dejová línia vám skrátka už nepríde viac dôveryhodná, potrebujete ju posilniť nejakou udalosťou z minulosti, ktorá jej dodá na vierohodnosti. Tak sa opäť vrátite do skorších kapitol a zmeníte chod udalostí. Následne pokračujete v písaní.

Podobných udalostí sa môže stať viac, a začína sa to prejavovať na priečinku so zálohami. Už to nie sú len alternatívne popisy udalostí, no v niektorých súboroch sa dej odohráva tak, v iných odlišne, jedny ho rozprávajú spôsobom A, iné spôsobom B.

No a do toho celého príde nakoniec gramatická úprava a štylistická korektúra. Tá mimo udalostí a dynamiky začne riešiť aj preklepy a vizáž, produkujúc nové a nové kópie s rôznymi druhmi zmien. Orientácia v niečom podobnom už môže byť veľmi zložitá a krkolomná aj pre vás, o iných ľuďoch, ktorým by ste túto históriu poslali už ani nehovoriac.

Ide pritom v princípe o veľmi dobrý nápad. Existencia všetkých tých súborov totiž dokazuje jednu vec, že vývoj nie je priamočiara záležitosť, linka od prázdneho stola k hotovej knihe. Je to neustále hľadanie správnej formy a výsledku všetkými smermi. A to si vyžaduje nejaký systém, ako prácu verziovať a sledovať zmeny v čase.

A takýmto systémom je GitHub. Poďme si prejsť rovnaký proces, no s možnosťami, ktoré táto platforma prináša.

Základom všetkého je repozitár

Ste spisovateľ, a chystáte sa napísať knihu. Úplne prvá vec, ktorú potrebujete, je pracovný priečinok pre Váš projekt. Do tohto priečinka budete dávať všetko, čo súvisí s prácou na danej knihe. Teda text samotný v jednom alebo viacerých súboroch, no taktiež materiály, ktoré chcete aby knihu sprevádzali.

Začnete písať, a po niekoľkých hodinách už máte prvé stránky textu. Ukončíte nejaký ucelený celok, napríklad úvodnú scénu. Cítite, že je čas prácu nejako archivovať. Pomocou nástroja Git vytvoríte svoj prvý commit, ktorý založí váš repozitár.

No pŕ, čo je to commit? Spomínate si na predchádzajúcu sekciu, kde ste vždy po nejakej zmene, či išlo o pridanie alebo úpravu textu skopírovali knihu do priečinka so zálohami? Tak presne toto je commit (v preklade príspevok). Git vezme celý váš pracovný priečinok ako je, a uloží ho do špeciálneho priečinka ako zálohu. Vypýta si pritom od vás krátky popis daného príspevku, v ktorom jednou vetou určíte, čo váš commit robí, dlhý popis príspevku, kde môžete rozviesť podrobnosti napr. prečo hlavná postava urobila čo urobila, čo s daným zvratom zamýšľate do budúcna, a tak podobne, toto sú poznámky, ktoré budete čítať vy alebo vaši spoluautori, keď niekto urobí zmeny prípadne sa bude chcieť k danému miestu vrátiť, je to záznam toho, ako ste o danej veci v tej dobe uvažovali.

Git tieto údaje uloží spolu s dátumom vytvorenia, menom a kontaktom na autora príspevku, a samotným obsahom do priečinka zvaného repozitár.

Čo je to repozitár? Spomínate si na priečinok so zálohami, kam ste ukladali kópie vašej knihy? To je repozitár. Teda priečinok obsahujúci všetky commity, ktoré ste do projektu vykonali, predstavujúce vývoj vášho pracovného priečinka v čase. Commit sa označuje pomocou identifikačného ID, ktoré sa používa, keď naňho v diskusii odkazujete, napr. 2132781c41b3509c1808521ff7b32ee46bf5a08c. I keď ID sa zvyčajne v konverzácii z praktických dôvodov neuvádzajú celé, štandardom je uviesť len prvých 7 – 10 znakov, v tomto prípade 2132781.

Každý commit zároveň nesie informáciu o tom, na ktorý commit nadväzuje, takže zostáva zachovaná vývojová línia.

Výhoda uchovávania histórie

Píšete teda knihu, vytvárate commit za commitom, kedykoľvek pribudne nová scéna, alebo naopak, nejakú scénu upravíte. Akú to má ale výhodu? Git vám na základe toho vie poskytnúť niekoľko veľmi užitočných informácií:

  • Môžete si vybrať ľubovoľný riadok či úsek a nechať si Gitom zobraziť, kedy sa prvýkrát objavil a akým vývojom si prešiel. Ten sa pritom nenechá zmiasť zmenami v iných častiach súboru, vďaka čomu je vyhľadávanie zmien veľmi pohodlné a viete sa relatívne ľahko k čomukoľvek vrátiť.
  • Ak robil zmeny niektorí z vašich spoluautorov, viete si veľmi jednoducho pomocou diffovacích nástrojov Gitu nechať zobraziť, čo presne sa v danom príspevku zmenilo oproti inému príspevku, či už predchádzajúcemu alebo ľubovoľnému inému, od ktorého chcete vidieť zmeny.
  • Vďaka povinným commitovým správam vidíte nie len čo sa zmenilo, ale aj prečo sa to zmenilo. Hlavne pokiaľ commity obsahujú aj poznámky.
  • Ku každému commitu si viete zobraziť jeho rozsah v podobe počtu pridaných/zmenených/odstránených riadkov, čo je indikátorom vašej produktivity.

Vetvy

Dosiaľ ste všetky commity zaraďovali do jednej súvislej línie, vetvy nazývanej main (v starších repozitároch sa používal výraz master). Ibaže občas robíte zmeny, o ktorých viete, že ste si nimi nie istý, a bolo by super dať si ich niekam „bokom“, aby ste nimi nezapratávali hlavnú líniu ak sa rozhodnete nechať ich tak, alebo ste mohli na hlavnej vetve robiť niečo iné.

Našťastie, Git vám umožňuje vytvoriť si toľko vývojových línií, koľko len chcete. Vyberiete si commit, z ktorého chcete vybočiť, prehodíte výhybku a idete. Vetva sa v angličtine nazýva branch, a slúži presne na to, čo by ste čakali, vývoj alternatívnej podoby čohokoľvek.

V samostatnej vetve môžete vyvíjať zápletku, ktorá dramaticky zmení postavenie vašej hlavnej postavy, ale môže to kľudne byť vetva určená na menej vzrušujúcu úlohu, napríklad korektúru a stabilizáciu už existujúcich kapitol. V určitom bode písania sa dostanete do fázy, kedy ešte nemáte knihu dopísanú, možno ste dokonca len v polovici, ale chcete už postupne začiatok spevňovať a skonzistentňovať, aby v prípade, že sa s tým vyskytnú problémy, alebo dostanete v tomto procese nejaký geniálny nápad, ste ho mohli na čele zohľadniť. No a zrejme nechcete mať históriu v štýle:

  • Pridaná scéna súboja s hlavným záporákom
  • Opravená kapitola 1
  • Pridaná scéna zranenia Mikea
  • Oprava opravy kapitoly 1
  • Konsolidácia kapitoly 2

Lepší nápad je robiť opravy v samostatnom vlákne commitov. Tie môžete následne po väčších úsekoch vlievať do hlavnej vetvy (proces spájania vetiev v určitých bodoch sa nazýva merge), prípadne prilievať nové časti main do korekčnej vetvy, keď spracujete všetko, čo bolo k dispozícii v bode, kde ste vetvu vytvorili.

Git sa pri všetkých spájacích operáciách postará o to, aby čo ide spojiť automaticky sa spojilo automaticky, a aby sa nezabudlo na nič, čo automaticky spojiť nejde. A keby sa aj predsa len na niečo zabudlo a niekde ste spravili chybu, to predsa nevadí, všetko je uložené, nič sa nestráca a môžete sa k tomu kedykoľvek vrátiť, ak treba.

Tagy

V určitom bode dospejete do štádia, že máte podobu, ktorá je veľmi blízko tomu, čo by mohlo ísť do tlačiarne, virtuálnej alebo fyzickej. V tomto bode chcete už distribuovať vzorke čitateľov, aby ste si vypočuli ich názor, chcete zapojiť korektorov, grafikou. Keď vám ale začne chodiť spätná väzba zo všetkých strán a vy budete pridávať nové commity, aby ste ju vyriešili, môže sa čoskoro stratiť informácia, ktorú verziu knihy ste vlastne komu poslali. Preto je dobré si tento významný bod nejako označiť. Na to slúžia tagy, v preklade visačky. Ide o objekty, ktoré taktiež patria do repozitára, tag sa vždy viaže na konkrétny commit, má svoj vlastný názov napr. v1.0-alpha (verzia 1.0 alfa), dlhší popis, kde môžete popísať o aký bod ide, prečo je významný, čo sa zmenilo od posledného označeného bodu a tak podobne.

Značenie je v podstate na vás. Bežne sa používa písmeno „v“ s číslami oddelenými bodkami, ktoré môže nasledovať pomlčka a špecifikovanie druhu verzie – alpha, beta či rc (release candidate – kandidát na vydanie).

V každom prípade, výhodou tagov je, že si ich v ľubovoľnom repozitári môžete nechať všetky zobraziť, a prezrieť si tak významné momenty repozitára bez toho, aby ste sa museli prehŕňať siahodlhou históriou commitov.

GitHub, domov repozitárov

Mať u seba históriu vývoja vašej knihy je fajn. Jedna z najsilnejších stránok Gitu však je, že umožňuje kolaboráciu s inými ľuďmi. Preto najlepšie čo môžete urobiť je nahrať váš repozitár čím skôr na platformu GitHub. Vlastne býva proces neraz skôr opačný. Priamo GitHub vám umožňuje vytvoriť si na jeho serveroch nový repozitár, ktorý si následne k sebe naklonujete a začnete v ňom pracovať. Kým nemáte niečo aspoň trochu hmatateľné, môžete nastaviť viditeľnosť na súkromnú, kedy máte k nemu prístup iba vy, prípadne ľudia, ktorých pozvete na spoluprácu, to môžu byť napríklad vaši spoluautori. Commity, ktoré robíte v repozitári na svojom počítači sú lokálne a prebiehajú offline, takže je na konci dňa vždy dobré poslať nové commity na server (táto akcia sa nazýva push – v zmysle push changes (vtlačiť zmeny)). GitHub sa postará o to, aby ste nevymazali prácu vašich spoluautorov, ak medzi tým pridali niečo do rovnakej vetvy ako vy. Zároveň Vám GitHub v tejto fáze slúži ako záloha. Ak by sa čokoľvek stalo vášmu laptopu, repozitár je stále na GitHube. Keby sa niečo stalo GitHubu, repozitár je stále u vás. A keby sa niečo stalo aj GitHubu aj vášmu laptopu súčasne, repozitár je stále na zariadeniach vašich spoluautorov.

Pričom každá jedna kópia, klon repozitára, obsahuje celú históriu projektu. Preto sa Git nazýva decentralizovaný verziovací systém, a má skvelé vlastnosti, pokiaľ ide o prevenciu straty dát.

Keď už máte v rukách niečo použiteľné, môžete repozitár nastaviť na verejný a tým ho sprístupniť komukoľvek.

Forkovanie a Pull requesty – život otvorených projektov

Tým, že nastavíte repozitár ako verejný, umožníte ľuďom prezerať si ho, sledovať, hviezdičkovať, otvárať pripomienky, či si ho naklonovať. Jedna vec, ktorú ale náhodní ľudia robiť nemôžu je pushovať do vášho repozitára. Asi nie je veľmi ťažké pochopiť prečo. Ide o váš projekt a vy by ste mali určovať, čo sa s ním bude diať, prípadne ľudia, ktorým na to dostatočne dôverujete.

Napriek tomu do vývoja chcete zapojiť či už komunitu, ale aj externých spolupracovníkov. Máte už viac-menej hotovú knihu, takže prišiel čas povolať korektora. Jedného si nájdete, a požiadate, aby sa na vašu prácu pozrel. Lenže, ako by ju mal opraviť? Je to človek, ktorému síce za prácu môžete platiť, ale dať mu pushovacie práva nemusí byť dobrý nápad, ak ide o jednorázovú záležitosť, nie je predsa súčasť vášho tímu.

To však ani nie je potrebné. Pokiaľ je repozitár verejný, alebo má korektor aspoň zobrazovacie práva, môže si ho naklonovať do svojho GitHub účtu, tomuto procesu sa hovorí fork (rozdvojenie). Následne v ňom robí zmeny, ako by išlo o jeho vlastný repozitár, podobne ako pushujete vy do toho svojho. Pričom, keď je hotový, otvorí na vašom projekte na stránke GitHubu pull request (požiadavku na vtiahnutie zmien).

To znamená presne to, ako to znie. Žiada vás o vtiahnutie nových commitov z jeho repozitára na jeho účte do vášho repozitára na vašom účte. Vy si môžete tieto zmeny prezrieť pomocou nástrojov, ktoré vám na to Git poskytuje, a môžete ich schváliť, schváliť s úpravami, alebo do chatu k pull requestu napísať výhrady, ktoré môže korektor reflektovať ďalšími commitmi.

Keď ste spokojný, pull request akceptujete a spojíte s vašou hlavnou (alebo inou) vetvou. Korektorov fork už viac nie je dôležitý, môže ho vymazať, alebo aj ponechať, ak by chcel na ňom robiť ďalšiu prácu.

Na tomto procese je skvelá jedna vec. Je obojstranne úplne bezpečný. To znamená, že návrhy zmien môže robiť úplne ktokoľvek, kto môže prezerať váš repozitár. Aj keď sami explicitne nevyhľadáte korektúru, dobrovoľníci, ktorí vašu knihu čítajú ju môžu urobiť za vás a svoju prácu vám bezplatne ponúknuť. V bežnom živote to znie celkom nereálne, lenže na GitHube je to úplne bežné a samozrejmé.

Pokiaľ to licencia vášho projektu umožňuje, fanúšikovia môžu vaše dielo forknúť a pridať doňho vlastné dejové línie alebo štýl, ktoré budú existovať nezávisle od originálu. Tým vzniká úplne nový projekt, nová kniha, v knižnom žargóne nazývaná fan fiction, ktorá rozvíja vaše myšlienky a prácu bez toho, že by ste museli pre to čokoľvek urobiť.

Slovníček, aby ste sa na GitHube už nikdy nestratili

Máme za sebou kus teórie, v rámci ktorej zaznelo veľa pojmov. Aby ste sa v nich vedeli zorientovať čo najlepšie, tu je ich stručný prehľad:

  • Working directory: Pracovný priečinok, v ktorom sídlia súbory vášho projektu (text knihy, obrázky, nie je tu nijaká história).
  • Commit (príspevok): Uložený obraz pracovného priečinku v konkrétnom čase. Keďže s výnimkou prvého vyjadruje zároveň zmenu oproti predchádzajúcemu commitu, nesie dodatočné textové informácie autora popisujúce vykonanú zmenu.
  • Repozitár: Priečinok obsahujúci všetky commity projektu, zachytávajúci tak jeho vývoj v čase od prvého príspevku až po najnovší.
  • Branch (vetva): Reťaz commitov nasledujúcich jeden, druhý. Ktorýkoľvek commit môže byť východiskom pre ľubovoľný počet vetiev.
  • Merge (spojenie): Spojenie typicky dvoch vetiev. Nemusí nevyhnutne znamenať zánik jednej z nich, ide jednoducho o synchronizáciu ich stavu, po ktorej môžu obe pokračovať ďalej ak treba.
  • Tag: Objekt viažuci sa na konkrétny commit vypichujúci a textovo popisujúci jeho význam. Typicky ide o označenie commitov, v ktorých projekt dospel do určitej verzie.
  • Clone (klonovanie): Stiahnutie celého repozitára zo servera na váš laptop.
  • Push (vtlačenie): Vtlačenie nových commitov z repozitára A do repozitára B, typicky je A pracovným repozitárom na vašom počítači a B spoločný repozitár na serveri ako GitHub (ide o v princípe ten istý repozitár, len váš má vaše ešte nepushnuté zmeny, zatiaľ čo repozitár na serveri môže a nemusí mať zmeny iných členov tímu, ktoré ešte nemáte vy).
  • Pull (vtiahnutie): Vtiahnutie commitov z repozitára B do repozitára A. Toto sa zvyčajne robieva vtedy, keď chcete pushnúť nové commity na GitHub, ale niekto z tímu vás predbehol a na serveri sú commity, ktoré ešte nemáte. Vtedy ich musíte najprv vtiahnuť k sebe a integrovať, až potom môžete spraviť push.
  • Fork (rozdvojenie): Funkcia GitHubu, naklonovanie repozitára z jedného účtu do iného účtu. Robíte ho zvyčajne vtedy, ak chcete robiť zmeny na projekte, ktorý nevlastníte s účelom tieto či už zverejniť, vytvoriť úplne nový projekt, alebo ich ponúknuť späť. Väčšina projektov na GitHube má licencie, ktoré všetky 3 vo veľkej alebo úplnej miere umožňujú. Vždy si ale skontrolujte podmienky daného projektu, prečítajte aj súbor contributing.md ak ho projekt má.
  • Pull request (požiadanie o vtiahnutie): Funkcia GitHubu, požiadanie o vtiahnutie commitov z forknutého repozitára do zdrojového repozitára.
  • Star (hviezdička): Ekvivalent lajku pre repozitáre GitHubu.
  • Issue (pripomienka): Druh diskusie otvorený na GitHub repozitári s cieľom nahlásiť bug alebo vyžiadať funkciu.
  • Wiki: Dokumentácia projektu.
  • Release (vydanie): Správa vlastníka repozitára, v ktorej oznamuje novú verziu programu. Vždy sa viaže na nejaký tag, zvyčajne obsahuje zoznam zmien v danej verzii a pripojené bývajú aj skompilované verzie projektu v Assets sekcii.
  • README.MD (čítaj ma.md): Ide o súbor, ktorý ak je súčasťou posledného commitu hlavnej vetvy repozitára, GitHub zobrazí jeho obsah na hlavnej stránke repozitára. Tento súbor informuje o tom, čo daný repozitár obsahuje, a zvyčajne zahŕňa tiež inštrukcie na zostavenie daného projektu a návod na použitie.

2 komentáre

  1. Roman
    Roman 6. augusta 2024

    Dobrý den, děkuji za jednoduché a srozumitelné vysvětlení všech výhod a zároveň i funkčnosti.

  2. Martin
    Martin 6. augusta 2024

    Také bych chtěl za tento článek poděkovat. Stojí za ním určitě hodně stráveného času ke zpracování. Častokrát jsem při práci k výstupům na github směrován odkazy k informacím nebo přímo kódům k tvorbě webu nebo aplikací. A je pro mě důležité pochopit princip, na kterém se obsah udržuje a dynamicky mění.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *

Táto webová stránka používa Akismet na redukciu spamu. Získajte viac informácií o tom, ako sú vaše údaje z komentárov spracovávané.