academy vol.13
TRANSCRIPT
GitSvätý Grál kolektívnej práce
Čo je to Git?
https://git-scm.com
Definícia
Git nie je GitHub!
Git je DVCS - Distributed Version Control System
Klienti si nesťahujú iba posledné zmeny, ale lokálne disponujú kompletnou verziou repozitára - klonom.
Je decentralizovaný
Čo
je to
Git?
3 hlavné stavy
committed, modified, staged
Committed znamená, že data sú bezpečne uložené v tvojej lokálnej databáze.
Modified znamená, že si zmenil súbor, ale recommittal si ho do svojej databázy.
Staged znamená, že si označil zmenený subor v jeho aktuálnej verzii, aby bol zahrnutý v najbližšom commite.
Čo
je to
Git?
Čo
je to
Git?
The Git directory is where Git stores the metadata and object database for your project. This is the most important part of Git, and it is what is copied when you clone a repository from another computer.
The working directory is a single checkout of one version of the project. These files are pulled out of the compressed database in the Git directory and placed on disk for you to use or modify.
The staging area is a file, generally contained in your Git directory, that stores information about what will go into your next commit. It’s sometimes referred to as the “index”, but it’s also common to refer to
it as the staging area.
Čo
je to
Git?
Nastavenie Git-u
Základy3 úrovne nastavení:
1. systémová
2. globálna
3. lokálna
Pre zmenu nastavenia sa používa nástroj “gitconfig”
systémová konfigurácia - /etc/gitconfig
globálna konfigurácia - ~/.gitconfig
lokálna konfigurácia - .git/config
Nas
tave
nie
Git-
u
git config
git config --global user.name “Moje Meno”
git config --global user.email [email protected]
git config --global core.editor nano
git config --list
git config user.email
Nas
tave
nie
Git-
u
Nas
tave
nie
Git-
u
Práca s Git-om
Získanie repozitára
Využívame 2 základné prístupy
1. Založenie nového repozitára v existujúcom priečinku
2. Naklonovanie vzdialeného repozitára
Prác
a s G
it-om
git init
cd ~/project_directory
git init
Založenie nového repozitára v existujúcom priečinku
Prác
a s G
it-om
git clone
git clone https://bitbucket.org/semisedlak/test
git clone https://bitbucket.org/semisedlak/test project_dir
Naklonovanie vzdialeného repozitára
Prác
a s G
it-om
Získavanie informácií
git status
git log -2
git diff
git diff --staged
git diff --cached
Prác
a s G
it-om
git diff --cachedPr
áca
s Git-
om
Git remotes
Remotes?
Remotes - vzdialené repozitáre sú verzie projektu hosťované niekde v sieti alebo na internete.
Je možné ich mať priradených k projektu viac.
Pri naklonovaní repozitára sa automaticky priradí zdroju remote s menom origin - pôvod/počiatok
Git
rem
otes
git remote
git remote
git remote add {shortname} {url}
git remote rename {old_shortname} {new_shortname}
git remote rm {shortname}
Git
rem
otes
git fetch
git fetch {remote-name}
Príkaz stiahne všetky dáta zo vzdialeného repozitára, ktoré ešte nie sú stiahnuté. Po tomto príkaze má programátor referencie na všetky
vetvy z daného repozitára, s ktorými môže ďalej pracovať.
Git
rem
otes
Práca so súbormi
Životný cyklus súborov repozitára
Prác
a so
súbo
rmi
git add
git add {file}
git add .Prác
a so
súbo
rmi
git commit
git commit
git commit -m “…”
git commit -a -m “…”
git commit --ammend
Prác
a so
súbo
rmi
git mv
git mv {old_file} {new_file}
Prác
a so
súbo
rmi
git rm
git rm {file}
git rm --cached {file}Prác
a so
súbo
rmi
git checkout
git checkout -- {file}
git checkout {branch}Prác
a so
súbo
rmi
git push
git push {remote} {branch}
Prác
a so
súbo
rmi
git pull
git pull
git pull {remote}
git pull {remote} {branch}
Prác
a so
súbo
rmi
Resetovanie
S čím git pracuje
Pre mentálne poňatie si predstavte Git ako content manager pre tri rôzne stromy. Pod pojmom “strom” si treba v skutočnosti predstaviť “kolekciu súborov”.
1. HEAD
2. Index
3. Working directory
Rese
tova
nie
HEAD
HEAD je ukazovateľ na referenciu aktuálnej vetvy, čo je vlastne ukazovateľ na posledný commit vytvorený v tejto vetve. To znamená, že HEAD bude rodič ďalšieho commitu, ktorý bude vytvorený. Najjednoduchšie je rozmýšľať nad HEAD-om, ako nad snapshotom posledného commitu.
Rese
tova
nie
Index
Index návrh tvojho budúceho commitu - teda “Staging Area”.Rese
tova
nie
Working directory
Predchádzajúce dva stromy ukladajú svoj obsah vo vnútri .git priečinka efektívym spôsobom. Working Directory ich “rozbaľuje” do normálnych súborov (tie, s ktorými pracuješ). Working Directory je pieskovisko, kde si môžeš vyskúšať zmeny predtým, ako ich commitneš do “staging area” a následne do histórie.
Rese
tova
nie
WorkflowRe
seto
vani
e
Predstavte si, že……sme súbor zmenili 3x.Re
seto
vani
e
Rese
tova
nie
Rese
tova
nie
Rese
tova
nie
Rese
tova
nie
.gitignore
Na čo slúži?
Slúži na definovanie množiny súborov, ktoré nebudú verzované
Väčšinou pre generované temp a log súbory (napr. editorom či OS)
Súbory sa definujú regulárnymi výrazmi
https://github.com/github/gitignore
.giti
gnor
e
Príklad #1
# ignoruj súbory s názvom Thumbs.db
Thumbs.db
# ignoruj .jpg súbory
*.jpg
# ale sleduj logo.jpg, aj keď .jpg sú ignorované patternom vyššie
!logo.jpg
.giti
gnor
e
Príklad #2
# ignoruj včetky priečinky a súbory TEST (aj v podpriečinkoch)
TEST
# ignoruj priečinok IMAGES iba v aktuálnom priečinku
/IMAGES
# ignoruj všetky súbory v priečinku MEDIA
MEDIA/
.giti
gnor
e
Príklad #3
# ignoruj doc/notes.txt, ale nie doc/server/arch.txt
doc/*.txt
# ignoruj všetky .pdf súbory v priečinku doc/
doc/**/*.pdf
# ale sleduj všetky readme.pdf súbory v priečinku doc/
!doc/**/readme.pdf
.giti
gnor
e
Vetvy
ZákladVe
tvy
git branch
git branch
git branch -v
git branch --merged
git branch --no-merged
Vetv
y
git branch {name}Ve
tvy
git branch {name}Ve
tvy
git checkout {name}Ve
tvy
git checkout {name}Ve
tvy
A keď teraz urobím commit?Ve
tvy
Po dalšom commiteVe
tvy
git checkout masterVe
tvy
…a ďalší commit.Ve
tvy
…a keď ich chcem spojiť?Ve
tvy
git merge {branch}Ve
tvy
…a môžem zrušiť túto vetvu.Ve
tvy
git branch -d {branch}Ve
tvy
CONFLICT!!!
Kon
flikt
y
Vidim tam toto<<<<<<< HEAD:index.html
<div id="footer">contact : [email protected]</div>
=======
<div id="footer">
please contact us at [email protected]
</div>
>>>>>>> iss53:index.html
Kon
flikt
y
Čo urobím?
1. Vymažem čo nepotrebujem, upravim čo potrebujem
2. Uložim subor
3. git add index.html
4. …a commitnem!
Kon
flikt
y
Kon
flikt
y
Rebase
Rebase?
Môžeš vziať “záplatu” zo zmien, ktoré boli vytvorené v commite C3 a znova ich aplikovať na commit C4.
Vezmeš zmeny robené na jednej vetve a aplikuješ ich na druhú.
Rebasing
Rebasing
git rebase
git checkout iss53
git rebase master
git checkout master
git merge iss53
Stashing
Stash = skrýša
Keď si počas práce na projekte potrebuješ dočasne odložiť rozpracované veci “bokom”, aby si urobil a commitol niečo prioritnejšie
Ako veverička, ktorá si dočasne skryje oriešky, ktoré neskôr zje
Stas
hing
git stash
Uloží všetky rozpracované veci do skrýše.
git stash list
Stas
hing
git stash apply
Aplikuje zmeny uložené v skrýši
git stash apply stash@{2}
Stas
hing
git stash drop
Vymaže skrýšu s rozpracovanými zmenami
git stash drop stash@{0}
Stas
hing
git stash pop
Skratka pre kombináciu dvoch príkazov nasledujúcich po sebe:
git stash apply
git stash drop
git stash branch {name}
Vytvorí z odložených súborov v skrýši novú vetvu
git stash branch test
Stas
hing
git stash --patch
Git nepridá všetky rozpracované súbor do skrýše, ale interaktívne sa opýta, ktoré zmeny sa majú odložiť a ktoré majú ostať rozpracované.
Stas
hing
Tagging#git #is #awesome #yolo
Všetci vieme čo sú tagy
Git disponuje možnosťou otagovať špecifický bod v histórii zmien, ktorý je dôležitý.
Najčastejšie sa používajú na označovanie verzií a “releases” (napr. v0.2.1 etc.)
Git používa 2 druhy tagov:
1. lightweight
2. annotated
Tagg
ing
git tag
Vypíše zoznam tagov
Je možné v nich aj filtrovať
Tagg
ing
Lightweight
Lightweight tag su niečo ako vetva, ktorá sa ďalej nemení.
V podstate je to checksum konkrétneho commitu uloženého v súbore – žiadne ďalšie informácie nie sú uložené.
Tagg
ing
git tag {name}
Vytvorí lightweight tag s menom {name}
git show {name} = vypíše základné informácie o tagu
Tagg
ing
Annotated
Anotované tagy sú ukladané ako úplné objekty v databáze.
Sú checksumované, obsahujú informáciu o taggerovom mene, emaile, a dátume. Obsahujú taktiež tagujúcu správu (obdoba commit message).
Perlička: Môžu byť podpísané a overené pomocou GNU Privacy Guard (GPG).
Tagg
ing
git tag -a {name}
Vytvorí anotovaný tag s menom {name}
git tag -a {name} -m “…”
git show {name} = vypíše všetky informácie o tagu
git tag -a {name} {commit} = priradí tag commitu aj neskôr
Tagg
ing
Zdieľanie tagov
git push origin {tagname}
git push origin --tags
Tagg
ing
Hooks
Aj v gite je háčik
Git má spôsob, ako spustiť špeciálne skripty, keď nastane nejaká dôležitá udalosť.
Existujú dve skupiny hookov: client-side a server-side.
Client-side hooky sú spustené operáciami ako commit, či merge.
Server-side hooky bežia v pre sieťové operácia, ako napríklad prijatie pushnutých commitov.
Hoo
ks
Inštalácia
Skript pod špecifickým názvom sa uloží go priečinka:
.git/hooks
Treba pozrieť do docky na názvy hookov
Hoo
ks
Thats all folks!Diky Broňa…
© 2015 by Miňo