[git] Quickstart

Všeobecné návody jak při vývoji postupovat...
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable
Avatar
Gregory
Vedoucí vývoje
Příspěvky: 73
Bydliště: near Pilsen

[git] Quickstart

Příspěvek od Gregory » 20. listopad 2017 (23:52:50)

Pro správu repozitářů budeme používat systém zvaný "git". Jedná se o distribuovaný systém správy verzí, jehož primární využití je pro správu a verzování zdrojových kódů. V kontextu tohoto postu budu předpokládat, že je použit právě pro správu zdrojového kódu.

Tento quickstart není nikterak podrobný, nebudou popisovány žádné větší složitosti, tedy například konkrétní uložení a fungování systému git, zabezpečení, nic. Části toho, co zde vynechám, budou popsány v jiném topicu.

Nejprve krátký slovník pojmů:
  • repozitář - jedno oddělené úložiště určené např. právě jednomu projektu
  • branch - "větev" vývoje v rámci jednoho repozitáře (oddělení vývoje projektu do vlastního odděleného "prostoru")
  • commit - "příspěvek" do repozitáře v podobě změn oproti stavu před ním
  • commit note - poznámka k příspěvku do repozitáře, povinná
  • pull - stažení změn ze vzdáleného repozitáře do místního, např. na vašem PC
  • push - nahrání změn z místního repozitáře do vzdáleného
  • merge - spojení větví do sebe
  • patch / diff - soubor změn, který lze např. odeslat mailem nebo zde na fórum (fakticky je rozdíl mezi pojmy patch a diff, nebudeme se jím zabývat)
  • master - zde nějaká hlavní branch, která je přítomna vždy a tvoří stabilní vývojovou větev
Stažení, instalace

Linux
Pro uživatele operačních systémů založených na GNU/Linux (dále jen "na Linuxu") je postup snadný - stačí otevřít terminál a prostřednictvím balíčkového systému ve vaší distribuci přítomným stáhnout nástroje gitu:

Kód: Vybrat vše

# Debian-based systemy (Ubuntu, Mint, ..)
apt install git-all

Kód: Vybrat vše

# Fedora/CentOS/...
dnf install git-all
Windows
Na OS Windows je nutné sahnout po instalátoru, který vám nastaví vše potřebné. Nástroj se jmenuje msysgit a je dostupný ke stažení na této adrese: https://git-for-windows.github.io/

Stahněte instalátor, nainstalujte.

Stažení repozitáře, orientace

Příkladem bude repozitář emulátoru. Pro jeho stažení se navigujte do terminálu - v případě Linuxu stačí otevřít terminál, v případě Windows by mělo stačit pravým tlačítkem myši stisknout kamkoliv do volného prostoru nějaké složky (popř. na plochu) a vybrat "Git Bash here". Pak si najdeme repozitář na webových stránkách githubu, kde se naše repozitáře nacházejí - https://github.com/iCeOnlineWoW - vybereme repozitář "G-Core" a vpravo najdeme zelené tlačítko "Clone or download" a uvedenou adresu si zkopírujeme do schránky (ctrl-C) - naznačeno zde: https://i.imgur.com/XMiGirS.png

Poté se přesuneme do terminálu a zadáním příkazu s touto adresou stahneme repozitář:

Kód: Vybrat vše

git clone https://github.com/iCeOnlineWoW/G-Core.git
V terminálu budou chvíli běhat procenta, repozitář je poměrně velký, jeho stahování bude nějakou dobu trvat. Operace bude dokončena, když se vám znovu objeví "prompt" terminálu s vyčkáváním na další příkaz.

Nyní máte stažený repozitář a můžete si prohlédnout složku, která se vám tímto vytvořila. Pokud máte zobrazené skryté soubory a složky, můžete vidět složku ".git" - ta není součástí přímo repozitáře (kódu, který spravujete, atd.), ale jedná se o složku sdružující informace o repozitáři (řekněme takové "meta informace") - ukládá se tam vše možné od nastavení specifického pro repozitář, až po historii commitů ve všech branchích tohoto repozitáře. Ostatní soubory a složky jsou již standardním obsahem tzv. "working tree" - pracovního stromu repozitáře.

V momentě stažení repozitáře máte uloženou nějakou lokální kopii toho, co bylo platné v momentě stahování. V této lokální kopii můžete provádět změny, jak se vám zlíbí, ale žádná z nich se neprojeví v původním vzdáleném repozitáři, dokud neprovedete "push" (s příslušnými právy; k tomu dále)

Vývoj, commity

Každý vývoj by měl probíhat alespoň trochu systematicky, tedy v případě emulátoru si vytyčíte cíl, co chcete opravit - řekněme nějaký spell, nebo naskriptovat AI potvory. To znamená, že v jeden moment byste měli pracovat na jedné této úpravě. Pochopitelně jsou cesty, jak docílit možnosti pracovat na vícero opravách zároveň se zachováním čistoty repozitáře, ale to pro tento návod vynechme, budeme se soustředit na jednoduché postupy.

Důvodem, proč je nutné dodržet systematický postup při vývoji je ten, že vše co změníte budete chtít "zabalit" do nějakého commitu, který bude mít nějakou svou poznámku, která typicky obsahuje (a v našich repozitářích vždy bude obsahovat) titulek změny. V případě opravy spellu to bude název spellu, co jste opravovali, v případě AI bosse v dungeonu to bude například lokace a jméno.

Pro teď tedy předpokládejme, že jste v kódu změnili, co jste potřebovali a dodrželi jste vše vypsané. Budeme tedy chtít obalit změny do commitu. To uděláme příkazem, který obecně vypadá takto:

Kód: Vybrat vše

git commit <soubory> -m "<commit note>"
Prakticky lze místo výčtu souborů buď provést přidání pomocí příkazu "git add" (později) nebo použít přepínač "-a". Příkladem tedy může být oprava vizuálního efektu spellu Summon Imp u warlocka:

Kód: Vybrat vše

git commit -a -m "Spells/Warlock: fixed Summon Imp visual effect"
Tímto jste vytvořili commit, který je součástí vašeho lokálního repozitáře (lokální kopie).

Pokud chcete přidat nový soubor do repozitáře a zahrnout ho v commitu, je nutné ho před commitem nejdříve přidat příkazem, který obecně vypadá takto:

Kód: Vybrat vše

git add <soubory>
Soubory lze zadávat pouhým výčtem (relativní/absolutní cesta) nebo i s použitím hvězdičky pro hromadný výběr. Můžeme chtít vybrat například všechny soubory s příponou .cpp a přidat je do projektu:

Kód: Vybrat vše

git add *.cpp
Případně konkrétní soubor:

Kód: Vybrat vše

git add main.cpp
Tento příkaz je nutné udělat pouze jednou.

Nahrávání změn na vzdálený repozitář

Pokud jste vytvořili commit a chcete ho přenést do vzdáleného repozitáře (a máte na to příslušná práva), lze to provést příkazem "push". Ještě předtím ale budeme muset ověřit, že máme lokální kopii aktuální (tedy že žádný náš kolega nestihnul nahrát svoje změny dříve), a pokud ne, aktualizovat ji. To lze provést příkazem:

Kód: Vybrat vše

git pull
Tento příkaz předpokládá, že všechny změny jsou commitnuté, popř. že žádné nejsou. Pokud tomu tak není, bude vám oznámeno, že "Working directory is not clean" a je nutné buď změny commitnout (pokud jste na to třeba jen zapomněli), nebo vymazat příkazem:

Kód: Vybrat vše

git reset --hard
Pokud se vše povede a konzole nebude hlásit žádný například konflikt nebo chybu, je náš repozitář aktuální - buď se nic nezměnilo ani ve vzdáleném repozitáři, nebo byly změny úspěšně nahrány. Pokud je nahlášena chyba, typicky jde o nějakou chybu ve spojování vašich změn a změn ze vzdáleného repozitáře. Git vám v tomto případě nahlásí, v jakých souborech došlo k chybám spojování a vy musíte chyby ručně opravit. Po jejich opravě stačí pouze příkazem "git add <soubor>" potvrdit, že jste daný soubor opravili, a po opravě všech souborů provést jednoduchý "git commit" bez parametrů.

Takovou aktualizaci je doporučené provádět před tím, než začnete provádět změny. Vyhnete se tím zbytečným konfliktům, kterým šlo předejít včasnou aktualizací.

Pokud je vše v pořádku, lze provést příkaz

Kód: Vybrat vše

git push
který nahraje změny do vzdáleného repozitáře. Pokud by se vám náhodou povedlo zapomenout na aktualizaci, nebo vás někdo předběhnul v posílání změn do repozitáře, objeví se hláška obsahující "rejected" - to znamená, že je nutné aktualizovat repozitář, případně vyřešit jiný konflikt. Pokud se vám zdá, že je repozitář aktuální a stejně nejde push, napište mi, jelikož se vám mohlo povést nějakým způsobem pochroumat integritu commitů a z toho se nejde vymotat snadnou cestou (která nezahrnuje smazání vašich změn).

Poznámka:
Od určité verze gitu a tuším asi jen na Windows je potřeba specifikovat, do jaké branche budete přispívat. To zajistíte příkazem:

Kód: Vybrat vše

git push --set-upstream origin master
Tím gitu řeknete, že chcete svázat váš lokální repozitář pro push s určitým vzdáleným. V gitu totiž není pravidlem, že jsou oba směry "symetrické" - můžete mít více vzdálených zdrojů, z většiny jen číst, do jednoho jen zapisovat, a tak podobně.

Alternativy

Pochopitelně existují i alternativní přístupy, například nějaké grafické rozhraní. Používáním těchto nástrojů se ale vystavujete riziku, že bude provádět dodatečné operace "za vašimi zády", a že vám například nebudu schopen v případě potíží pomoci jinak, než zase použitím konzolové verze. Sám GitHub nabízí svého desktopového klienta, kterého pochopitelně je možné použít. Nezkoušel jsem ho, nicméně přístup přes konzoli je univerzální a dostupný všude a vždy.

------- Zatím to berte s velkou rezervou, zítra si to po sobě přečtu a hrozí, že toho půlku stejně přepíšu
Naposledy upravil(a) Kattnienika dne 21. listopad 2017 (7:49:57), celkem upraveno 1 x.

[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable