Git
Svä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ý
ČojetoGit?
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.
ČojetoGit?
ČojetoGit?
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.
ČojetoGit?
Nastavenie Git-u
Základy
3 ú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
NastavenieGit-u
git config
git config --global user.name “Moje Meno”
git config --global user.email moj@email.sk
git config --global core.editor nano
git config --list
git config user.email
NastavenieGit-u
NastavenieGit-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ácasGit-om
git init
cd ~/project_directory
git init
Založenie nového repozitára v existujúcom priečinku
PrácasGit-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ácasGit-om
Získavanie informácií
git status
git log -2
git diff
git diff --staged
git diff --cached
PrácasGit-om
git diff --cached
PrácasGit-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
Gitremotes
git remote
git remote
git remote add {shortname} {url}
git remote rename {old_shortname} {new_shortname}
git remote rm {shortname}
Gitremotes
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ť.
Gitremotes
Práca so súbormi
Životný cyklus súborov
repozitára
Prácasosúbormi
git add
git add {file}
git add .
Prácasosúbormi
git commit
git commit
git commit -m “…”
git commit -a -m “…”
git commit --ammend
Prácasosúbormi
git mv
git mv {old_file} {new_file}
Prácasosúbormi
git rm
git rm {file}
git rm --cached {file}
Prácasosúbormi
git checkout
git checkout -- {file}
git checkout {branch}
Prácasosúbormi
git push
git push {remote} {branch}
Prácasosúbormi
git pull
git pull
git pull {remote}
git pull {remote} {branch}
Prácasosúbormi
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
Resetovanie
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.
Resetovanie
Index
Index návrh tvojho budúceho commitu - teda “Staging Area”.
Resetovanie
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.
Resetovanie
Workflow
Resetovanie
Predstavte si, že…
…sme súbor zmenili 3x.
Resetovanie
Resetovanie
Resetovanie
Resetovanie
Resetovanie
.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
.gitignore
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
.gitignore
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/
.gitignore
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
.gitignore
Vetvy
Základ
Vetvy
git branch
git branch
git branch -v
git branch --merged
git branch --no-merged
Vetvy
git branch {name}
Vetvy
git branch {name}
Vetvy
git checkout {name}
Vetvy
git checkout {name}
Vetvy
A keď teraz urobím commit?
Vetvy
Po dalšom commite
Vetvy
git checkout master
Vetvy
…a ďalší commit.
Vetvy
…a keď ich chcem spojiť?
Vetvy
git merge {branch}
Vetvy
…a môžem zrušiť túto vetvu.
Vetvy
git branch -d {branch}
Vetvy
CONFLICT!!!
Konflikty
Vidim tam toto
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
Konflikty
Čo urobím?
1. Vymažem čo nepotrebujem, upravim čo potrebujem
2. Uložim subor
3. git add index.html
4. …a commitnem!
Konflikty
Konflikty
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
Stashing
git stash
Uloží všetky rozpracované veci do skrýše.
git stash list
Stashing
git stash apply
Aplikuje zmeny uložené v skrýši
git stash apply stash@{2}
Stashing
git stash drop
Vymaže skrýšu s rozpracovanými zmenami
git stash drop stash@{0}
Stashing
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
Stashing
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é.
Stashing
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
Tagging
git tag
Vypíše zoznam tagov
Je možné v nich aj filtrovať
Tagging
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é.
Tagging
git tag {name}
Vytvorí lightweight tag s menom {name}
git show {name} = vypíše základné informácie o tagu
Tagging
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).
Tagging
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
Tagging
Zdieľanie tagov
git push origin {tagname}
git push origin --tags
Tagging
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.
Hooks
Inštalácia
Skript pod špecifickým názvom sa uloží go priečinka:
.git/hooks
Treba pozrieť do docky na názvy hookov
Hooks
Thats all folks!
Diky Broňa…
© 2015 by Miňo

Academy vol.13

  • 1.
  • 2.
    Čo je toGit? https://git-scm.com
  • 3.
    Definícia Git nie jeGitHub! 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ý ČojetoGit?
  • 4.
    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. ČojetoGit?
  • 5.
  • 6.
    The Git directoryis 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. ČojetoGit?
  • 7.
  • 8.
    Základy 3 ú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 NastavenieGit-u
  • 9.
    git config git config--global user.name “Moje Meno” git config --global user.email moj@email.sk git config --global core.editor nano git config --list git config user.email NastavenieGit-u
  • 10.
  • 11.
  • 12.
    Získanie repozitára Využívame 2základné prístupy 1. Založenie nového repozitára v existujúcom priečinku 2. Naklonovanie vzdialeného repozitára PrácasGit-om
  • 13.
    git init cd ~/project_directory gitinit Založenie nového repozitára v existujúcom priečinku PrácasGit-om
  • 14.
    git clone git clonehttps://bitbucket.org/semisedlak/test git clone https://bitbucket.org/semisedlak/test project_dir Naklonovanie vzdialeného repozitára PrácasGit-om
  • 15.
    Získavanie informácií git status gitlog -2 git diff git diff --staged git diff --cached PrácasGit-om
  • 16.
  • 17.
  • 18.
    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 Gitremotes
  • 19.
    git remote git remote gitremote add {shortname} {url} git remote rename {old_shortname} {new_shortname} git remote rm {shortname} Gitremotes
  • 20.
    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ť. Gitremotes
  • 21.
  • 22.
  • 23.
    git add git add{file} git add . Prácasosúbormi
  • 24.
    git commit git commit gitcommit -m “…” git commit -a -m “…” git commit --ammend Prácasosúbormi
  • 25.
    git mv git mv{old_file} {new_file} Prácasosúbormi
  • 26.
    git rm git rm{file} git rm --cached {file} Prácasosúbormi
  • 27.
    git checkout git checkout-- {file} git checkout {branch} Prácasosúbormi
  • 28.
    git push git push{remote} {branch} Prácasosúbormi
  • 29.
    git pull git pull gitpull {remote} git pull {remote} {branch} Prácasosúbormi
  • 30.
  • 31.
    S čím gitpracuje 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 Resetovanie
  • 32.
    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. Resetovanie
  • 33.
    Index Index návrh tvojhobudúceho commitu - teda “Staging Area”. Resetovanie
  • 34.
    Working directory Predchádzajúce dvastromy 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. Resetovanie
  • 35.
  • 36.
    Predstavte si, že… …smesúbor zmenili 3x. Resetovanie
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
    Na čo slúži? Slúžina 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 .gitignore
  • 43.
    Príklad #1 # ignorujsú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 .gitignore
  • 44.
    Príklad #2 # ignorujvč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/ .gitignore
  • 45.
    Príklad #3 # ignorujdoc/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 .gitignore
  • 46.
  • 47.
  • 48.
    git branch git branch gitbranch -v git branch --merged git branch --no-merged Vetvy
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
    A keď terazurobím commit? Vetvy
  • 54.
  • 55.
  • 56.
  • 57.
    …a keď ichchcem spojiť? Vetvy
  • 58.
  • 59.
    …a môžem zrušiťtúto vetvu. Vetvy
  • 60.
    git branch -d{branch} Vetvy
  • 62.
  • 63.
    Vidim tam toto <<<<<<<HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> iss53:index.html Konflikty
  • 64.
    Čo urobím? 1. Vymažemčo nepotrebujem, upravim čo potrebujem 2. Uložim subor 3. git add index.html 4. …a commitnem! Konflikty
  • 65.
  • 66.
  • 67.
    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ú.
  • 68.
  • 69.
  • 70.
    git rebase git checkoutiss53 git rebase master git checkout master git merge iss53
  • 71.
  • 72.
    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 Stashing
  • 73.
    git stash Uloží všetkyrozpracované veci do skrýše. git stash list Stashing
  • 74.
    git stash apply Aplikujezmeny uložené v skrýši git stash apply stash@{2} Stashing
  • 75.
    git stash drop Vymažeskrýšu s rozpracovanými zmenami git stash drop stash@{0} Stashing
  • 76.
    git stash pop Skratkapre kombináciu dvoch príkazov nasledujúcich po sebe: git stash apply git stash drop
  • 77.
    git stash branch{name} Vytvorí z odložených súborov v skrýši novú vetvu git stash branch test Stashing
  • 78.
    git stash --patch Gitnepridá 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é. Stashing
  • 79.
  • 80.
    Všetci vieme čosú 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 Tagging
  • 81.
    git tag Vypíše zoznamtagov Je možné v nich aj filtrovať Tagging
  • 82.
    Lightweight Lightweight tag sunieč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é. Tagging
  • 83.
    git tag {name} Vytvorílightweight tag s menom {name} git show {name} = vypíše základné informácie o tagu Tagging
  • 84.
    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). Tagging
  • 85.
    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 Tagging
  • 86.
    Zdieľanie tagov git pushorigin {tagname} git push origin --tags Tagging
  • 87.
  • 88.
    Aj v giteje 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. Hooks
  • 89.
    Inštalácia Skript pod špecifickýmnázvom sa uloží go priečinka: .git/hooks Treba pozrieť do docky na názvy hookov Hooks
  • 90.
    Thats all folks! DikyBroňa… © 2015 by Miňo