Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

8. diel - Git - Práca so vzdialeným repozitára

V minulej lekcii, Git - Skúmanie histórie - Dokončenie , sme dokončili skúmanie histórie. Zaoberali sme sa zoznamom všetkých vetiev, detailmi commitu, sledovaním a odstránením vykonaných zmien.

V minulom dieli sme si povedali o prácu s vetvami. Zatiaľ ale všetko prebiehalo lokálne a teda len u nás v počítači. Dnes sa podelíme aj s ostatnými. Povieme si niečo o prácu so vzdialeným repozitára, ako aktualizovať lokálne repozitár alebo ako naopak nahrať zmeny na repozitár vzdialený.

Ako vytvoriť vzdialený repozitár

Ak chceme vytvoriť verejný repozitár, musíme mať najprv kde ho umiestniť. Tu by som sa vrátil k prvému dielu, kde sme si vymenovali jednotlivé servery, ktoré poskytujú repozitára. Pre ďalšiu prácu budú ukážky z GitHub.

vytvorenie repozitára - Git

Pred vytvorením musíme repozitár pomenovať. Ďalej je možnosť pridať k úložisku popis a nastaviť, či bude verejný alebo privátny (popísané v prvom dieli). V poslednej kolónke môžeme zvoliť, či sa vytvorí repozitár s README súborom. Jeho text bude zobrazovaný na úvodnej stránke repozitára a malo by v ňom byť uvedené o aký projekt sa jedná. Ďalej môže GitHub automaticky vytvoriť .gitignore súbor pre zadaný jazyk a tiež LICENCIE súbor, v ktorom je len napísané či a akým spôsobom sa môže dielo ďalej šíriť. Potom môžeme odkliknúť vytvorenie repozitára. Pre jeho stiahnutie využijeme už známy príkaz git clone.

HTTPS alebo SSH

Pre pripojenie k úložisku môžeme využiť HTTPS alebo iba SSH. Najprv sa pozrieme na zložitejšie konfiguráciu SSH a potom na HTTPS.

Aby sme sa mohli pripojiť cez SSH, musíme si vygenerovať SSH kľúč, podľa ktorého nás server spozná. Kompletný návod je na stránkach GitHub.

$ ssh-keygen -t rsa -b 4096 -C "[email protected]"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/VasUcet/.ssh/id_rsa): [Povrdíme Enterem]
Enter passphrase (empty for no passphrase): [Napíšeme heslo]
Enter same passphrase again: [Znovu napíšem heslo]
Your identification has been saved in /c/Users/ VasUcet /.ssh/id_rsa.
Your public key has been saved in /c/Users/ VasUcet /.ssh/id_rsa.pub.
The key fingerprint is:
01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db [email protected]

Teraz máme vygenerovaný SSH kľúč, ktorý nájdeme v súbore C: \ Users \ VasUcet \ .ssh \ id_rsa.pub. Následne ho pridáme na GitHub. V nastavení účtu nájdeme položku SSH keys. Odlikneme tlačidlo "Add SSH Key". Kľúč nejakým spôsobom pomenujeme a vložíme rovnaký obsah, ako je v súbore id_rsa.pub (bez akýchkoľvek úprav!). Uložíme a môžeme začať používať.

Vloženie kľúča - Git

Pre overenie funkčnosti zavoláme príkaz ssh -T git @ github.com. Nevýhodou je, že pri každom dotaze na server musíme zadať heslo.

Ak budeme používať HTTPS, bude potrebné zadávať okrem hesla (tentoraz k účtu) tiež email. Tomu sa môžeme vyhnúť príkazom git config --global credential.helper cache. Potom sa bude Čachovo heslo 15 minút. Ak chceme Čachovo heslo dlhšie, použijeme atribút --timeout git config --global credential.helper "cache --timeout = 3600". Čas sa zadáva v sekundách (v príklade je teda nastavená jedna hodina).

Ktorý spôsob teda použiť? GitHub odporúča HTTPS. Neblokuje ho firewall a je kompatibilný. Z hľadiska správy je veľmi lákavý pre verejnosť, pretože stačí len meno a priezvisko. Naproti tomu má SSH ľahšiu konfiguráciu na strane servera, avšak užívateľ musí generovať vlastný kľúč. Z toho tiež vyplýva, že nie je možné cez SSH poskytovať anonymný prístup (aj keby len read-only). SSH je bezpečnejšie a pri strate alebo odcudzení kľúča je jednoduché zmazať kľúč z účtu. Čo teda využijete závisí na aktuálnych potrebách.

Odkazy na vzdialenej repozitára a konáre

Aby sme sa mohli pripojiť na vzdialený repozitár z lokálneho, musí k nemu existovať odkaz. Zoznam odkazov na vzdialené repozitára Git uchováva pod príkazom git remote. Bez parametrov zobrazí zoznam všetkých odkazov. Ak ste repozitár naklonovali, bude tam už jeden odkaz s názvom origin. Jedná sa o odkaz na zdroj, z ktorého repozitár pochádza. Týchto odkazov si môžeme vytvoriť ľubovoľné množstvo. Príkazom git remote add <NazevZdroje> <url> vytvoríte nový, naopak príkazom git remote remove <zdroj> odkaz zmažete. Viac informácií nájdete na oficiálnych stránkach.

Na serveri môže existovať viac vetiev, zároveň môže niekto vetva, z ktorej ste klonovali, upraviť pred tým, než do nej zapíšete vlastné zmeny. K vetvám na serveri pristupujeme cez odkaz. Ak chceme získať zoznam vetiev na serveri, využijeme príkaz git remote show <zdroj>.

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:PatrikValkovic/Test.git
  Push  URL: [email protected]:PatrikValkovic/Test.git
  HEAD branch: master
  Remote branches:
    NovaVetev  new (next fetch will store in remotes/origin)
    TretiVetev new (next fetch will store in remotes/origin)
    master     tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Pod "Remote branches" vidíme zoznam vzdialených konárov. Tieto vetvy sú nezávislé na lokálnom úložisku (práve kvôli zmenám, ktoré môže urobiť ktokoľvek). Musíme sa k nim teda odkazovať iným spôsobom. Pre vzdialenej vetvy napíšeme pred jej názov meno odkazu a lomka. Ak teda chceme pristúpiť na vetvu TretiVetev zo zdroja origin použijeme príkaz git checkout origin / TretiVetev. Z toho tiež vyplýva, že môžeme mať niekoľko zdrojov, ktoré vychádzajú z jedného repozitára. Situácia potom bude vyzerať tak, že budeme mať vetva master, v ktorej práve pracujeme, vetva PuvodniRepositar / master, vetva PrvniZdroj / Master a vetvu TretiZdroj / master. Tieto vetvy sú na seba nezávislé a môžeme s nimi pracovať oddelene (bez toho aby nastával problém duplicitných názvov).

Aktualizácie zo vzdialeného repozitára

Zatiaľ sme zistili, aké vetvy sú na serveri uložené, ale nemáme k nim prístup. Aby sme ho mali, musíme aktualizovať vetvy zdroja. To prevedieme príkazom git fetch <zdroj>. Ten postahuje všetky zmeny zo vzdialeného repozitára a uloží ich lokálne. Tieto vetvy však budú stále spojené so zdrojom (zdroj / vetva). Čo ale môžeme, je pracovať s nimi ako normálnymi vetvami - a teda je aj mergovat. Toho využijeme. Vytvoríme si novú vetvu a zmergujeme ju s vetvou, ktorá bola na serveri. Tým máme rovnakú podobu vetvy, aká je na serveri. Vytváranie a mergování môžeme urýchliť príkazom git checkout <NazevVzdalene­Vetve> (teda ak máme vetva origin / NovaVetev, potom git checkout NovaVetev vytvorí novú vetvu a automaticky ju zmerguje). Tým sa vytvorí nová vetva sa rovnaký názvom a zmerguje sa s pôvodnou konárov.

Ešte väčšieho urýchlenie docielime príkazom git pull, ktorý nahradí príkazy git fetch a git merge. git pull vykoná obaja príkazy za nás. Nevykonáva to ale pre všetkých vetvy, iba pre nakonfigurované. Zoznam konárov, ktoré sa budú automaticky aktualizovať príkazom git pull, je vypísaný v popise zdroja pod bodom "Local branch configured for 'git pull'". V základnom nastavení tu bude master vetvu a všetky vetvy, ktoré sa vytvorili automaticky príkazom git checkout s menom vzdialenej vetvy. Vetva môžeme pridať aj ručne príkazom git branch --set-upstream-to <zdroj> / <JmenoVetveKam­Posilat>. Od tejto doby sa bude aktuálna lokálne vetva automaticky aktualizovať podľa vzdialenej vetvy, ktorú sme určili. Na prehľadu zdroje by sa vetva mala zobraziť ako nakonfigurovaná pre 'git pull'. Ak použijeme iba git pull, aktualizuje sa podľa zdroja "origin". Ak budeme chcieť aktualizovať podľa iného zdroja, musíme ho uviesť (git pull <zdroj>).

Aktualizujeme vzdialený repozitár

Pre opačný smer, teda aktualizáciu vzdialeného repozitára, nám bude stačiť jediný príkaz, a to git push. Ukážeme si jeho najviac používané tri podoby. Pre viac informácií použite dokumentáciu. Vzhľadom k veľkému počtu prepínačov nebudem rozoberať každý prípad.

Prvý prípad je git push <zdroj> <Vetva>. Tento príkaz pošle zadanú vetva na server. Pokiaľ na serveri vetvu so zadaným menom existuje, tak ju aktualizuje, inak novú vetva vytvorí. Ak chceme poslať vetva, ktorá má na serveri iné meno (alebo sa mená nezhodujú), použijeme príkaz git push <zdroj> <LokalniVetev>: <VetevNaServeru>.

Obdobne ako pri git pull môžeme zavolať git push bez parametrov alebo len s parametrom zdroja. Ak nebudú uvedené žiadne parametre, automaticky sa pošlú zmeny na zdroj "origin". Vetvy, ktoré sa budú odosielať, sú nakonfigurované u daného zdroja (Local ref configured for 'git push'). Opäť sa tam bude vyskytovať vetvu master a všetky vetvy, ktoré sme automaticky vytvorili príkazom git checkout. Na ručné pridanie vetvy do tohto zoznamu som príkaz nenašiel. Ak by bolo potrebné takúto funkcionalitu sprevádzkovať (dostávať dáta z iného repozitára, než na ktorý dáta posielate), odporúčam naštudovať premennú branch. <Name> .pushRemote v configu. Je ale nutné si uvedomiť, že vetva musí byť aktualizovaná, inak server nepovolí nahratie súborov. Preto je vhodné zaradiť vetvy v push i do pull.

Riešenie kolízií

Môže sa stať, že kým pracujete na časti kódu, niekto iný nahrá svoju časť kódu. V tejto chvíli odkazuje váše vetva master niekam inam než origin / master. Git zavádza pre kolízie striktné politiku - nahratie súborov zlyhá. Musíte si stiahnuť aktuálnu podobu na serveri. Ak teda nastanú kolízie, musíte ich vyriešiť vy, pretože pri sťahovaní vzdialených konárov dôjde na mergování. K nahratie súborov vás Git pustí, až keď bude vaša vetva master aktuálne (up to date).

Tým je seriál o GITU u konca. Pre ďalšie pokročilejšie štúdium si môžete stiahnuť knihu ""pre Git"":https://git-scm.com/book/cs/v1 alebo preštudovať dokumentáciu. Dúfam, že som Vám ukázal dostatok kladov, ktoré Git prináša a nebudete pochybovať o jeho použití v ďalšom projekte :-) .

V budúcej lekcii, Git - Vnútorná štruktúra , sa pozrieme na vnútornú štruktúru Gitu a naučíme sa tvoriť stromovú štruktúru. Zoznámime sa tiež s prehľadom základných príkazov.


 

Predchádzajúci článok
Git - Skúmanie histórie - Dokončenie
Všetky články v sekcii
Git
Preskočiť článok
(neodporúčame)
Git - Vnútorná štruktúra
Článok pre vás napísal Patrik Valkovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity