verzovani kodu s gitem (karel minarik)
DESCRIPTION
Prezentace z přednášky o Gitu na Webexpo 2009. Objednejte si školení od jejího autora na http://git-fu.cz !TRANSCRIPT
Verzování kódu s GitemVíce než „zálohování a sdílení“
Karel Minařík
Verzování kódu s Gitem
Karel Minařík
→ Web designer a vývojář na volné noze od roku 2000
→ V minulosti Flash vývojář, art director, informační architekt v internetové agentuře, ..., více na LinkedIn
→ (Opuštěný) blog o Ruby on Rails na http://blog.karmi.cz
→ http://github.com/karmi
→ karmi.cz
Verzování kódu s Gitem
Vy a verzovací systémy1
Verzování kódu s Gitem
Používáte verzovací systém?
Verzování kódu s Gitem
$ cp index.php index.php.BAK
$ cp -r . ../my_work.BAK
$ cp -r . ../my_work.BAK2
$ tar czf ../$(basename $PWD)-$(date '+%Y-%m-%d-%H-%M').tar.gz *
Verzování kódu s Gitem
www.webdesignerdepot.com/2009/03/intro-to-git-for-web-designers/
Verzování kódu s Gitem
‣ Git‣ Mercurial‣ Subversion‣ CVS‣ Jiný (Perforce, DARCS, RCS, ...)
Verzování kódu s Gitem
Principy verzovacích systémů2
Verzování kódu s Gitem
Version Control System, VCSSoftware Configuration Manager, SCM
Nástroj na archivaci a správu změn určitého typu obsahu (typicky software, ale též grafiky, textu, apod.)
Subversion, Wikipedia, Google Docs, Time Machine, …
Historie: SCCS (1970), RCS (1982), CVS (1986)…
Verzovací systémy obecněVERZOVACÍ SYSTÉMY
$ git clone git://git.kernel.org/pub/scm/git/git.git && git log ‐‐reverse ‐‐shortstat
commit e83c5163316f89bfbde7d9ab23ca2e25604af290Author: Linus Torvalds <[email protected]>Date: Thu Apr 7 15:13:13 2005 ‐0700
Initial revision of "git", the information manager from hell
11 files changed, 1244 insertions(+), 0 deletions(‐)
Verzování kódu s Gitem
Základní pojmyVERZOVACÍ SYSTÉMY
Repository (repositář)Úložiště obsahující historii a větve obsahu
Working copy (pracovní adresář)Adresář, kde pracujeme s obsahem repositáře
Mainline/Trunk/Master (hlavní větev)Hlavní větev
Head (head)Poslední revize (v dané větvi)
Revision/Version (revize, verze)Konkrétní záznam změny v určité části obsahu, resp. konkrétní stav obsahu v čase
Tag (štítek, tag)Konzistentní a smyslupné označení určité revize
Branch (větev)Paralelní a nezávislá varianta obsahu
Merge (sloučit)Sloučení několika variant obsahu
Commit (odevzdat, commit)Uložení určité revize obsahu do repositáře (včetně autorství, data a popisu/komentáře)
Verzování kódu s Gitem
Základní workflowVERZOVACÍ SYSTÉMY
Working copy Commit Repository
Verzování kódu s Gitem
K čemu je nám dobrý verzovací systémVERZOVACÍ SYSTÉMY
Zálohování a obnovení ze zálohyPotřebuji mít obsah bezpečně uložený mimo svůj počítač. Potřebuji mít možnost se k určité verzi obsahu snadno vrátit.
Sdílení, synchronizacePotřebuji sdílet obsah s někým jiným po síti. Potřebuji řízeně synchronizovat změny, které učiním já, se změnami, které učiní ostatní.
„Undo na kofeinu“Potřebuji rychle odstranit (některé) změny v (části) obsahu (a jiné zachovat). Potřebuji si exportovat historickou verzi obsahu.
Nelineární, paralelní vývojPotřebuji snadno vyzkoušet nějaké řešení „stranou“, bez toho, že bych nevratně ovlivnil historii obsahu. Potřebuji udržovat paralelní stav obsahu, ale mít možnost do každého zasáhnout a částečně je slučovat.
Zkoumání historie obsahuPotřebuji si prohlédnout, jakými změnami prošel obsah nebo jeho část. Potřebuji zobrazit rozdíl mezi aktuální a historickou podobou části obsahu. Potřebuji vědět, kdo provedl konkrétní změnu v obsahu a proč.
DeploymentPotřebuji snadno aktualizovat webovou aplikaci na specifickou novou verzi. Potřebuji udržovat přehled o vydaných verzích knihovny, aplikace. Potřebuji opravit chybu v určité verzi aplikace a řízeně ji začlenit také do verzí novějších.
Verzování kódu s Gitem
deltastorage
file A !1
file B
file C
C1 C2 C3 C4 C5
!2
!1 !2
!1 !2 !3
A
B
C
C1 C2 C3 C4 C5
A1
B
C1
A1
B
C2
A2
B1
C2
A2
B2
C3
DAGstorage
Taxonomie (delta vs. snapshot)VERZOVACÍ SYSTÉMY
http://www.slideshare.net/chacon/getting-git/56
Scott Chacon, Getting Git (RailsConf 2008)
Verzování kódu s Gitem
Taxonomie (delta/snapshot, local/centralized/distributed)
VERZOVACÍ SYSTÉMY
Scott Chacon, Getting Git (RailsConf 2008)
svncvs
git
perforce
mercurial
time machinecp -r
rcs
source control taxonomy
darcs
deltastorage
DAGstorage
bazzar
bitkeeper
local
centralized
distributed
local
centralized
distributed
http://www.slideshare.net/chacon/getting-git/67
Verzování kódu s Gitem
Subversion (poprvé a naposledy :)
VERZOVACÍ SYSTÉMY
Subversion: „CVS done right“
„There is no way to do CVS right“(Linus Torvalds, Google Tech Talks)
Git není „lepší Subversion“(Přestože ho jako Subversion můžeme úspěšně používat)
Verzování kódu s Gitem
Přístup ke GituCO JE GIT?
Git je extrémně flexibilní
Git je způsob práce
1
2
Verzování kódu s Gitem
Co je Git?3
Verzování kódu s Gitem
Git — stupid content tracker
Verzování kódu s Gitem
git(1) Manual PageNAMEgit - the stupid content tracker
SYNOPSISgit [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]
Verzování kódu s Gitem
git(1) Manual PageNAMEgit - the stupid content trackerSYNOPSIS
Verzování kódu s Gitem
Verzování kódu s Gitem
Me personally, I want to have something that is very repeatable and non-clever. Something I understand or tells me that it can't do it.
Re: Merge with git-pasky II.From: Linus Torvalds <[email protected]> Date: 2005-04-27 06:58:44
Verzování kódu s Gitem
Non-clever
Verzování kódu s Gitem
Základní vlastnostiCO JE GIT?
Jednoduchost
Rychlost
Flexibilita
Snapshot-based
Distribuovanost, nezávislost na centrálním repositáři
Rozmanité workflow
Silná podpora nelineárního vývoje (branch & merge)
Interaktivní příprava revizí a editace historie
Vynikající dokumentace a komunita
Verzování kódu s Gitem
Kdo používá GitCO JE GIT?
Verzování kódu s Gitem
Dokumentace a komunitaCO JE GIT?
http://whygitisbetterthanx.comhttp://whygitisbetterthanx.karmi.cz
Verzování kódu s Gitem
Dokumentace a komunitaCO JE GIT?
www.git-scm.com
Verzování kódu s Gitem
Dokumentace a komunitaCO JE GIT?
book.git-scm.com
Verzování kódu s Gitem
Dokumentace a komunitaCO JE GIT?
www.progit.org/book
Verzování kódu s Gitem
www.gitcasts.com/posts/railsconf-git-talk
Dokumentace a komunitaCO JE GIT?
Verzování kódu s Gitem
Dokumentace a komunitaCO JE GIT?
www.kernel.org/pub/software/scm/git/docs/user-manual.html
Verzování kódu s Gitem
Dokumentace a komunitaCO JE GIT?
www.newartisans.com/2008/04/git-from-the-bottom-up.html
Verzování kódu s Gitem
Dokumentace a komunitaCO JE GIT?
www.stackoverflow.com/questions/tagged/git
Verzování kódu s Gitem
Dokumentace a komunitaCO JE GIT?
www.stackoverflow.com/questions/tagged/git
Verzování kódu s Gitem
Dokumentace a komunitaGIT
www.stackoverflow.com/questions/tagged/git
Verzování kódu s Gitem
Dokumentace a komunitaGIT
www.stackoverflow.com/questions/tagged/git
Verzování kódu s Gitem
Dokumentace a komunitaGIT
www.stackoverflow.com/questions/tagged/git
Verzování kódu s Gitem
Git je jednoduchý4
Verzování kódu s Gitem
InstalaceCO JE GIT?
$ apt-get install git-core$ sudo port install git-core +svn +doc +bash_completion +gitweb
An Illustrated Guide to Git on Windows,http://nathanj.github.com/gitguide/tour.html
Verzování kódu s Gitem
Integrace s IDECO JE GIT?
Verzování kódu s Gitem
GUI nebo CLI?CO JE GIT?
Verzování kódu s Gitem
Nastavení identity uživateleCO JE GIT?
$ git config ‐‐global user.name "Josef Novák"$ git config ‐‐global user.email "[email protected]"
Verzování kódu s Gitem
Nastavení identity uživateleCO JE GIT?
$ cat ~/.gitconfig [user] name = Josef Novák email = [email protected]
Verzování kódu s Gitem
Git je stupidníCO JE GIT?
$ cat ~/.gitconfig [user] name = Josef Novák email = [email protected]
Git je stupidní
Content‐Type: text/plain
Verzování kódu s Gitem
Jak Git ukládá obsah?CO JE GIT?
Git ukládá čtyři typy objektů:
‣ Blob Ukládá data (obsah souborů)
‣ Tree Ukládá obsah složek jako reference na ostatní trees a blobs
‣ Commit Ukládá referenci na určitý tree spolu s metadaty (autor, čas, předek, atd.)
‣ Tag Ukládá referenci na určitý commit spolu s metadaty (název, autor, atd.)
Verzování kódu s Gitem
Jak Git ukládá obsah?CO JE GIT?
01__hello_world_git.sh
$ mkdir newrepo$ cd newrepo
$ git init
$ echo "Hello, World" > file.txt$ cat file.txt
$ git status
$ git add file.txt
$ git status
$ git commit ‐m "Initial commit"
$ git log ‐‐stat
Replay
Verzování kódu s Gitem
Jak Git ukládá obsah?CO JE GIT?
$ find .git/objects -type f
.git/objects/38/bca7264fc8b8340b560e19de3c780ae0a4b60d
.git/objects/3f/a0d4b98289a95a7cd3a45c9545e622718f8d2b
.git/objects/76/bf39ab0db46b183b49d9f707d86e580f78e932
.git/objects/7d/18cb53260cd51497cd70ed8cc00ce8094be681
Verzování kódu s Gitem
Jak Git ukládá obsah?CO JE GIT?
Commit38bca7...
tree 76bf39...
parent N/A
author Karel ...
message Initial commit
Blob3fa0d4...
Hello, World
Tree76bf39...
blob 3fa0d4... file.txt
Tag7d18cb...
object 38bca7...
type commit
tag v.0.1
tagger Karel ...
.git/objects/38/bca7264fc8b8340b560e19de3c780ae0a4b60d
.git/objects/7d/18cb53260cd51497cd70ed8cc00ce8094be681
.git/objects/3f/a0d4b98289a95a7cd3a45c9545e622718f8d2b
.git/objects/76/bf39ab0db46b183b49d9f707d86e580f78e932
Verzování kódu s Gitem
Jak Git ukládá obsah?CO JE GIT?
Commit38bca7...
tree 3fa0d4...
parent N/A
author Karel ...
message Initial commit
Blob3fa0d4...
Hello, World
Tree76bf39...
blob 3fa0d4... file.txt
Tag7d18cb...
object 38bca7...
type commit
tag v.0.1
tagger Karel ...
Commit799659...
tree ae2593...
parent 3fa0d4...
author Karel ...
message Adding somefile
Treeae2593...
blob 3fa0d4... file.txtblob a4ebe0... other_file.txt
Bloba4ebe0...
Lorem ipsum dolor1
2
Verzování kódu s Gitem
Základní workflow
Verzování kódu s Gitem
Zřízení repositářeZÁKLADNÍ WORKFLOW
$ cd my/project/directory$ git init
$ mkdir new_project.git$ cd new_project.git$ git init ‐‐bare ‐‐shared=true
Verzování kódu s Gitem
Zřízení repositářeZÁKLADNÍ WORKFLOW
$ git1_6_5 init new_project.git
http://git.kernel.org/?p=git/git.git;a=commit;h=53d48885931614a43e414e1272a7f126f8d0c901
Verzování kódu s Gitem
Připravení obsahu ke commituZÁKLADNÍ WORKFLOW
$ git status# On branch master## Initial commit## Untracked files:# (use "git add <file>..." to include in what will be committed)## somefile.txtnothing added to commit but untracked files present (use "git add" to track)
Verzování kódu s Gitem
Připravení obsahu ke commituZÁKLADNÍ WORKFLOW
$ git add somefolder$ git add somefile.txt$ git add .
Verzování kódu s Gitem
Připravení obsahu ke commituZÁKLADNÍ WORKFLOW
$ git status# On branch master## Initial commit## Changes to be committed:# (use "git rm ‐‐cached <file>..." to unstage)## new file: somefile.txt
Verzování kódu s Gitem
Připravení obsahu ke commituZÁKLADNÍ WORKFLOW
$ git rm some_folder/not_this_file.txt ‐‐cached
Verzování kódu s Gitem
Označení obsahu, který nechceme verzovatZÁKLADNÍ WORKFLOW
$ cat .gitignore
config/database.ini # Neverzuj soubor "database.ini" ve složce "config"log/*.log # Neverzuj soubory s příponou "log" ve složce "log"tmp/**/* # Neverzuj žádné soubory a složky ve složce "tmp"!/tmp/special.txt # VERZUJ soubor "special.txt" ve složce "tmp"
Verzování kódu s Gitem
Uložení připravené revize do repositáře (commit)ZÁKLADNÍ WORKFLOW
$ git commit ‐m "Initial commit"[master (root‐commit) 826e622] Initial commit 0 files changed, 0 insertions(+), 0 deletions(‐) create mode 100644 somefile.txt
Verzování kódu s Gitem
Uložení připravené revize do repositáře (commit)ZÁKLADNÍ WORKFLOW
$ git add$ git commit
Verzování kódu s Gitem
Staging area (index)
Verzování kódu s Gitemhttp://github.com/schacon/git-presentations/raw/master/sor09/GitTalk-SOR09.pdf
Scott Chacon, Getting Git (Scotland On Rails 2009), p. 197
Staging area (index)ZÁKLADNÍ WORKFLOW
Verzování kódu s Gitem
Staging area (index)ZÁKLADNÍ WORKFLOW
$ echo "Hello, world" > file.txt && cat ‐n file.txt$ git add file.txt && git commit ‐m "Initial commit"
$ git status
$ echo "Goodbye, world" > file.txt && cat ‐n file.txt
$ git add file.txt && git status
$ echo "How are you?" >> file.txt && cat ‐n file.txt
$ git status
$ git diff
$ git diff ‐‐staged
Replay
02__staging_area.sh
Verzování kódu s Gitem
Prohlížení historie5
Verzování kódu s Gitem
Prohlížení historieZÁKLADNÍ WORKFLOW
$ git log$ git log ‐‐oneline app/models/article.rb$ git log ‐‐stat$ git log ‐‐pretty=format:'%h | %ar | %an | %s'$ git log ‐1$ git log ‐‐author=karmi
$ git log ‐‐grep=configuration app/views$ git log ‐Smetal
$ git log ‐‐oneline v.0.1..master
http://www.kernel.org/pub/software/scm/git/docs/git-log.html
Verzování kódu s Gitem
Prohlížení historieZÁKLADNÍ WORKFLOW
$ git show dea2a023c6cf1cac1a21ce48b7154d27ee097a0f$ git show dea2a02$ git show dea2a02:app/models/article.rb
http://www.kernel.org/pub/software/scm/git/docs/git-show.html
Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW
Prohlížení historie
$ git blame file.txt ^2b9afb5 (Karel Minarik 2009‐10‐06 15:40:31 +0200 1) Hello, Worldf0ff2521 (Karel Minarik 2009‐10‐06 18:01:07 +0200 2) How are you?
http://www.kernel.org/pub/software/scm/git/docs/git-blame.html
Verzování kódu s Gitem
Prohlížení a porovnávání revizíZÁKLADNÍ WORKFLOW
$ git diff dea2a02$ git diff dea2a02 facab9e$ git diff dea2a02 app/views$ git diff v.0.1$ git diff HEAD^$ git diff master~5
http://www.kernel.org/pub/software/scm/git/docs/git-diff.html
Verzování kódu s Gitem
Identifikace revizí (commitů, snapshotů)ZÁKLADNÍ WORKFLOW
http://www.slideshare.net/chacon/getting-git/230
SHA1 e82162cfcdd09f868351a6f789942afd184b0619
Zkrácené SHA1 e82162c
Název branche master, origin/susan
Tag v.0.1
„Symref“ HEAD, ORIG_HEAD, atd
Relativní určení master^, master^^, master~5
Rozsah 36b058d..da2a2e7
Verzování kódu s Gitem
Práce s historií a „undo“6
Verzování kódu s Gitem
$ git add app/$ git commit ‐m "Přidáno připojení k webservice"
$ git status# Untracked files:# config/webservice.ini
$ git add config/webservice.ini
$ git commit ‐‐amend
Oprava předešlého commituZÁKLADNÍ WORKFLOW
Oops!
Verzování kódu s Gitem
Neměnte publikovanou, veřejnou historiiZÁKLADNÍ WORKFLOW
ˇ
$ git push origin master$ git merge hotfix
Verzování kódu s Gitem
Zrušení všech úprav v souboruZÁKLADNÍ WORKFLOW
$ git status# 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: file.txt
$ git checkout file.txt
Verzování kódu s Gitem
Zrušení všech úprav v souboruZÁKLADNÍ WORKFLOW
Git si dává velký pozor, abyste nepřišli o dataAle pouze u obsahu, který už je v repositáři
Verzování kódu s Gitem
$ git log ‐‐onelined427f2a Changee82162c Initial commit
$ git checkout e82162cNote: moving to 'e82162c' which isn't a local branchIf you want to create a new branch from this checkout, you may do so(now or later) by using ‐b with the checkout command again. Example: git checkout ‐b <new_branch_name>HEAD is now at e82162c... Initial commit
$ git branch* (no branch) master
$ git checkout ‐b historye82162c Initial commit
$ git checkout master
Checkout historické verze celého projektuZÁKLADNÍ WORKFLOW
master^, v.0.1, origin/susan, atd
Verzování kódu s Gitem
Návrat „o krok zpět“POKROČILÉ WORKFLOW
$ git log ‐‐onelined427f2a Changee82162c Initial commit
$ git reset HEAD^ ‐‐hardHEAD is now at e82162c Initial commit
$ git log ‐‐onelinee82162c Initial commit
Verzování kódu s Gitem
Návrat „zase zpátky“POKROČILÉ WORKFLOW
$ git reset HEAD^ ‐‐hardHEAD is now at e82162c Initial commit
$ git log ‐‐onelinee82162c Initial commit
$ cat .git/ORIG_HEADd427f2a0ec416986645d6e797963711eea90c6a
$ git reflog2b9afb5 HEAD@{0}: HEAD^: updating HEADd427f2a HEAD@{1}: commit: Change
$ git reset d427f2a ‐‐hardHEAD is now at d427f2a Change
Verzování kódu s Gitem
$ git rebase ‐‐interactive
Verzování kódu s Gitem
Sdílení repositáře a synchronizace7
Verzování kódu s Gitem
Zřízení sdíleného repositářeSDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE
$ ssh example.com
[email protected]: cd /path/to/git/repos
[email protected]: mkdir new_repository.git
[email protected]: $ git init ‐‐bare ‐‐shared=true
Verzování kódu s Gitem
Zřízení lokální kopie sdíleného repositářeSDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE
$ cd /path/to/local/projects
# Pokud inicializujeme projekt od nuly
$ git clone [email protected]:/path/to/git/repos/new_repository.git$ git clone [email protected]:/path/to/git/repos/new_repository.git my_project
# Pokud již máme repositář lokálně zřízený
$ cd my_project$ git remote add origin [email protected]:/path/to/git/repos/new_repository.git
Verzování kódu s Gitem
Konfigurace vzdáleného repositářeSDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE
$ git remote show origin* remote origin Fetch URL: [email protected]:/path/to/git/repos/new_repository.git Push URL: [email protected]:/path/to/git/repos/new_repository.git HEAD branch: (unknown)
Verzování kódu s Gitem
Konfigurace vzdáleného repositářeSDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE
$ cat .git/config# ...[remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = [email protected]:/path/to/git/repos/new_repository.git[branch "master"] remote = origin merge = refs/heads/master
Verzování kódu s Gitem
Zřízení lokální kopie sdíleného repositářeSDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE
$ git push origin masterCounting objects: 9, done.Delta compression using up to 2 threads.Compressing objects: 100% (3/3), done.Writing objects: 100% (9/9), 691 bytes, done.Total 9 (delta 0), reused 0 (delta 0)To [email protected]:/path/to/git/repos/new_repository.git * [new branch] master ‐> master
Verzování kódu s Gitem
Zřízení lokální kopie sdíleného repositářeSDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE
$ git pull origin masterremote: Counting objects: 9, done.remote: Compressing objects: 100% (3/3), done.remote: Total 9 (delta 0), reused 0 (delta 0)Unpacking objects: 100% (9/9), done.From [email protected]:/path/to/git/repos/new_repository.git * branch master ‐> FETCH_HEAD
Verzování kódu s Gitem
Základní workflow sdílení a synchronizaceSDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE
$ ssh [email protected] '(cd /repos/ && mkdir new_repo.git && cd new_repo.git && git init ‐‐bare ‐‐shared=true)'
$ cd existing_project
$ git remote add origin [email protected]:/repos/new_repo.git
$ git remote show origin
$ cat .git/config
$ git push origin master
Replay
03__sharing_repositories.sh
Verzování kódu s Gitem
Synchronizace repositářůSDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE
$ git log ‐‐oneline ‐‐graph
* 9945945 Susan: Merge branch 'master' of example.com:/repos/new_repo|\ | * 2360c70 Josh: Small syntax tweaks* | 20c1c8f Susan: Removing trailing dot|/ * d587971 Susan: Adding configuration* 4e4a91f Josh: Change* f0ff252 Josh: Change* 2b9afb5 Josh: Initial commit
Verzování kódu s Gitem
Synchronizace repositářůSDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE
Verzování kódu s Gitem
Git je distribuovaný8
Verzování kódu s Gitem
Taxonomie (delta/snapshot, local/centralized/distributed)
VERZOVACÍ SYSTÉMY
Scott Chacon, Getting Git (RailsConf 2008)
svncvs
git
perforce
mercurial
time machinecp -r
rcs
source control taxonomy
darcs
deltastorage
DAGstorage
bazzar
bitkeeper
local
centralized
distributed
local
centralized
distributed
http://www.slideshare.net/chacon/getting-git/67
Verzování kódu s Gitem
Co znamená, že Git je „distribuovaný“GIT JE DISTRIBUOVANÝ
Lokální operace — nezávislost na připojení k síti
Neexistuje koncept „centrálního repositáře“, „hlavní kopie“. Radikální důsledky pro zálohování. Neexistuje „jedno zranitelné místo”.
Peer-to-peer vs server-client. Radikální důsledky pro výkon a škálování.
Každý repositář je rovnocennou a plnohodnotnou kopií. Včetně celé historie, veřejných větví, atd. Může kdykoliv nahradit jakýkoliv jiný.
Netradiční workflow pro sdílení a synchronizaci
Usnadnění forkingu; udržování vlastní varianty obsahu propojené s původním repositářem
Robustní podpora paralelního vývoje v oddělených větvích
Verzování kódu s Gitem
Co znamená, že Git je „distribuovaný“GIT JE DISTRIBUOVANÝ
As you may have heard, coding superhero _why the lucky stiff recently deleted all his repos, took down his domains and completely removed his online presence.
(...) It's important, however, that his wonderful code live on, and we need your help to do so.
http://whymirror.github.com
Verzování kódu s Gitem
Co znamená, že Git je „distribuovaný“GIT JE DISTRIBUOVANÝ
Workflows!
http://www.slideshare.net/chacon/getting-git/474
Verzování kódu s Gitem
developer
shared repository
developer developer
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developer
shared repository
developer developer
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developer
shared repository
developer developer
Krycí jméno:
„Jako v Subversion“
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developer
shared repository
developer developer
git clone
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developer
shared repository
developer developer
git push
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developer
shared repository
developer developer
git push
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developer
shared repository
developer developer
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
git push
Verzování kódu s Gitem
developer
shared repository
developer developer
git fetch && git mergegit pull
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developer
shared repository
developer developer
git push
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerdeveloper
dictator
developer
lieutenant
blessed repository
developer
lieutenant
Generál a pobočníciMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerdeveloper
dictator
developer
lieutenant
blessed repository
developer
lieutenant
Generál a pobočníciMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
Generál a pobočníciMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerdeveloper
dictator
developer
lieutenant
blessed repository
developer
lieutenant
git clone
Generál a pobočníciMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerdeveloper
dictator
developer
lieutenant
blessed repository
developer
lieutenant
git fetch && git merge
Generál a pobočníciMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerdeveloper
dictator
developer
lieutenant
blessed repository
developer
lieutenant
git fetch && git merge
Generál a pobočníciMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerdeveloper
dictator
developer
lieutenant
blessed repository
developer
lieutenant
git fetch && git merge
Generál a pobočníciMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerdeveloper
dictator
developer
lieutenant
blessed repository
developer
lieutenant
git push
Generál a pobočníciMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerdeveloper
dictator
developer
lieutenant
blessed repository
developer
lieutenant
git fetch
Generál a pobočníciMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
github.com/schacon/ticgit
/yob/ticgit /pope/ticgit
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
github.com/schacon/ticgit
/yob/ticgit /pope/ticgit
KoordinátorMOŽNOSTI WORKFLOW S GITEM
„forks“
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
git push
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
git clone
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
git push
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
git fetch && git merge
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
git push
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
git fetch && git rebase / merge
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developerpublic
developerpublic
integration manager
blessedrepository
developerprivate
developerprivate
git push
KoordinátorMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
Git podporuje paralelní vývoj9
„Softwarové inženýrství“
„Softwarové inženýrství“No nevim.
Verzování kódu s Gitem
K čemu jsou nám užitečné větve (branches)BRANCH & MERGE
In the ideal world, there are no bugs, no schedule crunches, no personnel changes, no market shis, and no technology revolutions. Soware in the ideal world is simply developed and released. (...) If there were such an ideal world, we probably wouldn’t need an SCM system.
Laura Wingerd, Practical Perforce (O’Reilly, 2005)
http://oreilly.com/catalog/practicalperforce/chapter/ch07.pdf
Verzování kódu s Gitem
„Klasický scénář“BRANCH & MERGE
Uprostřed práce na rozsáhlém úkolu přijde požadavek na změnu v produkční verzi kódu (hotfix)
Verzování kódu s Gitem
$ find .git/refs/heads ‐type f.git/refs/heads/master
$ cat .git/refs/heads/master 87c93da440b099856fe3437c5bb269f01fb95379
Co je v Gitu branch?BRANCH & MERGE
40 písmenek v refs/heads
Verzování kódu s Gitem
(...) the git behavior explicitly encourages you to not have to decide before-the-fact to create a branch – it may be that only aer you've done the changes do you realize that „oops, these changes were way more intrusive than I originally anticipated, and I don't want to commit them on the master branch, I want to commit them on an experimental topic branch instead“
— Linus Torvalds
Git a branch workflowBRANCH & MERGE
http://thread.gmane.org/gmane.comp.version-control.git/126568/focus=126571
Verzování kódu s Gitemhttp://progit.org/book/ch3-2.html
Základní workflowBRANCH & MERGE
1
Verzování kódu s Gitemhttp://progit.org/book/ch3-2.html
Základní workflowBRANCH & MERGE
2
$ git checkout ‐b iss53
Verzování kódu s Gitemhttp://progit.org/book/ch3-2.html
Základní workflowBRANCH & MERGE
3
$ git commit ‐m "Pridan formular pro zmenu hesla uzivatele"
Verzování kódu s Gitemhttp://progit.org/book/ch3-2.html
Základní workflowBRANCH & MERGE
4
$ git checkout ‐b hotfix$ git commit ‐m "Oprava registracniho formulare na homepage"
Verzování kódu s Gitemhttp://progit.org/book/ch3-2.html
Základní workflowBRANCH & MERGE
5
$ git checkout master$ git merge hotfix$ git branch ‐d hotfix
Verzování kódu s Gitemhttp://progit.org/book/ch3-2.html
Základní workflowBRANCH & MERGE
6
$ git commit ‐m "Dokonceni formulare na zmenu hesla"
Verzování kódu s Gitemhttp://progit.org/book/ch3-2.html
Základní workflowBRANCH & MERGE
7
$ git checkout master$ git merge iss53 Merge made by recursive.
Verzování kódu s Gitemhttp://progit.org/book/ch3-2.html
Základní workflowBRANCH & MERGE
8
$ git checkout master$ git merge iss53 Merge made by recursive.
Verzování kódu s Gitem
„This probably would look better if we had just used git‐rebase to transplant the commits instead of merging them, but at the time the user who created these was still quite new to Git…“
„Merge hell“BRANCH & MERGE
http://www.spearce.org/2007/07/difficult-gitk-graphs.html
Verzování kódu s Gitem
developer
shared repository
developer developer
Krycí jméno:
„Jako v Subversion“
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
developer
shared repository
developer developer
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
git push
Verzování kódu s Gitem
developer
shared repository
developer developer
git fetch && git mergegit pull
Centralizované worflowMOŽNOSTI WORKFLOW S GITEM
Verzování kódu s Gitem
$ git pull origin master
$ git checkout ‐b task‐999$ git commit ‐m "Dokonceni registrace uzivatele [closes #999]"
$ git checkout master$ git pull
$ git checkout task‐999$ git rebase master
$ git checkout master$ git merge task‐999
$ git push origin master
$ git branch ‐d task‐999
Příklad workflow s rebase: topic branchBRANCH & MERGE
Verzování kódu s Gitem
RebaseBRANCH & MERGE
http://progit.org/book/ch3-6.html
$ git merge experiment
$ git rebase master $ git merge experiment
Verzování kódu s Gitem
$ git branch ‐‐merged$ git branch ‐‐no‐merged
$ git branch ‐d branch_name # Smazat branch, pokud je merged$ git branch ‐D branch_name # Smazat branch, i pokud není merged$ git push origin +:temp # Smazat remote branch
$ git log branch1..branch2$ git log branch2..branch1
$ git log master..origin/master # upstream$ git log origin/master...master # pending
$ git config ‐‐global alias.upstream "log ‐‐oneline master..origin/master"
Rozdíly mezi větvemi, mazání větvíBRANCH & MERGE
Verzování kódu s Gitem
Git je flexibilní10
Verzování kódu s Gitem
Přechod ze SVN na Git u nových projektů
Jednorázový import projektu ze SVN do Gitu
Import projektu ze SVN do Gitu a posílání změn z Gitu
http://git.or.cz/course/svn.htmlhttp://gitready.com/beginner/2009/02/04/converting-from-svn.htmlhttp://www.kernel.org/pub/software/scm/git/docs/git-svn.html
Integrace se SubversionGIT JE FLEXIBILNÍ
$ git svn init ‐s http://example.com/svn/my_proj$ git svn fetch$ git svn rebase$ git svn dcommit
Verzování kódu s Gitem
$ cat ~/.gitconfig[user] name = Josef Novák...[alias] s = status co = commit ca = commit ‐a
l = log ‐‐pretty=format:'%Cred%h%Creset | %Cgreen%s%Creset [%ar by %an]' b = branch
upstream = log ‐‐oneline master..origin/master[merge]
tool=vimdiff
Konfigurace, aliasyGIT JE FLEXIBILNÍ
Verzování kódu s Gitem
Interaktivní příprava commituGIT JE FLEXIBILNÍ
$ git add ‐p
Verzování kódu s Gitem
Interaktivní příprava commituGIT JE FLEXIBILNÍ
Verzování kódu s Gitem
Interaktivní rebaseGIT JE FLEXIBILNÍ
$ git rebase ‐‐interactive 01df473^
Oprava commitů v historiiSloučení více commitů do jednohoOdstranění commitů
Verzování kódu s Gitem
$ git filter-branch -f --index-filter 'git update-index --remove passwords.txt' HEAD
$ git filter-branch --env-filter ' if [ "$GIT_AUTHOR_EMAIL" = "root@localhost" ]; then export GIT_AUTHOR_NAME="Lubomír Roztržitý" \ && export GIT_AUTHOR_EMAIL="[email protected]"; fi' -f
Surový přepis historie repositářeGIT JE FLEXIBILNÍ
Verzování kódu s Gitem
HooksGIT JE FLEXIBILNÍ
$ cat repo.git/hooks/post‐receive#!/bin/sh(unset GIT_DIR && \ cd ../deployed_repo && \ git fetch && \ git reset ‐‐hard origin/master && \ echo ">>> Content has been synchronized")
$ find .git/hooks ‐type f.git/hooks/applypatch‐msg.sample.git/hooks/commit‐msg.sample.git/hooks/post‐commit.sample.git/hooks/post‐receive.sample.git/hooks/post‐update.sample.git/hooks/pre‐applypatch.sample.git/hooks/pre‐commit.sample.git/hooks/pre‐rebase.sample.git/hooks/prepare‐commit‐msg.sample.git/hooks/update.sample
Verzování kódu s Gitem
$ cd repos/webexpo_planner_with_error
$ git bisect start HEAD v1.0$ git bisect run rake test
Binary bug searchGIT JE FLEXIBILNÍ
Bad Good
Verzování kódu s Gitem
Dokument Microsoft Word
diff ‐‐git a/document1.doc b/document1.docindex dfe0545..ff0d2d6 100644Binary files a/document1.doc and b/document1.doc differ
$ echo '*.doc diff=doc' >> .gitattributes$ git config diff.doc.textconv antiword
$ git log ‐‐oneline ‐p$ git log ‐‐oneline ‐p ‐‐color‐words
Speciální diff nástrojGIT JE FLEXIBILNÍ
Verzování kódu s Gitem
Git jako toolkitGIT JE FLEXIBILNÍ
http://ephemera.karmi.cz/post/173776746/post-scriptum-k-setkani-na-tema-verzovaci-systemy
Verzování kódu s Gitem
➡ Hooks
➡ Capistrano (www.capify.org)
➡ Continuous Integration server
DeploymentGIT JE FLEXIBILNÍ
Verzování kódu s Gitem
Git hosting11
Verzování kódu s Gitem
MožnostiGIT HOSTING
1
2
3
$ ssh my‐box‐somewhere‐on‐the.net
Verzování kódu s Gitem
Github.comGIT HOSTING
„Facebook“
Fork queue
Downloads
Networkgist.github.com
Verzování kódu s Gitem
Githosting.czGIT HOSTING
Aktivita v repositářích
Prohlížeč obsahu
repositáře
Prohlížeč historie
Dashboard
Githosting vs Github: Více repositářů | Méně funkcí | Umístění v ČR | Česká fakturace a podpora
Verzování kódu s Gitem
Listopad/Prosinec 2009GIT ŠKOLENÍ
www.git-fu.cz