Manuál: Git

V praxi najpoužívanejší nástroj na spravovanie kódu a v rámci predmetu ho budeme používať na odovzdávanie domácich úloh.

Používa sa, pretože:

  • umožňuje spoluprácu viacerých ľudí alebo prácu na viacerých počítačoch naraz

  • je menšie riziko, že kód stratíme, lebo kópia repozitára môže byť aj na serveri

  • môžeme sa vrátiť k všetkým verziám kódu, porovnávať ich a tak napr. nájsť chybu

Repozitáre spravujeme cez webové rozhranie fakultného GitLabu.

Zadávanie hesla pri príkazoch je možné nahradiť SSH kľúčmi.

Zverejnenie repozitára pb071 s domácimi úlohami alebo pridanie iných členov do repozitára ako v inštrukciách je proti pravidlám a prísne sa trestá.

.gitignore

Súbor, ktorý gitu povie, ktoré súbory nemá verzovať — aby sme do repozitára nezaniesli súbory, ktoré sú nežiaduce: zostatky z kompilácie, dočasné súbory IDE a iné. Tieto súbory potom neukazuje ani git status. Podrobný popis v oficiálnej dokumentácii.

Do repozitára vložíme .gitignore vhodný pre náš predmet. Ak sa nachádzame v repozitári v termináli je to tiež možné príkazom:

wget https://www.fi.muni.cz/pb071/man/for-students/gitignore -O .gitignore
git add .gitignore
git commit -m 'Add .gitignore'
Veľkosť repozitára kontroluje Kontr pri odovzdávaní úloh. Po prekročení limitu úlohu odovzdať nepôjde a za nové založenie repozitára sa strhávajú body! Preto je .gitignore dôležitý.

.gitlab-ci.yml

Tento súbor všeobecne popisuje úlohy, ktoré má GitLab urobiť, keď nastanú nejaké udalosti (napr. vznikne commit, merge request, …). Súbor .gitlab-ci.yml pripravený pre tento predmet spustí v adresároch, kde sa zmenili nejaké súbory, priložené testy. Nie je síce povinný, ale dovolí nám pohodlnejšie overiť, že naše riešenie funguje voči našim testom, kým ho vyskúšame na Aise alebo v odovzdaní nanečisto. Na testoch navyše spúšta aj nástroj valgrind.

Súbor do repozitára vložíme v termináli príkazom:

wget https://www.fi.muni.cz/pb071/man/for-students/gitlab-ci.yml -O .gitlab-ci.yml
git add .gitlab-ci.yml
git commit -m 'Add .gitlab-ci.yml'
Stále však platí, že pred odovzdaním naostro je vhodné si vyskúšať kompiláciu na Aise a odovzdanie nanečisto. Prostredie v GitLab CI je trochu odlišné, než to na Aise, a testy v ňom nemusia odhaliť všetky chyby.

Základné príkazy

git clone <repository_url>

vytvorí lokálnu kópiu repozitára do nového adresára

git pull
git pull --rebase

aktualizuje lokálny repozitár: stiahne zo vzdialeného repozitára všetky zmeny a pokúsi sa ich aplikovať
s parametrom --rebase pomôže vyriešiť konflikty, napríklad ak spravíme commit na neaktuálnom repozitári

git push

aktualizuje vzdialený repozitár: pokúsi sa naše zmeny odoslať do vzdialeného repozitára

git status

  • zobrazí aktuálnu vetvu

  • vypíše súbory, u ktorých nesledujeme zmeny (untracked)

  • súbory, v ktorých sme spravili zmeny, ale nepatria do nasledujúceho commitu (not staged for commit)

  • súbory, ktorých zmeny sme zaradili do ďalšieho commitu (staged)

git add <files>

zaradí súbory so zmenou do ďalšieho commitu (označí ich staged)

git commit -m "<message>"

zo zmien označených ako staged vytvorí novú verziu repozitára

Bežný postup

  1. aktualizovanie lokálneho repozitára, stiahneme zmeny z GitLabu: git pull

  2. programujeme

  3. zobrazíme si zmeny: git status

  4. zahrnieme súbory do commitu: git add

  5. znova git status, skontrolujeme, či do commitu patria len správne súbory

  6. vytvoríme commit: git commit -m "<message>"

  7. aktualizujeme repozitár na GitLabe, zverejníme zmeny: git push

    1. prvýkrát potrebné povedať kam: git push -u origin main

  8. skontrolujeme, či sú správne zmeny naozaj na GitLabe a prípadne odovzdáme úlohu

Ak sme pracovali stále na rovnakom počítači, môžeme vynechať kroky, ktoré majú za cieľ synchronizovať náš lokálny repozitár so vzdialeným, teda pull a push.

Väčšina IDE nám umožní git ovládať priamo z GUI, teda bez písania príkazov.