Git

Git je populární open-source systém pro správu verzí kódu.

Intro

https://ohmygit.org/

Instalace

Kromě toho je k dispozici mnoho GUI a rozšíření/pluginů pro IDE. My se však budeme držet příkazového rozhraní pro terminál – to je myslím nejlepší způsob, jak pochopit princip fungování.

Základní pojmy

Základní použití – získání existujícího projektu

Všechny další příkazy je potřeba spouštět uvnitř projektu, tedy v adresáři, který obsahuje .git/ (vznikne např. při klonování).

Workflow pro programátory

Synchronizace databáze se vzdáleným repozitářem:

Vytváření nových větví, přepínání mezi větvemi:

Konfigurace metadat (stačí provést jednou; --global aplikuje nastavení pro všechny projekty, uloží se v home adresáři daného uživatele; --local změní nastavení jen v daném projektu):

Přidávání změn:

NIKDY nepoužívejte příkazy git add . nebo git commit -a (git commit --all)!!! Vždy commitujte jen to, co opravdu chcete. Navíc commity by měly být systematicky rozdělené a rozumně „velké“.

Soubor .gitignore

Umožňuje ignorovat specifické soubory a adresáře, které nikdy nechceme commitovat. Takové soubory nebudou zobrazeny v git status a nebudou přidány do stage příkazem git add (pokud to explicitně nevynutíme).

Do gitu typicky nepatří:

Další pojmy

A spousta dalších, viz https://git-scm.com/docs/gitglossary

Merge a rebase

Mergetool

git mergetool poskytuje rozhraní mezi gitem a editorem pro řešení konfliktů. Git postupně otevírá editor se soubory, kde je třeba vyřešit konflikty. Pro každý soubor se otevře okno s typicky 4 verzemi (některá případně může chybět v závislosti na nastavení):

Podporované nástroje zobrazí příkaz git mergetool --tool-help.

VSCode/VSCodium

VSCode/VSCodium podporuje 3-way merge od verze 1.70. Konfigurace:

git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'

Poznámka: Pro VSCodium použijte codium místo code.

VSCode/VSCodium lze analogicky nastavit jako defaultní editor pro git (např. pro editování commit message):

git config --global core.editor 'code --wait'

A také jako diff tool:

git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'

WinMerge

Jednoduchý nástroj pro Windows je např. WinMerge. Konfigurace:

  1. git config --global merge.tool winmerge
  2. git config --global mergetool.winmerge.path "C:/Users/klinkjak/AppData/Local/Programs/WinMerge/WinMergeU.exe" (cestu je třeba příslušně upravit)

Testovací repozitář, kde si lze vyzkoušet řešení konfliktů: https://github.com/redguardtoo/test-git-mergetool

Hledání chyb v kódu pomocí binárního vyhledávání

Ukážeme si git bisect – nástroj pro hledání commitů v historii pomocí metody bisekce (půlení intervalu). Hodí se např. pro identifikaci commitů, které způsobily nějakou chybu.

Na začátku musí být pracovní adresář čistý – zkontrolujte pomocí git status.

  1. git bisect start – spustí bisekci
  2. git bisect bad – označí aktuální commit (HEAD) jako špatný
  3. git bisect good <some-commit-id> – označí nějaký předchozí commit jako dobrý

Dále git iterativně přepíná stav souborů v pracovním adresáři podle commitů, které je třeba zkontrolovat. Po každém kroku je třeba označit daný commit jako špatný (git commit bad) nebo dobrý (git commit good).

V průběhu je možné sledovat stav bisekce pomocí příkazů git bisect visualize a git bisect log.

Na konci by měl algoritmus skončit ve stavu prvního špatného commitu. Příkaz git bisect reset vrátí stav na začátek (commit před spuštěním git bisect start).

Odkazy

Rebase:

Workflow, best practices:

Cheat Sheet:

Git Cheat Sheet