Seznamte se; tohle je Git

Git je jedním z nejpopulárnějších verzovacích systémů, a proto se s ním dříve nebo později setkáš. Že se ještě neznáte? My tě s ním teď rádi v rychlosti seznámíme! Ukážeme ti, v čem je tenhle pomocník výjimečný, co všechno umí a proč ti stojí za to mu věnovat svůj čas a energii. Ready?

Úvodní seznamovačka

Co je ten „verzovací systém“ zač?

Pojmem verzování se rozumí vytváření různých verzí (většinou softwaru), kde každá taková verze uchovává informace o provedených změnách. K těmto verzím se pak dá např. vracet v případě nutnosti.

Nejvíc srandy si ale s verzováním užiješ v nějakém verzovacím systému, neboli systému pro správu verzí (angl. Version Control System – VCS). Verzovací systémy např. zaznamenávají, kdo a v jakém souboru provedl konkrétní změnu, nebo pomáhají se spoluprací v kódu (řeší kolize/konflikty; situace, kdy se více programátorů současně snaží nahrát změny ve stejném kódu).

Co je teda ten GitHub?

GitHub je jedna z mnoha platforem pro hostování projektů. Bezplatně ti vytvoří prostor, na kterém právě za pomoci Gitu můžeš skladovat svůj projekt ve formě repozitářů.

Další výhodou GitHubu jsou GitHub Actions. Díky nim lze např. při vložení kódu do repozitáře spustit skript. Pro účely Tour de App se ti budou hodit pro automatizované nahrávání Docker obrazu tvého týmu. Můžeš použít jednu z našich předloh z našeho profilu, nebo začni sám od začátku. Více se dozvíš dále v textu.

Začínáme zlehka; instalace na Windows

Instalační balík lze stáhnout z git-scm.org.

Všechny možnosti stačí nechat na výchozích hodnotách, můžeš ale změnit cokoliv podle libosti, např. výchozí git editor.

Použití

V případě ohně: git commit, git push, exit building

Přihlašování při nahrávání změn

GitHub apod. spravují přístup k repozitářům pomocí účtů. Pokud chceš tedy přispívat, musíš se do Gitu nejprve přihlásit.

Jako první si nastav jméno a e-mail, pod kterým se změny budou odesílat. Mohou se lišit od údajů, které máš na svém GitHub profilu. Může se ale stát, že změny nebudou připsány k tvému profilu, ale pouze k e-mailu. Možnost --global nám toto nastavení jména a e-mailu bude aplikovat u všech dalších repozitářů, které vytvoříš.

git config --global user.name "Jan Tůrdeap"
git config --global user.email jan@tourdeapp.cz"

Jak na to

Jsi zapomnětlivec? Git Credential Manager ti ulehčí práci s opakovaným zadáváním hesla. Ten se na Windows (pokud jsi nic nezměnil při instalaci) nainstaluje i s Gitem. Díky němu stačí zadat heslo pouze jednou a poté si ho bude GCM bezpečně pamatovat.

Jestliže Git Credential Manager nemáš, bude se tě Git ptát na jméno a heslo při každém odesílání změn. Pokud si chceš ulehčit práci alespoň se zadáváním jména, při klonování repozitáře si přidej před github.com svoje uživatelské jméno: git clone https://janturdeapp@github.com/janturdeapp/mojeaplikace.

Pokud používáš GitHub, jako heslo se kvůli bezpečnostním rizikům už nezadává tvoje samotné heslo. Na Windows ti při použití GCM vyskočí okno, pomocí kterého se můžeš přihlásit skrz prohlížeč, nebo kód. Na ostatních systémech může být třeba si vytvořit tzv. Personal Access Token.

Na stránce https://github.com/settings/tokens klikni na tlačítko Generate new token.
Screenshot ze stránky s generováním tokenů

Vybereš-li fine-grained token, můžeš ho přidělit jen k určitému repozitáři. Jestliže ho následně někam vložíš, zamezíš tím hladce přístup někomu, kdo tam nemá co dělat. To však nemusí fungovat na repozitáře, které nejsou pod tvým účtem. Pro takové je lepší vybrat token classic. V tom případě musíš vybrat následující oprávnění; pokud máš soukromý repozitář: repo, jinak public_repo.

Tabulka základních příkazů

Příkaz Popis Ukázka použití Popis ukázky
git init Vytvoří prázdný git repozitář v aktuální složce    
git clone Stáhne repozitář z internetu git clone https://github.com/github/github Stáhne repozitář na dané adrese
git add <soubor/složka> Přidá soubor do fronty pro nový commit git add . přidá všechny soubory, složky a podsložky v aktuální složce
git commit -m <zpráva> Vytvoří nový commit ze souborů přidaných skrz git add git commit -m "přidat index.html" vytvoří commit s názvem přidat index.html
git branch <název> vytvoří novou větev s daným názvem z aktuální větve git branch druhavetev nová větev s názvem druhavetev
git checkout <název> Změní aktivní větev git checkout druhavetev přepne na větev s názvem druhavetev
git merge <větev> Pokusí se replikovat změny (tj. spojit) z <větev> na aktuální větev git merge dev spojí změny z větve dev na aktuální aktivní větev
git status Ukazuje aktuální stav repozitáře (změny, commity apod.)    
git push Odešle změny    
git pull Stáhne změny    
git diff Zobrazí tvoje změny git diff dev...main zobrazí rozdíly na větvi dev od vytvoření větve main

💡 TIP

Existuje spousta GUI klientů pro Git, čímž si můžeš ulehčit práci a přeskočit všechny části tohoto návodu týkající se psaní příkazů. VS Code poskytuje GUI ovládání, pro GitHub lze použít GitHub Desktop

Další programy jsou např. GitKraken (bezplatný pro veřejné repozitáře) nebo Gittyup (bezplatný).

Commit

Commit je jeden soubor změn publikovaný určitým uživatelem (s případným spoluautorstvím dalších). Každý commit má svůj unikátní hash, kterým ho lze identifikovat.

Můžeš si zobrazit změny mezi různými commity pomocí příkazu diff, nebo online na hostovací platformě, kterou používáš.

Pro vytvoření samotného commitu je nejdříve nutné přidat soubory do "fronty" pro commitování. V GUI najdeš většinou nějakou formu tlačítka +. V terminálu toho docílíš příkazem git add soubor. Pokud chceš přidat všechny změny ve složce, stačí použít git add ..

Jakmile máš všechny soubory přidané, použij tlačítko commit, nebo v terminálu příkaz git commit -m "Moje zpráva", kde "Moje zpráva" bude název tvého commitu, který se takto bude zobrazuje posléze všude (uvozovky nutné).

Jakmile je vše commitnuté, stačí změny odeslat. Stačí v terminálu použít příkaz git push.

Větve

Větve slouží k rozdělení pracovních prostředí. Hodí se např. při paralelní práci více lidí, implementaci různých funkcí, které chceš vyvíjet odděleně od základního kódu, nebo pro možnost vývoje X různých verzí programu bez nutnosti vytvářet repozitář zvlášť.

Větve lze vytvořit ve webovém rozhraní platformy, u které máš uložený kód, ve tvém GUI editoru, nebo pomocí příkazu git branch <větev>. Tento příkaz vytvoří novou větev z aktuální aktivní větve. Pro přepnutí však musíš použít příkaz git checkout <větev>. Pokud nechceš ztrácet čas a chceš vytvořit a přepnout větev zároveň, stačí za checkout přidat možnost -b, která gitu říká, že má danou větev vytvořit. git checkout -b ahoj tedy vytvoří novou větev z tvé nyní aktivní větve a hned se na ni přepne.

Pro spojení dvou větví buďto použij ve webovém rozhraní funkci Pull request (viz níže) – pokud potřebuješ řídit nebo kontrolovat proces spojení –, nebo v terminálu jednoduše příkazem git merge <větev>. Ten spojí změny ze zadané větve do větve aktivní.

Při spojování můžou vzniknout tzv. konflikty, které tu již byly zmíněny. Často se tak děje, pokud vás na souboru pracuje více ve stejnou dobu. Ty se většinou dají jednoduše vyřešit procesem popsaným v části s problémy.

Pull request

Pull request na GitHubu
Pull request je funkce, kterou najdeš u většiny poskytovatelů platforem typu GitHub. Slouží pro bezpečné a řízené spojení (merge) dvou větví.

Pull request se snaží všechny jednoduché problémy při spojování vyřešit automaticky. Pokud je automaticky vyřešit nelze, objeví se upozornění s konkrétním popisem problému. Ten už se pak řeší jako běžný konflikt

Odevzdávání skrz GitHub Actions

GitHub nabízí CI server. Dokáže spouštět různé skripty; definované tebou nebo vytvořené ostatními uživateli. Každá taková "akce" je určena pomocí jednoduchého YAML syntaxu.

Po vytvoření vlastního tzv. workflow si můžeš v záložce Actions zobrazovat průběh a záznam každého spuštění.

Odevzdávací workflow vytvoříš takto:

  1. Najeď si na svůj GitHub repozitář.
  2. Otevři si nastavení.
  3. Přejdi do kategorie Secrets and variable --> Actions.
  4. Vytvoř si nový tajný klíč (New repository secret) s názvem TEAM_SECRET. Jako hodnotu nastav svůj týmový hash a ulož jej.
  5. Otevři si záložku Actions.
  6. Vytvoř nový prázdný workflow (New workflow --> set up a workflow yourself).
  7. Nahraď výchozí šablonu následujícím:
name: Build and push to TdA

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Check Out Repo
        uses: actions/checkout@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Build
        uses: docker/build-push-action@v3
        with:
          context: ./
          tags: tda-flask:latest
          outputs: type=docker,dest=/tmp/tda-flask.tar

      - name: Upload to TdA
        uses: Tour-de-App/upload-app@tda-24
        with:
          team_secret: ${{ secrets.TEAM_SECRET }}
          image_name: tda-flask
          image_path: /tmp/tda-flask.tar
  1. Proveď commit

Akce teď proběhne pokaždé, když se na repozitář commitnou nové změny. Akce sestaví projekt pomocí docker build a nahraje skrz naši akci. V záložce Actions bude mít každé spuštění dostupné své logy k zobrazení.

Logy GitHub actions

Problémy a úzkosti

Ve většině případů vrací Git jasné chybové hlášky. Stačí postupovat podle pokynů, které ti k vyřešení problému sám uvede, nebo postačí chvilka googlení. Tady jsou dva časté problémy, které by tě mohli potkat. Ukážeme ti, jak se s nimi popasovat.

You have divergent branches and need to specify how to reconcile them

Toto je hláška, kterou uvidíš, pokud nemáš nastavené výchozí automatické spojení konfliktních změn v souboru. Git ti rovnou poradí, co dál.

hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint: 
hint:   git config pull.rebase false  # merge
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint: 
hint: You can replace "git config" with "git config --global" to set a default

Nejjednodušší je nastavit možnost uvedenou jako merge. Detailní rozdíly si můžeš přečíst zde.

Automatic merge failed; fix conflicts and then commit the result.

Kde nepomůže automatizace, pomůže hrubá lidská síla. V případě této chyby se nepodařilo automaticky spojit vzdálené změny s těmi tvými.

Když si otevřeš soubor, u kterého se zobrazuje tento problém, bude v sobě mít zapsané rozdíly. <<<<<<< HEAD označuje změny z hlavy, tedy základní větve na tvém počítači. ======= rozděluje změny v hlavě a změny ve vzdáleném commitu, které končí >>>>>>> tvůjcommithash.

Pro vyřešení konfliktu stačí odstranit značky změn a ponechat to, co chceš v souboru opravdu mít. Poté stačí uložit, přidat (git add .), commitnout (git commit -m "Opravit konflikt") a odeslat (git push).

Složitější konflikty se řeší trochu jinak, to dobře popisuje článek od GitHubu. Případně editory, jako např. VS Code, obsahují nástroje pro řešení konfliktů skrz GUI.