====== GIT - instalace a nastavení ====== Git lze stáhnout z oficiální stránky [[https://git-scm.com|git-scm.com]] a vybrat si příslušnou distribuci. Pro linuxové uživatele (Ubuntu a podobné distribuce) stačí git nainstalovat z příkazové řádky pomocí: sudo apt update sudo apt install git //pozn. U Windowsové verze doporučujeme integrovat GIT do kontextové nabídky v průzkumníku. Dále zachovat konce řádků, co doporučuje instalace (desktop CRLF, server LF). Vyhnete se tím potom s problémy při kompilaci programu mezi různými platformami.// ===== Vytvoření klíče pro komunikaci se serverem ===== Každý poskytovatel GITích služeb umožňuje obousměrnou komunikaci se serverem z důvodu synchronizace změn. Existují dvě možnosti, kde první, méně používáná, je přes HTTP(s) protokol, která pokaždé vyžaduje zadání uživatelského jména a hesla. Druhá běžně používaná metoda je pomocí SSH klíče, která zajišťuje autentizaci se serverem bez zadání uživatelského jména a hesla. Následující příklad vytvoří dostatečně bezpečný SSH klíč pro komunikaci se serverem. ssh-keygen -t rsa -b 4096 -C "username@fel.cvut.cz" Přepínač ''-t'' vybírá typ klíče (v našem případě RSA, může se použít i DSA, ed25519, … pokud jsou podporovaný) a délku 4096 bitů pomocí přepínače ''-b'', který zabezpečí dostatečnou robustnost klíče. Další info na webu [[https://www.ssh.com/ssh/keygen|https://ssh.com]]. Při vytváření klíče lze použít Enter na všechny volby. Lze ovšem klíč dále zabezpečit ještě heslem (passphrase). Jelikož autentizace pomocí SSH klíčů probíhá na obou stranách, výstupem jsou dva soubory. Prvním souborem je soukromý klíč **id_rsa**, který zůstává u uživatele na počítači a nikdy se nikam a nikomu nekopíruje. Jeho účelem je ověření totožnosti uživatele. Druhý soubor je **id_rsa.pub**, který je označován jako veřejný klíč a nahrává se na server, se kterým chceme komunikovat. Veřejný klíč slouží serveru k identifikaci konkrétního uživatel, který drží klíč soukromý. Dobrou praxí je, že každé zařízení má svůj vlastní soukromý klíč a který existuje vždy právě jeden. Soukromým klíčem se jednoznačně identifikujete u všech autorit, kterým jste dali veřejný klíč. Ty naopak je možné nahrát všude, kam chcete s daným zařízením přistupovat. ===== Spárování zařízení a účtu na GitLabu ===== Abyste mohli repozitáře stahovat nebo i nahrávat, je třeba spárovat Vaše zařízení se serverem. To provedete tak, že se přihlásíte na stránku gitlab.fel.cvut.cz pomocí SSO. Ve Vašem profilu (vpravo nahoře) zvolte **Settings** a následně nalevo nabícku **SSH keys**. Do pole **Key** zadejte obsah souboru **id_rsa.pub** a do **Title** zadejte název zařízení, abyste mohli identifikovat o jaký klíč se jedná. Výhodné to je také v případě, když daný klíč nepoužíváte nebo už neexistuje a rozhodnete se promazat Vaše klíče. Klíč otevřete na svém počítači v libovolném textovém editoru (včetně řádkových ''cat'', ''more'' nebo ''less'') a zkopírujte do webu pomocí clipboardu. Pokud už na GitLabu Váš klíč používáte, nepůjde přidat. GitLab, GitHub, … povolují pouze jednu instanci daného klíče, protože je jasnou identifikací uživatele. ====== Základní práce s GITem ====== ===== Obecné info ===== Samotná práce s GITem není nic složitého než verzování vlastního kódu a případně synchronizace kódů mezi počítačem a serverem. Slovo “//případně//” tam je schválně, neboť samotný repozitář může být pouze na vlastním počítači a **nemusí** se nikam nahrávat na server. V případě nahrání repozitáře na server tak máte potom jistotu, že Vaše kódy budou zálohované. V případě smazání nebo poškození serveru nemusí být kódy ztraceny. Pokud máte totiž kompletní historii uloženou na vlastním počítači (do doby, kdy jste provedli poslední synchronizaci), je potom celkem jednoduché obnovit celý repozitář. Další výhodou verzování kódu je možnost spolupráce více programátorů na jednom projektu. Zde už je potřeba ukládat kódy na server a mít alespoň jednoho správce, který bude rozhodovat jak bude výsledný kód vypadat. Jelikož dva programátoři mohou upravovat stejný kód s jiným výsledkem, zde je potom potřeba rozhodnout, který kód se použije a případně jak se upraví, aby projekt šel zkompilovat a fungoval jak má. Tomuto kroku se říká takz. **merge**, případně **merge request**, když se využívá platforma GitLab, GitHub apod. //pozn. Veškeré popisy se vztahují jak na Windows platformu, tak Linux. U Windows platformy existuje ještě grafická nadstavba, ale ta tu nebude popsána.// ===== První použití GITu ===== V případě, že jste GIT nikdy nepoužil/a, je třeba nastavit globální nastavení v podobě jména a příjmení a emailu. To se provede následujícími příkazy: git config --global user.name "Jmeno Prijmeni" git config --global user.email "username@fel.cvut.cz" Pokud používáte již GIT a chcete specifikovat uživatele pro konkrétní repozitář, toto nastavení provedete následujícími příkazy: cd slozka_s_repozitarem git config user.name "Jmeno Prijmeni" git config user.email "username@fel.cvut.cz" ===== Inicializace a klonování repozitáře ===== Na začátku máte dvě možné situace, které mohou nastat: - Repozitář neexistuje a je třeba jej vytvořit - Repozitář existuje a je třeba jej zkopírovat, tzv. naklonovat ==== Inicializace repozitáře ==== Když neexistuje repozitář, který chcete použít nebo začínáte nový projekt, je třeba repozitář vytvořit. To se provede v příkazové řádce následujícími příkazy: cd slozka_kde_bude_repozitar git init Pokud se rozhodnete lokálně vytvořený repozitář synchronizovat se serverem (musí být nově vytvořený repozitář), bude třeba použít následující postup příkazů (doporučený postup): cd slozka_kde_je_repozitar git remote rename origin old-origin git remote add origin git@gitlab.fel.cvut.cz: ... git push -u origin --all git push -u origin --tags ==== Klonování repozitáře ==== Pokud je repozitář veřejný a je nabízen např. pomocí ''%%HTTP(S)%%'' protokolu (typicky projekty na [[https://github.com|github.com]]), je možné ho naklonovat následovně: git clone https://www.github.com/... V případě privátních repozitářů je obvyklým způsobem využití ''%%SSH%%'', zpravidla tak, že se na server s repozitářem uloží privátní klíč uživatele. Tento způsob budeme používat při práci s fakultním serverem [[https://gitlab.fel.cvut.cz|gitlab.fel.cvut.cz]]. ==== Práce se vzdáleným repozitářem ==== Pokud má být repozitář synchronizovaný se serverem, je třeba ještě říci kde se server nachází. Je třeba nastavit tzv. **remote** uživatele následujícím příkazem (adresa //git@gitlab.fel.cvut.cz:B192_B2B99PPC/tutorials.git// se může lišit): git remote add origin git@gitlab.fel.cvut.cz:B192_B2B99PPC/tutorials.git ====== Vizualizace repozitáře ====== Existuje mnoho možností a nástrujů, jak vizualizovat strukturu repozitáře. V následující kapitole se budeme věnovat programu **gitk**, který je standardně součástí každé distribuce GITu. Jeho účelem je procházet jednotlivé změny, kdo, kdy je udělal a jaké soubory se změnily. Je dovoleno pracovat na stejném repozitáři ve více lidech, poté by zde bylo vidět i rozvětvení a sloučení (merge) v jednu větev. Program **gitk** lze spustit bez parametrů nebo i s parametry. Pár základních je sepsáno níže: * ''%%gitk%%'' vizualizuje kompletní strukturu současné větve * ''%%gitk --all%%'' vizualizuje všechny dostupné větve v repozitáři * ''%%gitk -t [tag]%%'' vizualizuje větev do štítku //tag// * ''%%gitk -b [branch]%%'' vizualizuje vizualizuje větev //branch// Na následujícím obrázku znázorněno, jak vypadá příklad vizualizace tohoto repozitáře a jednotlivé části dialogu jsou popsány níže: - Červená tečka na začátku značí aktuální pozici s rozpracovanými soubory - Commit, ze kterého se odvíjí současný stav programu (větve) označen žlutou tečkou. Na tomto řádku je také přiřazen tag //pr_tagu//, který je vizualizovaný žlutou vlaječkou. Dále je zde vizualizace, kde skončila větev //master// lokálně a větev //origin/master// uloženou na serveru. Může se stát, že se provede několik commitů bez synchronizace se serverem a větev //origin/master// bude níže. - Tato pozice ukazuje označený commit (**5**) a zobrazené změny (**8**) v jednotlivých souborech (**7**), které se provedly v porovnání s předchozím commitem kým a kdy (**4**). - Uživatel, který provedl změny a kdy - Číslo commitu, který by měl být jedinečný (teoreticky i na světě) a pomocí tohoto ID je poté možno se vracet k dané změně pomocí příkazu ''%%git checkout [ID]%%'' - Změněné soubory vůči předchozímu commitu - Hlavička commitu, který byl předchozí commit, kdo a kdy jej provedl apod. - Změny v jednotlivých souborech (-) značí odebraný řádek, (+) značí přidaný řádek. V případě změny na řádku, bude existovat pár (-) a (+) se změnamy {{ :courses:b2b99ppc:howtos:gitk.png?direct&400 |}} Přes pravé tlačítko myši lze nastavovat vlastnosti bez použití příkazové řádky, jako je přiřazení tagu, porovnání dvou commitů apod.