Martin Havel Software engineer HAVIT s r o

















































![Úvodní nastavení git config [--global] user. name "Martin Havel" git config [--global] user. email Úvodní nastavení git config [--global] user. name "Martin Havel" git config [--global] user. email](https://slidetodoc.com/presentation_image/4f2b5d4a5f6f39c173849f36eed5b0fe/image-50.jpg)







































































![git blame [-M|-C] • Kdo změnil (přesunul/zkopíroval) jaký řádek – C – dohledává zkopírované git blame [-M|-C] • Kdo změnil (přesunul/zkopíroval) jaký řádek – C – dohledává zkopírované](https://slidetodoc.com/presentation_image/4f2b5d4a5f6f39c173849f36eed5b0fe/image-122.jpg)






- Slides: 128
Martin Havel Software engineer, HAVIT, s. r. o. havel@havit. cz GIT skrz naskrz 1
Motto Kdo říká, že umí s gitem, tak kecá. 2
Co nás dnes čeká? • • • Filozofie a ovládání GITu Základní příkazy GITu Jak GIT funguje Pokročilejší techniky Řešení problémů Co se nevešlo 3
Co je to GIT? 4
git je populární verzovací systém • https: //insights. stackoverflow. com/survey/2018/ 5
Co je to GIT? • „The stupid content tracker“ • Vytvořený Linusem Torvaldsem pro vývoj jádra Linuxu – Po odchodu od Bit. Keeperu • Vyvíjen od roku 2005 dodnes – V poslední době se přidal i Microsoft • Základní vlastnosti – – Rychlý Bezpečný Jednoduché větvení Jednoduché slučování 6
Hlavně distribuovaný • Každý má lokálně svoji kopii repozitáře 7
Git přímo neřeší oprávnění Oprávnění se řeší na úrovni protokolu. 8
Ovládání GITu 9
Příkazový řádek • Windows – Cmd – Linuxový bash • Linux – bash 10
Rozdíly Linux (Unix like) vs Windows Linux Windows Seznam souborů ls dir Mazání rm del Obsah souboru cat type Linux Windows Oddělovač adresářů / Řetězce “, ', escape " • Rozdílné chování klávesy TAB – (git bash) 11
Bohatá dokumentace • • • „Man“ pages (git help <příkaz>) Stručný návod (git <příkaz> -h) Návody na https: //git-scm. com Návodné texty u příkazů Hledat „git-příkaz“ A když selžou všechny možnosti, je tu vždy https: //stackoverflow. com/ 12
Git dělí příkazy na dvě úrovně 13
Low-level commands (plumbing) git-apply git-hash-object git-mailinfo git-read-tree git-update-ref git-update-servergit-cat-file git-http-backend git-mailsplit git-receive-pack info git-column git-http-fetch git-merge-base git-rev-list git-commit-tree git-http-push git-merge-file git-send-pack git-upload-archive git-upload-pack git-credential git-check-attr git-merge-index git-shell git-var git-credential-cache git-check-ignore git-merge-one-file git-sh-i 18 n git-credential-store git-check-mailmap git-mktag git-show-index git-verify-pack git-daemon git-checkout-index git-mktree git-show-ref git-write-tree git-diff-files git-check-ref-format git-name-rev git-sh-setup git-diff-index git-index-pack git-pack-objects git-stripspace git-diff-tree git-interpret-trailers git-pack-redundant git-symbolic-ref git-fetch-pack git-ls-files git-parse-remote git-unpack-file git-fmt-merge-msg git-ls-remote git-patch-id git-unpack-objects git-for-each-ref git-ls-tree git-prune-packed git-update-index 14
Low-level commands (plumbing) git-apply git-hash-object git-mailinfo git-read-tree git-update-ref git-update-servergit-cat-file git-http-backend git-mailsplit git-receive-pack info git-column git-http-fetch git-merge-base git-rev-list git-commit-tree git-http-push git-merge-file git-send-pack git-upload-archive git-upload-pack git-credential git-check-attr git-merge-index git-shell git-var git-credential-cache git-check-ignore git-merge-one-file git-sh-i 18 n git-credential-store git-check-mailmap git-mktag git-show-index git-verify-pack git-daemon git-checkout-index git-mktree git-show-ref git-write-tree git-diff-files git-check-ref-format git-name-rev git-sh-setup git-diff-index git-index-pack git-pack-objects git-stripspace git-diff-tree git-interpret-trailers git-pack-redundant git-symbolic-ref git-fetch-pack git-ls-files git-parse-remote git-unpack-file git-fmt-merge-msg git-ls-remote git-patch-id git-unpack-objects git-for-each-ref git-ls-tree git-prune-packed git-update-index 15
High-level commands (porcelain) git-add git-am git-annotate git-archimport git-archive git-bisect git-blame git-branch git-bundle git-citool git-clean git-clone git-commit git-config git-count-objects git-cvsexportcommit git-cvsimport git-cvsserver git-describe git-difftool git-fast-export git-fast-import git-fetch git-filter-branch git-format-patch git-fsck git-gc git-get-tar-commit-id git-grep git-gui git-help git-checkout git-cherry-pick git-imap-send git-init git-instaweb gitk git-log git-mergetool git-merge-tree git-mv git-notes git-p 4 git-pack-refs git-prune git-pull git-push git-quiltimport git-rebase git-reflog git-relink git-remote git-repack git-replace git-request-pull git-rerere git-reset git-revert git-rev-parse git-rm git-send-email git-shortlog git-show-branch git-stash git-status git-submodule git-svn git-tag git-verify-commit git-verify-tag gitweb git-whatchanged git-worktree 16
High-level commands (porcelain) git-add git-am git-annotate git-archimport git-archive git-bisect git-blame git-branch git-bundle git-citool git-clean git-clone git-commit git-config git-count-objects git-cvsexportcommit git-cvsimport git-cvsserver git-describe git-difftool git-fast-export git-fast-import git-fetch git-filter-branch git-format-patch git-fsck git-gc git-get-tar-commit-id git-grep git-gui git-help git-checkout git-cherry-pick git-imap-send git-init git-instaweb gitk git-log git-mergetool git-merge-tree git-mv git-notes git-p 4 git-pack-refs git-prune git-pull git-push git-quiltimport git-rebase git-reflog git-relink git-remote git-repack git-replace git-request-pull git-rerere git-reset git-revert git-rev-parse git-rm git-send-email git-shortlog git-show-branch git-stash git-status git-submodule git-svn git-tag git-verify-commit git-verify-tag gitweb git-whatchanged git-worktree 17
High-level commands (porcelain) – běžné workflow git-add git-am git-annotate git-archimport git-archive git-bisect git-blame git-branch git-bundle git-citool git-clean git-clone git-commit git-config git-count-objects git-cvsexportcommit git-cvsimport git-cvsserver git-describe git-difftool git-fast-export git-fast-import git-fetch git-filter-branch git-format-patch git-fsck git-gc git-get-tar-commit-id git-grep git-gui git-help git-checkout git-cherry-pick git-imap-send git-init git-instaweb gitk git-log git-mergetool git-merge-tree git-mv git-notes git-p 4 git-pack-refs git-prune git-pull git-push git-quiltimport git-rebase git-reflog git-relink git-remote git-repack git-replace git-request-pull git-rerere git-reset git-revert git-rev-parse git-rm git-send-email git-shortlog git-show-branch git-stash git-status git-submodule git-svn git-tag git-verify-commit git-verify-tag gitweb git-whatchanged git-worktree 18
High-level commands (porcelain) – běžné workflow git-add git-am git-annotate git-archimport git-archive git-bisect git-blame git-branch git-bundle git-citool git-clean git-clone git-commit git-config git-count-objects git-cvsexportcommit git-cvsimport git-cvsserver git-describe git-difftool git-fast-export git-fast-import git-fetch git-filter-branch git-format-patch git-fsck git-gc git-get-tar-commit-id git-grep git-gui git-help git-checkout git-cherry-pick git-imap-send git-init git-instaweb gitk git-log git-mergetool git-merge-tree git-mv git-notes git-p 4 git-pack-refs git-prune git-pull git-push git-quiltimport git-rebase git-reflog git-relink git-remote git-repack git-replace git-request-pull git-rerere git-reset git-revert git-rev-parse git-rm git-send-email git-shortlog git-show-branch git-stash git-status git-submodule git-svn git-tag git-verify-commit git-verify-tag gitweb git-whatchanged git-worktree 19
GUI pro Windows 20
GUI pro Windows 21
Základní příkazy 22
Inicializace lokálního repozitáře • Inicializace prázdného repozitáře – git init • Napojení na vzdálený server – git clone <url> 23
Inicializace lokálního repozitáře • Inicializace prázdného repozitáře – git init • Napojení na vzdálený server – git clone <url> • Napojení exitujícího repozitáře – git remote add <shortname> <url> 24
stash workspace stash list status Local repository Stage / index Remote repository log commit -a * add commit push stash pop pull stash apply <s> checkout HEAD fetch stash drop <s> checkout reset HEAD stash reset (--hard | --merge) diff --staged diff (HEAD | <složka>) 25
Poznámky • • • Přejmenování se projeví až při vložení do stage/indexu Větve se obnovují do stejného adresáře (standardně) Pull standardně provádí merge (lze přenastavit) GIT porovnává soubory po řádcích GIT je case sensitive 26
Parametry příkazů • Buď – git commit --all --message "text commitu" • nebo – git commit -a -m "text commitu" • lze také zadat – git commit -am "text commitu" • ale ne – git commit -ma "text commitu" • Proč? 27
Jak GIT funguje 28
4 úrovně • • Distributed revision control system Revision control system Simple Content tracker Persistent map - dictionary 29
Persistent map SHA 1 - object 30
d 918213016973 bb 72 bc 3716239 ea 73445291208 Hash SHA 1 „A“ d 35 a 7 fdf 2328 b 06500 f 59616 f 2 af 47 f 1 f 1302 a 4 f 4 fb 40 e 328277 c 9032117 b 9 d 838 b 621 f 60054 a 0 e 5 • vytváří otisk dlouhý 160 bitů – 40 hexadecimálních čísel či 40 znaků (0123456789 abcdef) 1 461 501 637 330 902 918 203 684 832 716 283 019 655 932 542 976 (1048) možností 31
git bash DEMO 32
Simple Content tracker 33
Interní ukládání • Všechno v souborovém systému, hlavně v textové podobě – Adresář. git • Pouze 4 typy objektů – – Blob Tree Commit Tag 34
DEMO 35
Struktura Tag Commit Tree Blob d 918213 git happens c 9 baa 33 tree d 2837 a 1 author Havel… committer Havel… First commit d 2837 a 1 100644 blob d 918213 slogan. txt * Všechny SHA-1 byly zkráceny 36
Revision control system 37
Ostatní systémy – ukládání změn 38
GIT – ukládání snímků v čase 39
DEMO 40
Struktura Tag tag 2 2354 dad object 650987 b type commit tag 2 tagger Havel… message for tag 2 Commit 650987 b tree 576 d 2360 parent 47 e 12 a 0 author Havel… committer Havel… Blob 576 d 2360 100644 blob d 918213 040000 tree d 10 dfea 93 cc 36 d 10 dfea 100644 blob 93 cc 36 new slogan. txt 100644 blob d 918213 old slogan. txt 47 e 12 a 0 tree 8 f 16200 parent c 9 baa 33 author Havel… committer Havel… slogan. txt texty git is the best Third commit Second commit tag 1 Tree 8 f 16200 040000 tree d 10 dfea texty d 918213 git happens c 9 baa 33 tree d 2837 a 1 author Havel… committer Havel… First commit d 2837 a 1 100644 blob d 918213 slogan. txt * Všechny SHA-1 byly zkráceny 41
Distributed revision control system 42
Reference • • HEAD – stav workspace master (<branch>) – hlavní větev origin/master (<remote>/<branch>) – vzdálená větev Kromě HEAD jsou to všechno jen konvence 43
Reference https: //learngitbranching. js. org/ DEMO 44
git tag • Reference jako ostatní • Nemění se s komity TA G 45
Práce s tagem • Přidání tagu – git tag <tagname> - jednoduchý tag – git tag -a -m <message> <tagname> - anotovaný tag • Smazání tagu – git tag -d <tagname> • Zobrazení seznamu tagů – git tag -l 46
tag https: //learngitbranching. js. org/ DEMO 47
Konfigurace a nastavení 48
Nastavení • 3 úrovně – System (/etc/gitconfig) – pro všechny uživatele společný – Global (~/. gitconfig) – uživatelské nastavení – Local (. git/config) – nastavení repozitáře 49
Úvodní nastavení git config [--global] user. name "Martin Havel" git config [--global] user. email havel@havit. cz Obsah souboru. gitconfig [user] name = Havel, Martin email = havel@havit. cz 50
Nastavení git config --global core. editor notepad git config --global alias. logf "git log --oneline --graph" set LC_ALL=C. UTF-8 51
Nastavení konců řádků Windows vs Linux CRLF vs LF • Nastavení core. autocrlf – (true, false, input) Autor: Nightflyer, CC BY-SA 3. 0, https: //commons. wikimedia. org/w/index. php? curid=8923219 52
Soubor. gitattributes • • • text=auto *. bmp binary *. cs text diff=csharp *. csproj text merge=union *. sln text eol=crlf merge=union 53
Merge git merge <zdroj> -Xrenormalize git merge <zdroj> -Xignore-space-at-eol 54
Soubor. gitignore • Složky bin/ obj/ • Typy souborů *. 7 z *. log • Case sensitive [Bb]in [Oo]bj [Tt]est[Rr]esults • Všechny soubory v adresáři rekurzivně. vs/**/* 55
(Mírně) Pokročilejší techniky 56
Větvení • Vytvoření větve (název musí být bez mezer) – git branch <větev> – git checkout <větev> • Alternativa – git checkout -b <větev> • Commit jako obvykle • Smazání – git branch –d <větev> 57
Větvení https: //learngitbranching. js. org/ DEMO 58
git merge (výchozí stav) Převzato z https: //git-scm. com/book 59
git merge (průběh) Převzato z https: //git-scm. com/book 60
git merge (konečný stav) Převzato z https: //git-scm. com/book 61
3 cestné slučování Společný komit master feature Výsledek 62
3 cestné slučování Společný komit master feature Jedna Výsledek 63
3 cestné slučování Společný komit master feature Jedna Výsledek 64
3 cestné slučování Společný komit master feature Výsledek Jedna 65
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl 66
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl 67
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl 68
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl 69
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl Tři a tři čtvrtě Tři 70
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl Tři a tři čtvrtě Tři 71
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl Tři Tři a tři čtvrtě 72
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl Tři Tři a tři čtvrtě Čtyřicet jedna Čtyřicet dva 73
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl Tři Tři a tři čtvrtě Čtyřicet jedna Čtyřicet dva 74
3 cestné slučování Společný komit master feature Výsledek Jedna Dva Dva a půl Tři Tři a tři čtvrtě Čtyřicet jedna Čtyřicet dva Konflikt 75
https: //learngitbranching. js. org/ DEMO 76
Vyřešení konfliktů • Ručně – Upravit soubor – Přijmout příkazem add • git nehlídá obsah souboru • Nástrojem 77
git mergetool • git mergetool --tool-help • git mergetool --tool=p 4 merge 78
CMD DEMO 79
Další příklad git merge Převzato z https: //git-scm. com/book 80
git merge --ff (fast-forward) Převzato z https: //git-scm. com/book 81
git merge --no-ff (no fast-forward) Převzato z https: //git-scm. com/book 82
git merge fast forward https: //learngitbranching. js. org DEMO 83
git merge vs rebase Převzato z https: //git-scm. com/book 84
git merge vs rebase merge rebase Převzato z https: //git-scm. com/book 85
git rebase x git merge x git cherry-pick https: //learngitbranching. js. org DEMO 86
adresace komitů • Absolutně – Identifikátory (SHA 1) – reference – tagy • Relativně – kommity nadřazené absolutnímu 87
Rozdíl mezi ~ a ^ HEAD~2 ~ ^ HEAD^^ HEAD~ HEAD^^2 HEAD^ * HEAD^2^ HEAD^2 HEAD * Nefunguje pod Windows, použít „HEAD^“ 88
git log a git diff 89
git add - -patch • Vybírá se, jaká část souboru se vloží do stashe / indexu 90
git add patch, log, diff DEMO 91
Adresace intervalu Nejdříve pro git log (výběr více komitů) 92
Výběr komitů F A B G H I C D E F J K L M 93
Výběr více komitů F I A B G H I C D E F J K L M 94
Vyloučení komitů ^D F A B G H I C D E F J K L M 95
Vyloučení komitů ^I F A B G H I C D E F J K L M 96
Lze libovolně kombinovat ^F H L A B G H I C D E F J K L M 97
Interval B. . F = ^B F A B G H I C D E F J K L M 98
Interval M. . F=^M F A B G H I C D E F J K L M 99
Když to napíšu opačně F. . M = ^F M A B G H I C D E F J K L M 100
Tři tečky F…I = I…F A B G H I C D E F J K L M 101
Adresace intervalu A nyní pro diff (výběr dvou komitů) 102
Jednoduchý výběr F I = F. . I A B G H I C D E F J K L M 103
Tři tečky pro diff F…I A B G H I C D E F J K L M 104
Tři tečky pro diff I…F A B G H I C D E F J K L M 105
Další pokročilé techniky Řešení problémů 106
git push --force 107
git push --force http: //git-school. github. io/visualizing-git/ DEMO 108
git commit - -amend • Přepíše poslední komit – Mění popis – Přidává, nebo mění soubor • Pomocí git add – Odebírání souboru • git rm --cached <soubor> 109
git commit --amend DEMO 110
git reset x git checkout x git revert • Reset – Vrátí zpět referenci • Checkout – Přesune HEAD • Revert – Vytvoří opačný komit 111
reset x checkout x revert DEMO 112
git reset / checkout na komitu HEAD Index Workdir reset --soft move with reference reset [--mixed] move with reference reset --hard move with reference reset checkout move only reset if not changed 113
git reset / checkout na souboru HEAD Index reset file checkout reset file Workdir reset file 114
Detached HEAD • Změní se příkazem – git checkout <komit> • A vrátíme se příkazem – git checkout [master|HEAD|<branch>] 115
Detached head https: //learngitbranching. js. org/ DEMO 116
git rebase interactive • • • Slučování komitů Rozdělování komitů Přehazování pořadí Změna popisu Úpravu komitů 117
Rebase interactive DEMO 118
git clean • git clean – f –d –x force remove whole directories remove ignored files, too 119
Co je pouze lokálně • • hooks reflog Branches – standardně se neposílají na server tags – standardně se neposílají na server unreferenced commits – časem se ztratí stashed work – je pouze lokálně git notes – poznámky ke komitům 120
Čestná zmínka 121
git blame [-M|-C] • Kdo změnil (přesunul/zkopíroval) jaký řádek – C – dohledává zkopírované řádky – M – dohledává přesunuté řádky Image courtesy of Ambro/Free. Digital. Photos. net 122
Submodules • Přidání submodulu – git submodule add <repository> • Inicializace submodulu (potřebná před aktualizací) – git submodule init • Aktualizace submodulu – git submodule update 123
git rerere • Reuse recorded resolution of conflicted merges 124
git bisect • Hledání chyby metodou půlení intervalu 125
git filter-branch • • Švýcarský nůž Ohromně mocný Ohromně nebezpečný Příklady – git filter-branch --tree-filter 'rm <filename>' HEAD – git filter-branch -f --msg-filter "sed 's/^git-tfs-id: . *; C([0 -9]*)$/Changeset: 1/g'" -- --all 126
Pull request • Práce se odešle ke schválení • Po schválení se integruje do vývojové větve 127
Slovo na závěr? Používejte GIT. 128