Pokročilý GIT

Agenda

  • Git Commits - tipy
  • Git Stash
  • Git Ignore
  • Git Attributes
  • Git Config
  • Git Cherry-pick
  • Git Apply
  • Git Submodules
  • Git Worktree
  • Git Bisect

Git Commits - Tipy

  • Commit shrnuje poslední změny
  • Neposílejte commity rozpracované práce do veřejných větví
  • Pište správně commit zprávy
    • používejte imperativ v předmětu zprávy
    • max 50 písmen, detailní informace jen pokud je to nutné
      • Příklad vhodné zprávy: CMA-5430: Add pulsar icon to the user section
      • Příklad nevhodné zprávy: Progress
      • Příklad nevhodné zprávy: Add tooltip, fix alignment, delete old config
  • Používejte větve
    • Větvení vám pomůže vyvarovat se míchání paralelních úrovní vývoje
  • Zachovávejte historii a dohledatelnost

Git Stash

  • Umožní vám uložit změny bez vytvoření commitu
  • git stash - "stashne" všechny trackované soubory
  • git stash -- #files - stashne dané soubory
  • git stash list - zobrazí všechny stashnuté změny
  • git stash apply - načte uložené změny
  • git stash apply stash@{1} - aplikuje daný stash
  • git stash push -m [message] - přidá ke stashi zprávu
  • git stash drop - zahodí stashnutý obsah
  • git stash pop - apply + drop
  • git stash save - uloží modifikovaný soubor

Git Ignore

  • .gitignore je soubor, který eviduje ignorované soubory
  • Každý glob pattern je ověřován relativně od adresáře, kde se nachází .gitignore soubor
  • Obsah:
    • dependency cache (node_modules)
    • zkompilovaný kód
    • výstupní adresář (bin, build)
    • skryté systémové soubory
    • osobní nastavení (IDE config, .env soubor)
  • Příklad: .gitignore pro C++
    1 # Prerequisites
    2 *.d
    3
    4 # Compiled Object files
    5 *.slo
    6 *.lo
    7 *.o
    8 *.obj
    9
    10 # Precompiled Headers
    11 *.gch
    12 *.pch
    13
    14 # Compiled Dynamic libraries
    15 *.so
    16 *.dylib
    17 *.dll
    18
    19 # Compiled Static libraries
    20 *.lai
    21 *.la
    22 *.a
    23 *.lib

Git Attributes

  • Obsahuje několik nastavení, například:
    • nastavení konce řádky
    • LFS nastavení
    • jak zacházet s binárními a textovými soubory
  • *.{bat, [bB][aA][tT]} text eol=crlf - vynutí použití CRLF, aby .bat soubory fungovaly ve Windows
  • *.sh text eol=lf - vynutí, aby bash skripty vždy používaly LF
  • *.blend binary - bude zacházet s blend soubory jako s binárními soubory
  • *.cs text diff=csharp - použije csharp modul pro zvýraznění cs souborů

.gitattributes příklad

1 ###############################################################################
2 # Set default behavior to automatically normalize line endings.
3 ###############################################################################
4 * text=auto
5 ###############################################################################
6 # Set default behavior for command prompt diff.
7 ###############################################################################
8 *.rs text diff=rust
9 ###############################################################################
10 # Set the merge driver for project and solution files
11 ###############################################################################
12 #*.sln merge=binary
13 #*.csproj merge=binary
14 ###############################################################################
15 # diff behavior for common document formats
16 # Don't forget to put the following in .git/config:
17 # [diff "zip"]
18 # textconv = unzip -c -a
19 ###############################################################################
20 *.docx diff=zip

Git Config

  • Obsahuje konfiguraci Gitu na globální i lokální úrovni
  • Můžeme k němu přistoupit přes git config [attributes]
  • git config --list - zobrazí oba configy
  • git config --global user.name "Dave Dangerous" - nastaví globálně jméno
  • git config --global user.email "dave@dangerous.com" - nastaví globálně e-mail
  • git config --global core.editor "nano -w"~ - nastaví nano jako defaultní git textový editor
  • Příklad: Local config
    1 [core]
    2 bare = false
    3 [remote "origin"]
    4 url = git@gitlab.com:mojo/dojo.git
    5 fetch = +refs/heads/*:refs/remotes/origin/*
    6 pushurl = git@gitlab.com:mojo/dojo.git
    7 [branch "myfeature"]
    8 remote = origin
    9 merge = refs/heads/myfeature
  • Nezapomeň nastavit
    globálně své
    jméno a e-mail!

Git Cherry-pick

  • git cherry-pick #commit
  • Vezme commit z jedné větve a aplikuje jej do jiné
  • Užitečné, když vytvoříme commit ve špatné větvi a rychle jej chceme přidat do té správné

Cherry-picker

Git Apply

  • Aplikuje patch diffu. Používá se společně s git diff > patchfile.patch příkazem

Git Submodules

  • Uchovává git repozitář jako podadresář jiného repozitáře
  • Umožňuje trasovat historii externího kódu
  • Příklady použití
    • externí komponenta se mění příliš často
    • máte komponentu, kterou chcete evidovat jako "vendor dependency"
    • delegujete část projektu na třetí stranu
  • Mapování je uchováváno v souboru .gitmodules
  • git submodule add [url] - převede podadresář do submodulu
  • Klonování projektu se submoduly:
    1. git clone /url/to/project
    2. git submodule init
    3. git submodule update

Git Worktree

  • Alternativa pro git stash
  • Vytvoří linkovanou kopii vašeho repozitáře v jiné složce
  • Můžete pracovat na vícero větvích zároveň
  • git worktree add ../myfeature - vytvoří nový worktree
  • git worktree list - zobrazí seznam worktrees
  • git worktree remove myfeature - odstraní worktree
  • Postup
    • Vytvořte worktree
    • Proveďte, co potřebujete
    • Vytvořte commit
    • Odstraňte váš worktree

Git Bisect

  • Provede binární vyhledávání mezi dvěma danými commity
  • Může se použít pro vyhledání místa prvního výskytu bugu
  • git bisect start - inicializuje bisect proces
  • git bisect good #hash - označí dobrý commit
  • git bisect bad #hash - označí špatný commit
  • git bisect good - označí aktuální commit jako dobrý
  • git bisect bad - označí aktuální commit jako špatný
  • git bisect reset - ukončí bisect proces
  • git bisect log - ukáže, co se doposud otestovalo
  • git bisect run #script - spustí testy
  • git bisect start #bad #good - zkratka

Git Bisect Příklad

Příklady

  • Chci vidět, jak vypadal soubor myfile.txt v předchozím commitu
1 git show HEAD~:myfile.txt

Příklady

  • Chci zkopírovat pár souborů z jiné větve do té aktuální
1 # Opt 1) for the whole repo
2 git merge otherbranch --no-commit --no-ff -X theirs
3 git reset currentbranch
4
5 # Opt 2)
6 git checkout otherbranch .

Příklady

  • Chci vidět, co se v souboru historicky změnilo
1 git whatchanged -p myfile.txt

Příklady

  • Chci si pullnout větev, která byla rebasnuta přímo na originu, aniž bych musel vytvořit merge
1 # Opt 1)
2 git fetch
3 git reset origin/master --hard
4
5 # Opt 2)
6 git pull --rebase

Příklady

  • Chci sloučit všechny commity od B do F do jednoho
1 git reset <commit A>
2 git add .
3 git commit -m "BCDEF"

Shrnutí

  • Commit shrnuje poslední změny
  • git stash umožní uložit změny bez vytvoření commitu
  • .gitignore je soubor, který eviduje ignorované soubory
  • .gitattributes může být použit pro konfiguraci znaků nové řádky
  • Git config obsahuje konfiguraci na globální i lokální úrovni
  • git cherry-pick vezme commit z dané větve a aplikuje jej do jiné větve
  • git apply aplikuje patch diffu
  • Git submodules uchovává git repozitář jako podadresář jiného repozitáře
  • git worktree vytvoří linkovanou kopii vašeho repozitáře v jiné složce
  • git bisect provede binární vyhledávání mezi dvěma danými commity