2. Správa verzí
Lokální (VCS) – ukládání do adresářů, zip, RCS( MAC OS)
Centralizované (CVCS) - CVS, Subversion, Perforce
Distribuované (DVCS) – GIT, Mercurial, Bazaar, Darcs
DVCS
VCS CVCS
3. GIT - historie
Linus Torvalds, komunita
Linux
1991 – 2002 - archivní soubory
2002 – 2005 - Bit-Keeper (komerční)
2005 – nyní - GIT
- rychlost
- jednoduchý design
- silná podpora nelineárního vývoje (tisíce paralelních větví)
- plná distribuovatelnost
- schopnost efektivně spravovat velké projekty, jako je linuxové jádro (rychlost a objem dat).
7. GIT – základní operace
Získání repozitáře Git
Inicializace repozitáře v existujícím adresáři
$ git init
$ vim README
$ git add README
$ git commit –m 'initial project version'
Klonování existujícího repozitáře
$ git clone git://github.com/schacon/grit.git
$ git clone git://github.com/schacon/grit.git mygrit
8. GIT – základní operace
Kontrola stavu souborů
$ git status
# On branch master
nothing to commit (working directory clean)
Přidání nového souboru
$ vim README
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# README
nothing added to commit but untracked files present (use "git add" to
track)
9. GIT – základní operace
Sledování nových souborů
$ git add README
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
#
10. GIT – základní operace
Připravení změněných souborů
( změna již existujícího souboru benchmarks.rb )
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
#
# modified: benchmarks.rb
#
$ git add benchmarks.rb
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
# modified: benchmarks.rb
#
11. GIT – základní operace
Další změny v souboru
$ vim benchmarks.rb
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
# modified: benchmarks.rb
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
#
# modified: benchmarks.rb
#
$ git add benchmarks.rb
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
# modified: benchmarks.rb
#
12. GIT – základní operace
Zobrazení připravených a nepřipravených změn - podrobně
$ git diff
diff --git a/benchmarks.rb b/benchmarks.rb
index 3cb747f..da65585 100644
--- a/benchmarks.rb
+++ b/benchmarks.rb
@@ -36,6 +36,10 @@ def main
@commit.parents[0].parents[0].parents[0]
end
+ run_code(x, 'commits 1') do
+ git.commits.size
+ end
+
run_code(x, 'commits 2') do
log = git.commits('master', 15)
log.size
$ git diff master..development
$ git diff --cached
13. GIT – základní operace
Ignorované soubory
$ cat .gitignore
/nbproject/private/
/temp/
/log/
Prazdné adresáře
*
!.gitignore
Příklad
# komentář – toto je ignorováno
*.a # žádné soubory s připonou .a
!lib.a # ale sleduj soubor lib.a, přestože máš ignorovat soubory s
příponou .a
/TODO # ignoruj soubor TODO pouze v kořenovém adresáři, ne v
podadresářích
build/ # ignoruj všechny soubory v adresáři build/
doc/*.txt # ignoruj doc/notes.txt, ale nikoli doc/server/arch.txt
14. GIT – základní operace
Zapisování změn
$ git commit
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
# modified: benchmarks.rb
Přeskočení oblasti připravených změn
$ git commit -a
15. GIT – základní operace
Zobrazení historie revizí
$ git log
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test code
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
$ git log –pretty=oneline
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
$ git log –p -2
$ git log master..development
Grafické uživatelské rozhraní pro procházení historie
$ gitk
16. GIT – základní operace
Rušení změn
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
Návrat souboru z oblasti připravených změn
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.txt
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: benchmarks.rb
#
17. GIT – základní operace
Práce se vzdálenými repozitáři
Zobrazení vzdálených serverů
$ git remote -v
origin git://github.com/schacon/ticgit.git
Přidávání vzdálených repozitářů
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
origin git://github.com/schacon/ticgit.git
pb git://github.com/paulboone/ticgit.git
18. GIT – základní operace
Získání dat ze vzdálených repozitářů
$ git fetch [název vzdáleného repozitáře] #stáhne data do repozitáře
$ git pull [název vzdáleného repozitáře] #stáhne a sloučí data s aktuální větví
Posílání do vzdálených repozitářů
$ git push origin master
20. GIT – základní operace
TAGY
$ git tag
v0.1
v1.3
Anotované tagy
nesou jméno autora tagu (tagger), e-mail, datum, vlastní zprávu (tagging message) a mohou být podepsány
(signed) a ověřeny (verified) v programu GNU Privacy Guard (GPG)
$ git tag -a v1.4 -m 'my version 1.4'
Podepsané tagy
$ git tag -s v1.5 -m 'my signed 1.5 tag'
Lightweight ( prosté ) tagy
$ git tag v1.4-lw
21. GIT – základní operace
Dodatečné otagování
$ git log –pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
$ git tag -a v1.2 0d52aaa
23. GIT
Co je na GITu (nejen) podlě mě uplně nejlepší
24. GIT – Práce s větvemi
Co je to větev
Git neukládá data jako sérii změn nebo rozdílů, ale jako sérii snímků.
Zapíšete-li v systému Git commit (revize), Git uloží objekt commitu,
obsahující ukazatel na snímek obsahu, který byl připraven k zapsání
(staging area), informace o autorovy, zprávu commitu a ukazatel na
předchozí commit (commity).
25. GIT – Práce s větvemi
Větev je v systému Git jen snadno přemístitelným ukazatelem na jeden z
těchto commitů.
Výchozím názvem větve v systému Git je master (hlavní větev).
Pokaždé, když zapíšete nový commit, větev se automaticky posune vpřed.
26. GIT – Práce s větvemi
Vyvtoření nové větve = vytvoření nového ukazatele, s nímž
můžete pohybovat
$ git branch testing
27. GIT – Práce s větvemi
Jak Git pozná, na jaké větvi se právě nacházíte?
Používá speciální ukazatel zvaný HEAD. HEAD je velmi odlišný od všech koncepcí v
ostatních systémech VCS.
V systému Git se jedná o ukazatel na lokální větev, na níž se právě nacházíte.
28. GIT – Práce s větvemi
Přepínání mezi větvemi
$ git checkout testing
29. GIT – Práce s větvemi
$ vim test.rb
$ git commit -a -m 'made a change'
31. GIT – Práce s větvemi
$ vim test.rb
$ git commit -a -m 'made a change'
32. GIT – Práce s větvemi
Příklad
$ git checkout -b iss53
Switched to a new branch "iss53"
$ git branch iss53
$ git checkout iss53
33. GIT – Práce s větvemi
$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'
$ git checkout master
Switched to branch "master"
$ git checkout -b 'hotfix'
Switched to a new branch "hotfix"
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
34. GIT – Práce s větvemi
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast forward
README | 1 -
1 files changed, 0 insertions(+), 1
deletions(-)
35. GIT – Práce s větvemi
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
36. GIT – Práce s větvemi
Slučování
$ git checkout master
$ git merge iss53
Merge made by recursive.
README | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
38. GIT – Práce s větvemi
Základní konflikty při slučování
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result
[master*]$ git status
index.html: needs merge
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# Unmerged: index.html
#
Stav souboru
<<<<<<< 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
39. GIT – Práce s větvemi
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# Modified: index.html
#
$ git commit
Výpis větví
$ git branch
iss53
* master
testing
$ git branch -v
iss53 93b412c fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 add scott to the author list in the readmes
40. GIT – Práce s větvemi
Možnosti při práci s větvemi
Dlouhé větve
41. GIT – Práce s větvemi
Vzdálené větve
Vzdálené větve jsou reference (tj. odkazy) na stav větví ve
vašich vzdálených repozitářích.
Jsou to lokální větve, které nemůžete přesouvat.
Přesouvají se automaticky při síťové komunikaci.
Vzdálené větve slouží jako záložky, které vám připomínají, kde
byly větve ve vzdálených repozitářích, když jste se k nim
naposledy připojili.
42. GIT – Práce s větvemi
Vzdálené větve mají podobu (vzdálený repozitář)/(větev)
např. origin/master
$ git branch -va
* development cdc6884 [behind 1] fixes #1790
master 53d0c07 oprava DeleteUserPresenter
remotes/origin/development 53d0c07 oprava DeleteUserPresenter
remotes/origin/master 53d0c07 oprava DeleteUserPresenter
43. GIT – Práce s větvemi
Sledující větve
Checkoutem lokální větve ze vzdálené větve automaticky
vytvoříte tzv. Sledující větev (angl. Tracking branch).
Nastavení sledování větví
$ git checkout -b [větev] [vzdálený server]/[větev]
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
NEBO
$ git branch --set-upstream origin/serverfix
47. GIT - distribuovaný charakter Gitu
Pracovní postup s integračním manažerem (GIT Hub)
48. GIT - distribuovaný charakter Gitu
Pracovní postup s diktátorem a poručíky
49. GIT - odložení
Stash - odložení
$ git stash
Saved working directory and index state "WIP on master: 049d078 added the
index file"
HEAD is now at 049d078 added the index file
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051... Revert "added file_size"
stash@{2}: WIP on master: 21d80a5... added number to log
$ git stash apply nebo $ git stash pop
50. GIT - submoduly
Submoduly
$ git submodule add git://github.com/chneukirchen/rack.git rack
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: .gitmodules
# new file: rack
#
$ cat .gitmodules
[submodule "rack"]
path = rack
url = git://github.com/chneukirchen/rack.git
$ git commit -m 'first commit with submodule rack'
[master 0550271] first commit with submodule rack
2 files changed, 4 insertions(+), 0 deletions(-)
create mode 100644 .gitmodules
create mode 160000 rack
51. GIT - submoduly
S adresářem rack můžete pracovat jako se samostatným
projektem a čas od času aktualizovat superprojekt ukazatelem
na nejnovější revizi v tomto subprojektu.
Všechny příkazy Git pracují v obou adresářích nezávisle.
53. GIT – změna historie
Používat jen výjimečně
$ git commit --amend
$ git rebase
$ git rebase -i
$ git reflog
$ git filter-branch --tree-filter 'rm filename' HEAD