9. Git

Git

Na tomto cvičení se naučíte pracovat s verzovacím nástrojem Git, který vám umožňuje ukládat historii změn v projektu a změny sdílet. Na cvičení budeme potřebovat nástroje git a gitk.

Instalace git a gitk

https://git-scm.com/install/

  • Debian/Ubuntu: apt install git gitk
  • macOS: brew install git git-gui
  • Windows: winget install Git.Git, případně stáhněte z oficiálních stránek.
    • Základní distribuce Gitu pro Windows již obsahuje gitk.

Úvodní nastavení

Než začnete Git používat, je vhodné nastavit jméno a e-mail, pod kterým budete vytvářet změny:

  • git config --global user.email <username>@student.cvut.cz
  • git config --global user.name "<jmeno> <prijmeni>"

Také nastavte výchozí název hlavní větve a automatické nastavování remotes (vysvětlíme později):

  • git config --global init.defaultBranch main
  • git config --global push.autoSetupRemote true

Nastavte si pro jistotu také defaultní editor dle preference (může se stát, že se Vám bude otevírat defaultně vi/vim).

  • git config --global core.editor "nano"

Ukládání změn

Git ukládá historii pomocí tzv. commitů – záznamů o stavu souborů ve složce v momentě, kdy byl commit vytvořen. Commity vytváříte manuálně, typicky pokaždé když dokončíte práci na nějaké části projektu.


  1. Vytvořte v aktuální složce nový repozitář:
    • git init
  2. Ověřte, že zatím nemáte žádné neuložené změny:
    • git status
  3. Vytvořte nový Python script main.py, který obsahuje hello world. Zkontrolujte stav repozitáře:
    • git status
    • git diff
  4. Vytvořte první commit obsahující soubor main.py:
    • git add main.py
    • git commit -m "Add hello world"
    • git status
  5. Nyní vytvořte druhý modul greet.py, ktery obsahuje funkci greet, která bere jako parametr jméno, a vypíše Hello, {name}. Upravte main.py, aby tuto funkci zavolal s libovolným argumentem.
  6. Zkuste nyní main.py spustit, následně uložte změny v obou souborech do druhého commitu.
    • Povšimněte si, že v git status se vám ukazuje složka __pycache__, kterou ale nechcete do Gitu ukládat.
  7. Vytvořte soubor .gitignore, kde složku pro Git "skryjete" (__pycache__/) a ten uložte do dalšího commitu. Ověřte, že git status již nehlásí žadné změny.

Zobrazení a vracení historie

  1. Zobrazte si historii commitů, nejdříve v terminálu a pak pomocí nástroje gitk:
    • git log
    • git show HEAD
    • git show HEAD~
    • gitk
  2. Zkuste upravit jméno předávané v main.py a následně soubor obnovit do poslední uložené verze:
    • git restore main.py
  3. Je možné se vrátit i ke starší verzi:
    • git restore -s HEAD~~ main.py
    • Změny ovlivňují pouze aktuální verzi souboru, nemění historii.

Sdílení projektu

Často chcete projekt zveřejnit, nebo na projektu pracovat z více počítačů. K tomu se vám bude hodit koncept Git "remotes" – vzdálených kopii Git repozitáře, kam můžete nahrávat změny z vašeho lokálního repozitáře a naopak stahovat změny nahrané odjinud.

Možností, kde kopie mít je více, důležité je jen to, abyste se k nim dokázali dostat odkudkoliv – např. složka na SSH serveru postel.felk.cvut.cz. Častější ale býva využití dedikované platformy pro práci s Git repozitáři – GitHub, GitLab, Codeberg a další. To si nyní vyzkoušíte.


  1. Vytvořte si nový repozitář na školním gitlabu na adrese https://gitlab.fel.cvut.cz.
  2. Nastavte si SSH klíč, pomocí kterého se budete k vzdálenému repozitáři připojovat.
    • Váš profil (vlevo nahoře) -> Preferences -> SSH Keys.
    • Pokud klíč nemáte z minulého cvičení, vygenerujte přes ssh-keygen -t ed25519.
    • Veřejný klíč si můžete vypsat třeba pomocí cat ~/.ssh/id_ed25519.pub (type %USERPROFILE%\.ssh\id_ed25519.pub v cmd na Windows), následně ho přidejte do GitLabu.
  3. Nyní si zkopírujte SSH adresu GitLab repozitáře (Code -> Clone with ssh-keygen) v už vytvořeném lokálním repozitáři nastavte nové přidaný GitLab repozitář jako remote:
    • git remote add origin <ssh-address>
    • Ověřte přes git remote -v.
  4. Nahrajte historii vašeho lokálního repozitáře na GitLab:
    • git push
  5. "Naklonujte" si GitLab repozitář do nové složky mimo původní lokální repozitář:
    • git clone <ssh-address> <nazev-slozky>
    • Tento příkaz efektivně vytvoří novou složku, v té zavolá git init, nastaví zadaný remote a pomocí git pull (viz níže) stáhne změny.
    • Nyní máte 3 nezávislé kopie repozitáře: původní lokální repozitář, online repozitář v GitLabu a druhou lokální kopii
  6. V novém repozitáři změňte některý ze souborů a změnu commitněte.
  7. Nahrajte nový commit do GitLab repozitáře:
    • git push
  8. V původním lokálním repozitáři změna ještě není viditelná, musíte jí explicitně stáhnout:
    • git pull
  9. Nyní zkuste v původním repozitáři udělat další změnu, tu commitněte, pushnete na GitLab a stáhněte v druhém lokálním repozitáři.