SlideShare una empresa de Scribd logo
1 de 161
Descargar para leer sin conexión
Verzování kódu s Gitem
Více než „zálohování a sdílení“
Karel Minařík
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 nahttp://blog.karmi.cz

→ http://github.com/karmi




→   karmi.cz



                                                                                      Verzování kódu s Gitem
1   Vy a verzovací systémy




                             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
2   Principy verzovacích systémů




                                   Verzování kódu s Gitem
VERZOVACÍ SYSTÉMY

Verzovací systémy obecně

Version Control System, VCS
Software 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)…
$ git clone git://git.kernel.org/pub/scm/git/git.git && git log ‐‐reverse ‐‐shortstat
commit e83c5163316f89bfbde7d9ab23ca2e25604af290
Author: Linus Torvalds <torvalds@ppc970.osdl.org>
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
VERZOVACÍ SYSTÉMY

Základní pojmy
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
VERZOVACÍ SYSTÉMY

Základní workflow




      Working copy   Commit    Repository




                              Verzování kódu s Gitem
VERZOVACÍ SYSTÉMY

K čemu je nám dobrý verzovací systém
Zálohování a obnovení ze zálohy
Potř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í, synchronizace
Potř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ývoj
Potř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 obsahu
Potř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č.
Deployment
Potř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
VERZOVACÍ SYSTÉMY

Taxonomie (delta vs. snapshot)


                            C1           C2       C3   C4   C5



                           file A         !1            !2
            delta
           storage
                           file B                       !1   !2



                           file C         !1       !2        !3




                            C1           C2       C3   C4   C5




            DAG             A            A1       A1   A2   A2

           storage
                            B            B        B    B1   B2



                            C            C1       C2   C2   C3




Scott Chacon, Getting Git (RailsConf 2008)
http://www.slideshare.net/chacon/getting-git/56                  Verzování kódu s Gitem
VERZOVACÍ SYSTÉMY

Taxonomie (delta/snapshot, local/centralized/distributed)
                             source control taxonomy

                         local          rcs



           delta
                      centralized       cvs         svn         perforce
          storage



                      distributed      darcs      mercurial



                                                       time
                         local          cp -r
                                                      machine


           DAG
                      centralized
          storage
                                                                           bitkeeper

                      distributed       git           bazzar




Scott Chacon, Getting Git (RailsConf 2008)
http://www.slideshare.net/chacon/getting-git/67                                        Verzování kódu s Gitem
VERZOVACÍ SYSTÉMY

Subversion (poprvé a naposledy :)

                    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
CO JE GIT?

Přístup ke Gitu




1     Git je extrémně flexibilní
2     Git je způsob práce




                                   Verzování kódu s Gitem
3   Co je Git?




                 Verzování kódu s Gitem
Git — stupid content tracker




                       Verzování kódu s Gitem
git(1) Manual Page
NAME
git - the stupid content tracker

SYNOPSIS
git [--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
stupid
    Verzování kódu s Gitem
Verzování kódu s Gitem
Re: Merge with git-pasky II.
From: Linus Torvalds <torvalds@osdl.org>
Date: 2005-04-27 06:58:44



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.




                                           Verzování kódu s Gitem
Non-clever
        Verzování kódu s Gitem
CO JE GIT?

Základní vlastnosti

 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
CO JE GIT?

Kdo používá Git




                  Verzování kódu s Gitem
CO JE GIT?

Dokumentace a komunita




               http://whygitisbetterthanx.com
             http://whygitisbetterthanx.karmi.cz

                                                   Verzování kódu s Gitem
CO JE GIT?

Dokumentace a komunita




                 www.git-scm.com

                                   Verzování kódu s Gitem
CO JE GIT?

Dokumentace a komunita




                 book.git-scm.com

                                    Verzování kódu s Gitem
CO JE GIT?

Dokumentace a komunita




                www.progit.org/book

                                      Verzování kódu s Gitem
CO JE GIT?

Dokumentace a komunita




             www.gitcasts.com/posts/railsconf-git-talk

                                                         Verzování kódu s Gitem
CO JE GIT?

Dokumentace a komunita




        www.kernel.org/pub/software/scm/git/docs/user-manual.html

                                                          Verzování kódu s Gitem
CO JE GIT?

Dokumentace a komunita




         www.newartisans.com/2008/04/git-from-the-bottom-up.html

                                                         Verzování kódu s Gitem
CO JE GIT?

Dokumentace a komunita




             www.stackoverflow.com/questions/tagged/git

                                                          Verzování kódu s Gitem
CO JE GIT?

Dokumentace a komunita




             www.stackoverflow.com/questions/tagged/git

                                                          Verzování kódu s Gitem
GIT

Dokumentace a komunita




        www.stackoverflow.com/questions/tagged/git

                                                     Verzování kódu s Gitem
GIT

Dokumentace a komunita




        www.stackoverflow.com/questions/tagged/git

                                                     Verzování kódu s Gitem
GIT

Dokumentace a komunita




        www.stackoverflow.com/questions/tagged/git

                                                     Verzování kódu s Gitem
4   Git je jednoduchý




                        Verzování kódu s Gitem
CO JE GIT?

Instalace


$ 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
CO JE GIT?

Integrace s IDE




                  Verzování kódu s Gitem
CO JE GIT?

GUI nebo CLI?




                Verzování kódu s Gitem
CO JE GIT?

Nastavení identity uživatele




$ git config ‐‐global user.name  "Josef Novák"
$ git config ‐‐global user.email "jnovak@example.com"




                                               Verzování kódu s Gitem
CO JE GIT?

Nastavení identity uživatele




$ cat ~/.gitconfig
[user]
	 name = Josef Novák
	 email = jnovak@example.com




                               Verzování kódu s Gitem
CO JE GIT?

Git je stupidní




Git je stupidní
$ cat ~/.gitconfig
[user]    Content‐Type: text/plain
	 name = Josef Novák
	 email = jnovak@example.com




                                     Verzování kódu s Gitem
CO JE GIT?

Jak Git ukládá obsah?



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
CO JE GIT?

Jak Git ukládá obsah?

    $ mkdir newrepo
    $ cd newrepo

    $ git init

    $ echo "Hello, World" > file.txt
    $ cat file.txt

    $ git status                       Replay
    $ git add file.txt

    $ git status

    $ git commit ‐m "Initial commit"

    $ git log ‐‐stat




   01__hello_world_git.sh
                                                Verzování kódu s Gitem
CO JE GIT?

Jak Git ukládá obsah?



             $ 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
CO JE GIT?

 Jak Git ukládá obsah?
   .git/objects/38/bca7264fc8b8340b560e19de3c780ae0a4b60d
                                                               .git/objects/76/bf39ab0db46b183b49d9f707d86e580f78e932

           Commit                                                    Tree
           38bca7...                                                 76bf39...
           tree           76bf39...                                  blob          3fa0d4... file.txt
           parent         N/A
           author         Karel ...
           message        Initial commit

                                                                     Blob
                                                                     3fa0d4...

                                                                     Hello, World
           Tag
           7d18cb...                                        .git/objects/3f/a0d4b98289a95a7cd3a45c9545e622718f8d2b


           object         38bca7...
           type           commit
           tag            v.0.1
           tagger         Karel ...

.git/objects/7d/18cb53260cd51497cd70ed8cc00ce8094be681


                                                                                                    Verzování kódu s Gitem
CO JE GIT?

Jak Git ukládá obsah?

2        Commit                                                                     Tree
         799659...                                                                  ae2593...
         tree                        ae2593...                                      blob   3fa0d4...   file.txt
         parent                      3fa0d4...                                      blob   a4ebe0...   other_file.txt
         author                      Karel ...
         message                     Adding somefile


                                                                                                   Blob
          Commit
                                                                                                   a4ebe0...
                                                 Tree
1         38bca7...
                                                 76bf39...

                                                                                                   Lorem ipsum dolor
              tree       3fa0d4...
                                                 blob        3fa0d4...   file.txt
              parent     N/A

              author     Karel ...

              message    Initial commit




        Tag
        7d18cb...
                                                                                    Blob
                                                                                    3fa0d4...
        object          38bca7...

        type            commit

        tag             v.0.1                                                       Hello, World
        tagger          Karel ...




                                                                                                            Verzování kódu s Gitem
Základní workflow




                    Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Zřízení repositáře




$ 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ÁKLADNÍ WORKFLOW

Zřízení repositáře




$ 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
ZÁKLADNÍ WORKFLOW

Připravení obsahu ke commitu



$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#  somefile.txt
nothing added to commit but untracked files present (use "git add" to 
track)




                                                       Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Připravení obsahu ke commitu




$ git add somefolder
$ git add somefile.txt
$ git add .




                               Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Připravení obsahu ke commitu



$ 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
ZÁKLADNÍ WORKFLOW

Připravení obsahu ke commitu




$ git rm some_folder/not_this_file.txt ‐‐cached




                                                  Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Označení obsahu, který nechceme verzovat




$ 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
ZÁKLADNÍ WORKFLOW

Uložení připravené revize do repositáře (commit)




$ 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
ZÁKLADNÍ WORKFLOW

Uložení připravené revize do repositáře (commit)




           $ git add
           $ git commit




                                            Verzování kódu s Gitem
Staging area (index)




                       Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Staging area (index)




Scott Chacon, Getting Git (Scotland On Rails 2009), p. 197
http://github.com/schacon/git-presentations/raw/master/sor09/GitTalk-SOR09.pdf   Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Staging area (index)



   $ 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
                                      Replay
   $ echo "How are you?" >> file.txt && cat ‐n file.txt

   $ git status

   $ git diff

   $ git diff ‐‐staged




  02__staging_area.sh
                                                           Verzování kódu s Gitem
5   Prohlížení historie




                          Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Prohlížení historie




$ 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
ZÁKLADNÍ WORKFLOW

Prohlížení historie




$ 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, World
f0ff2521 (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
ZÁKLADNÍ WORKFLOW

Prohlížení a porovnávání revizí




$ 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
ZÁKLADNÍ WORKFLOW

Identifikace revizí (commitů, snapshotů)



           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




http://www.slideshare.net/chacon/getting-git/230                Verzování kódu s Gitem
6   Práce s historií a „undo“




                                Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Oprava předešlého commitu



$ git add app/
$ git commit ‐m "Přidáno připojení k webservice"

$ git status
# Untracked files:                             Oops!
#  config/webservice.ini

$ git add config/webservice.ini

$ git commit ‐‐amend




                                                       Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Neměnte publikovanou, veřejnou historii
    ˇ




$ git push origin master
$ git merge hotfix




                                          Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Zrušení všech úprav v souboru



$ 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
ZÁKLADNÍ WORKFLOW

Zrušení všech úprav v souboru




            Git si dává velký pozor, abyste nepřišli o data
            Ale pouze u obsahu, který už je v repositáři




                                                      Verzování kódu s Gitem
ZÁKLADNÍ WORKFLOW

Checkout historické verze celého projektu

$ git log ‐‐oneline
d427f2a Change                     master^, v.0.1, origin/susan, atd
e82162c Initial commit

$ git checkout e82162c
Note: moving to 'e82162c' which isn't a local branch
If 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 history
e82162c Initial commit

$ git checkout master


                                                                  Verzování kódu s Gitem
POKROČILÉ WORKFLOW

Návrat „o krok zpět“




$ git log ‐‐oneline
d427f2a Change
e82162c Initial commit

$ git reset HEAD^ ‐‐hard
HEAD is now at e82162c Initial commit




                                        Verzování kódu s Gitem
$ git log ‐‐oneline
e82162c Initial commit
POKROČILÉ WORKFLOW

Návrat „zase zpátky“


$ git reset HEAD^ ‐‐hard
HEAD is now at e82162c Initial commit
$ git log ‐‐oneline
e82162c Initial commit


$ cat .git/ORIG_HEAD
d427f2a0ec416986645d6e797963711eea90c6a

$ git reflog
2b9afb5 HEAD@{0}: HEAD^: updating HEAD
d427f2a HEAD@{1}: commit: Change

$ git reset d427f2a ‐‐hard
HEAD is now at d427f2a Change




                                          Verzování kódu s Gitem
$ git rebase ‐‐interactive




                             Verzování kódu s Gitem
7   Sdílení repositáře a synchronizace




                                         Verzování kódu s Gitem
SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE

Zřízení sdíleného repositáře



$ ssh example.com

user@example.com: cd /path/to/git/repos

user@example.com: mkdir new_repository.git

user@example.com: $ git init ‐‐bare ‐‐shared=true




                                                    Verzování kódu s Gitem
SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE

Zřízení lokální kopie sdíleného repositáře



$ cd /path/to/local/projects

# Pokud inicializujeme projekt od nuly
$ git clone user@example.com:/path/to/git/repos/new_repository.git
$ git clone user@example.com:/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 user@example.com:/path/to/git/repos/new_repository.git




                                                               Verzování kódu s Gitem
SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE

Konfigurace vzdáleného repositáře




$ git remote show origin
* remote origin
  Fetch URL: user@example.com:/path/to/git/repos/new_repository.git
  Push  URL: user@example.com:/path/to/git/repos/new_repository.git
  HEAD branch: (unknown)




                                                               Verzování kódu s Gitem
SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE

Konfigurace vzdáleného repositáře



$ cat .git/config
# ...
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = user@example.com:/path/to/git/repos/new_repository.git
[branch "master"]
    remote = origin
    merge = refs/heads/master




                                                               Verzování kódu s Gitem
SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE

Zřízení lokální kopie sdíleného repositáře




$ git   push origin master
Counting 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 user@example.com:/path/to/git/repos/new_repository.git
 * [new branch]      master ‐> master




                                                            Verzování kódu s Gitem
SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE

Zřízení lokální kopie sdíleného repositáře




$ git   pull origin master
remote: 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 user@example.com:/path/to/git/repos/new_repository.git
 * branch            master     ‐> FETCH_HEAD




                                                              Verzování kódu s Gitem
SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE

Základní workflow sdílení a synchronizace


   $ ssh user@example.com '(cd /repos/ && mkdir new_repo.git && cd 
   new_repo.git && git init ‐‐bare ‐‐shared=true)'

   $ cd existing_project

   $ git remote add origin user@example.com:/repos/new_repo.git
                                     Replay
   $ git remote show origin

   $ cat .git/config

   $ git push origin master




   03__sharing_repositories.sh
                                                                  Verzování kódu s Gitem
SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE

Synchronizace repositářů


$ 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
SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE

Synchronizace repositářů




                                     Verzování kódu s Gitem
8   Git je distribuovaný




                           Verzování kódu s Gitem
VERZOVACÍ SYSTÉMY

Taxonomie (delta/snapshot, local/centralized/distributed)
                             source control taxonomy

                         local          rcs



           delta
                      centralized       cvs         svn         perforce
          storage



                      distributed      darcs      mercurial



                                                       time
                         local          cp -r
                                                      machine


           DAG
                      centralized
          storage
                                                                           bitkeeper

                      distributed       git           bazzar




Scott Chacon, Getting Git (RailsConf 2008)
http://www.slideshare.net/chacon/getting-git/67                                        Verzování kódu s Gitem
GIT JE DISTRIBUOVANÝ

Co znamená, že 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
GIT JE DISTRIBUOVANÝ

Co znamená, že 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
GIT JE DISTRIBUOVANÝ

Co znamená, že Git je „distribuovaný“




                       Workflows!
   http://www.slideshare.net/chacon/getting-git/474




                                          Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer




                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer




                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




        Krycí jméno:
        „Jako v Subversion“
         developer             developer        developer




                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer



                            git clone
                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer



                            git push
                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer



                            git push
                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer



                            git push
                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer


               git fetch && git merge
                      git pull
                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer



                            git push
                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Generál a pobočníci


    dictator                                        blessed repository




                       lieutenant

  lieutenant




  developer                 developer   developer                developer




                                                             Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Generál a pobočníci


    dictator                                        blessed repository




                       lieutenant

  lieutenant




  developer                 developer   developer                developer




                                                             Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Generál a pobočníci




                            Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Generál a pobočníci


    dictator                                           blessed repository




                       lieutenant

  lieutenant




  developer                 developer      developer                developer


                                    git clone
                                                                Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Generál a pobočníci


    dictator                                        blessed repository




                       lieutenant

  lieutenant




  developer                 developer   developer                developer


               git fetch && git merge
                                                             Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Generál a pobočníci


    dictator                                        blessed repository




                       lieutenant

  lieutenant




  developer                 developer   developer                developer


               git fetch && git merge
                                                             Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Generál a pobočníci


    dictator                                        blessed repository




                       lieutenant

  lieutenant




  developer                 developer   developer                developer


               git fetch && git merge
                                                             Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Generál a pobočníci


    dictator                                           blessed repository




                       lieutenant

  lieutenant




  developer                 developer      developer                developer


                                    git push
                                                                Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Generál a pobočníci


    dictator                                           blessed repository




                       lieutenant

  lieutenant




  developer                 developer      developer                developer


                                    git fetch
                                                                Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor




       blessed
      repository            developer   developer
                              public      public




     integration            developer   developer
      manager                private     private



                                          Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor




       blessed
      repository            developer   developer
                              public      public




     integration            developer   developer
      manager                private     private



                                          Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor


    /schacon/ticgit
                                      github.com
                            /yob/ticgit    /pope/ticgit
       blessed
      repository            developer      developer
                              public         public




     integration            developer      developer
      manager                private        private



                                              Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor


    /schacon/ticgit
                                      github.com
                            /yob/ticgit             /pope/ticgit
       blessed
      repository            developer               developer
                              public                  public
                                          „forks“



     integration            developer               developer
      manager                private                 private



                                                       Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor




       blessed
      repository              developer   developer
                                public      public




     integration              developer   developer
      manager                  private     private


                            git push
                                            Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor




       blessed
      repository               developer   developer
                                 public      public




     integration               developer   developer
      manager                   private     private


                            git clone
                                             Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor




       blessed
      repository              developer   developer
                                public      public




     integration              developer   developer
      manager                  private     private


                            git push
                                            Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor




       blessed
      repository            developer   developer
                              public      public




     integration            developer   developer
      manager                private     private


               git fetch && git merge
                                          Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor




       blessed
      repository              developer   developer
                                public      public




     integration              developer   developer
      manager                  private     private


                            git push
                                            Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor




       blessed
      repository            developer   developer
                              public      public




     integration            developer   developer
      manager                private     private


  git fetch && git rebase / merge
                                          Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Koordinátor




       blessed
      repository              developer   developer
                                public      public




     integration              developer   developer
      manager                  private     private


                            git push
                                            Verzování kódu s Gitem
9   Git podporuje paralelní vývoj




                                    Verzování kódu s Gitem
„Softwarové inženýrství“
„Softwarové inženýrství“
               No nevim.
BRANCH & MERGE

K čemu jsou nám užitečné větve (branches)


In the ideal world, there are no bugs, no schedule crunches, no personnel changes, no
market shis, and no technology revolutions. Soware 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
BRANCH & MERGE

„Klasický scénář“




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
BRANCH & MERGE

Co je v Gitu branch?




40 písmenek v refs/heads


$ find .git/refs/heads ‐type f
.git/refs/heads/master

$ cat .git/refs/heads/master 
87c93da440b099856fe3437c5bb269f01fb95379




                                           Verzování kódu s Gitem
BRANCH & MERGE

Git a branch workflow




(...) the git behavior explicitly encourages you to not have to decide before-
the-fact to create a branch – it may be that only aer 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




http://thread.gmane.org/gmane.comp.version-control.git/126568/focus=126571   Verzování kódu s Gitem
BRANCH & MERGE

Základní workflow




 1




http://progit.org/book/ch3-2.html   Verzování kódu s Gitem
BRANCH & MERGE

Základní workflow




 2




$ git checkout ‐b iss53




http://progit.org/book/ch3-2.html   Verzování kódu s Gitem
BRANCH & MERGE

Základní workflow




 3




$ git commit ‐m "Pridan formular pro zmenu hesla uzivatele"




http://progit.org/book/ch3-2.html                             Verzování kódu s Gitem
BRANCH & MERGE

Základní workflow




4




$ git checkout ‐b hotfix
$ git commit ‐m "Oprava registracniho formulare na homepage"



http://progit.org/book/ch3-2.html                              Verzování kódu s Gitem
BRANCH & MERGE

Základní workflow




 5




$ git checkout master
$ git merge hotfix
$ git branch ‐d hotfix


http://progit.org/book/ch3-2.html   Verzování kódu s Gitem
BRANCH & MERGE

Základní workflow




 6




$ git commit ‐m "Dokonceni formulare na zmenu hesla"




http://progit.org/book/ch3-2.html                      Verzování kódu s Gitem
BRANCH & MERGE

Základní workflow




 7




$ git checkout master
$ git merge iss53
  Merge made by recursive.


http://progit.org/book/ch3-2.html   Verzování kódu s Gitem
BRANCH & MERGE

Základní workflow




 8




$ git checkout master
$ git merge iss53
  Merge made by recursive.


http://progit.org/book/ch3-2.html   Verzování kódu s Gitem
BRANCH & MERGE

„Merge hell“




„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…“

http://www.spearce.org/2007/07/difficult-gitk-graphs.html                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




        Krycí jméno:
        „Jako v Subversion“
         developer             developer        developer




                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer



                            git push
                                                    Verzování kódu s Gitem
MOŽNOSTI WORKFLOW S GITEM

Centralizované worflow


                            shared repository




         developer             developer        developer


               git fetch && git merge
                      git pull
                                                    Verzování kódu s Gitem
BRANCH & MERGE

Příklad workflow s rebase: topic branch

$ 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


                                                          Verzování kódu s Gitem
BRANCH & MERGE

Rebase




                                    $ git rebase master   $ git merge experiment




 $ git merge experiment




http://progit.org/book/ch3-6.html                                 Verzování kódu s Gitem
BRANCH & MERGE

Rozdíly mezi větvemi, mazání větví

$ 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"



                                                             Verzování kódu s Gitem
10   Git je flexibilní




                         Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Integrace se Subversion


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


$ git svn init ‐s http://example.com/svn/my_proj
$ git svn fetch
$ git svn rebase
$ git svn dcommit



http://git.or.cz/course/svn.html
http://gitready.com/beginner/2009/02/04/converting-from-svn.html
http://www.kernel.org/pub/software/scm/git/docs/git-svn.html

                                                                   Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Konfigurace, aliasy


$ 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




                                                                   Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Interaktivní příprava commitu

                     $ git add ‐p




                                    Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Interaktivní příprava commitu




                                Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Interaktivní rebase

$ git rebase ‐‐interactive 01df473^




                                      Oprava commitů v historii
                                      Sloučení více commitů do jednoho
                                      Odstranění commitů

                                                          Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Surový přepis historie repositáře


$ 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="lubomir@roztrzity.org";
  fi
' -f




                                                Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Hooks
$ 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
GIT JE FLEXIBILNÍ

Binary bug search


                                        Bad   Good


$ cd repos/webexpo_planner_with_error


$ git bisect start HEAD v1.0
$ git bisect run rake test




                                                     Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Speciální diff nástroj



                    Dokument Microsoft Word
                    diff ‐‐git a/document1.doc b/document1.doc
                    index dfe0545..ff0d2d6 100644
                    Binary 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




                                                                Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Git jako toolkit




                    http://ephemera.karmi.cz/post/173776746/post-scriptum-k-setkani-na-tema-verzovaci-systemy


                                                                                        Verzování kódu s Gitem
GIT JE FLEXIBILNÍ

Deployment




➡          Hooks
➡          Capistrano (www.capify.org)
➡          Continuous Integration server




                                           Verzování kódu s Gitem
11   Git hosting




                   Verzování kódu s Gitem
GIT HOSTING

Možnosti




  1      $ ssh my‐box‐somewhere‐on‐the.net



  2



  3




                                             Verzování kódu s Gitem
GIT HOSTING
                                        Fork queue
Github.com




              „Facebook“



                                          Downloads




                      Network
                                gist.github.com s Gitem
                                        Verzování kódu
GIT HOSTING

Githosting.cz                                                                            Aktivita
                                                                                      v repositářích




                          Dashboard                                                            Prohlížeč
                                                                                                obsahu
                                                                                              repositáře



                      Prohlížeč
                       historie




     Githosting vs Github: Více repositářů | Méně funkcí | Umístění v ČR | Česká fakturace a podpora
                                                                                       Verzování kódu s Gitem
GIT ŠKOLENÍ

Listopad/Prosinec 2009




               www.git-fu.cz

                               Verzování kódu s Gitem

Más contenido relacionado

Similar a Verzovani kodu s Gitem (Karel Minarik)

Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....
Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....
Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....PeckaDesign.cz
 
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]Vašek Purchart
 
Lex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
Lex Vjatkin + Ondřej procházka: Jak to děláme ve WikidiLex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
Lex Vjatkin + Ondřej procházka: Jak to děláme ve WikidiDevelcz
 
Proč používat GitHub?
Proč používat GitHub?Proč používat GitHub?
Proč používat GitHub?Dominik Salvet
 
Jira DevOps Cloud
Jira DevOps CloudJira DevOps Cloud
Jira DevOps CloudOnlio
 
Workshop - Ruzicka - Webové mapy prakticky
Workshop - Ruzicka - Webové mapy praktickyWorkshop - Ruzicka - Webové mapy prakticky
Workshop - Ruzicka - Webové mapy praktickyswenney
 
Hacknutý Drupal web. A co teď?
Hacknutý Drupal web. A co teď?Hacknutý Drupal web. A co teď?
Hacknutý Drupal web. A co teď?Radim Klaška
 
Google Tag Manager a analytika ve WordPress
Google Tag Manager a analytika ve WordPressGoogle Tag Manager a analytika ve WordPress
Google Tag Manager a analytika ve WordPressVladimír Smitka
 
Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]Tomáš Kukol
 
Tipy a triky, best practices, deployment, testování
Tipy a triky, best practices, deployment, testováníTipy a triky, best practices, deployment, testování
Tipy a triky, best practices, deployment, testováníRadim Klaška
 
Agile developer
Agile developerAgile developer
Agile developerOnlio
 
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScriptČtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScriptCtvrtkoncz
 
20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitněJiří Mareš
 
Moderní Server Side UI Rendering v PHP
Moderní Server Side UI Rendering v PHPModerní Server Side UI Rendering v PHP
Moderní Server Side UI Rendering v PHPMichalMajer2
 
BIM-Fórum 2015 – Workshop – Týmový projekt, fáze a rekonstrukce
BIM-Fórum 2015 – Workshop – Týmový projekt, fáze a rekonstrukceBIM-Fórum 2015 – Workshop – Týmový projekt, fáze a rekonstrukce
BIM-Fórum 2015 – Workshop – Týmový projekt, fáze a rekonstrukceBIM Fórum
 
Odborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum MobileOdborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum MobileProfinit
 

Similar a Verzovani kodu s Gitem (Karel Minarik) (20)

Git
GitGit
Git
 
Git CZ
Git CZGit CZ
Git CZ
 
GIT
GITGIT
GIT
 
Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....
Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....
Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....
 
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
 
Lex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
Lex Vjatkin + Ondřej procházka: Jak to děláme ve WikidiLex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
Lex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
 
Proč používat GitHub?
Proč používat GitHub?Proč používat GitHub?
Proč používat GitHub?
 
Jira DevOps Cloud
Jira DevOps CloudJira DevOps Cloud
Jira DevOps Cloud
 
Workshop - Ruzicka - Webové mapy prakticky
Workshop - Ruzicka - Webové mapy praktickyWorkshop - Ruzicka - Webové mapy prakticky
Workshop - Ruzicka - Webové mapy prakticky
 
Hacknutý Drupal web. A co teď?
Hacknutý Drupal web. A co teď?Hacknutý Drupal web. A co teď?
Hacknutý Drupal web. A co teď?
 
Google Tag Manager a analytika ve WordPress
Google Tag Manager a analytika ve WordPressGoogle Tag Manager a analytika ve WordPress
Google Tag Manager a analytika ve WordPress
 
Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]
 
06 Cvičení.pptx
06 Cvičení.pptx06 Cvičení.pptx
06 Cvičení.pptx
 
Tipy a triky, best practices, deployment, testování
Tipy a triky, best practices, deployment, testováníTipy a triky, best practices, deployment, testování
Tipy a triky, best practices, deployment, testování
 
Agile developer
Agile developerAgile developer
Agile developer
 
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScriptČtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
 
20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně
 
Moderní Server Side UI Rendering v PHP
Moderní Server Side UI Rendering v PHPModerní Server Side UI Rendering v PHP
Moderní Server Side UI Rendering v PHP
 
BIM-Fórum 2015 – Workshop – Týmový projekt, fáze a rekonstrukce
BIM-Fórum 2015 – Workshop – Týmový projekt, fáze a rekonstrukceBIM-Fórum 2015 – Workshop – Týmový projekt, fáze a rekonstrukce
BIM-Fórum 2015 – Workshop – Týmový projekt, fáze a rekonstrukce
 
Odborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum MobileOdborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum Mobile
 

Más de Karel Minarik

Vizualizace dat a D3.js [EUROPEN 2014]
Vizualizace dat a D3.js [EUROPEN 2014]Vizualizace dat a D3.js [EUROPEN 2014]
Vizualizace dat a D3.js [EUROPEN 2014]Karel Minarik
 
Elasticsearch (Rubyshift 2013)
Elasticsearch (Rubyshift 2013)Elasticsearch (Rubyshift 2013)
Elasticsearch (Rubyshift 2013)Karel Minarik
 
Elasticsearch in 15 Minutes
Elasticsearch in 15 MinutesElasticsearch in 15 Minutes
Elasticsearch in 15 MinutesKarel Minarik
 
Realtime Analytics With Elasticsearch [New Media Inspiration 2013]
Realtime Analytics With Elasticsearch [New Media Inspiration 2013]Realtime Analytics With Elasticsearch [New Media Inspiration 2013]
Realtime Analytics With Elasticsearch [New Media Inspiration 2013]Karel Minarik
 
Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]Karel Minarik
 
Shell's Kitchen: Infrastructure As Code (Webexpo 2012)
Shell's Kitchen: Infrastructure As Code (Webexpo 2012)Shell's Kitchen: Infrastructure As Code (Webexpo 2012)
Shell's Kitchen: Infrastructure As Code (Webexpo 2012)Karel Minarik
 
Elastic Search: Beyond Ordinary Fulltext Search (Webexpo 2011 Prague)
Elastic Search: Beyond Ordinary Fulltext Search (Webexpo 2011 Prague)Elastic Search: Beyond Ordinary Fulltext Search (Webexpo 2011 Prague)
Elastic Search: Beyond Ordinary Fulltext Search (Webexpo 2011 Prague)Karel Minarik
 
Your Data, Your Search, ElasticSearch (EURUKO 2011)
Your Data, Your Search, ElasticSearch (EURUKO 2011)Your Data, Your Search, ElasticSearch (EURUKO 2011)
Your Data, Your Search, ElasticSearch (EURUKO 2011)Karel Minarik
 
Redis — The AK-47 of Post-relational Databases
Redis — The AK-47 of Post-relational DatabasesRedis — The AK-47 of Post-relational Databases
Redis — The AK-47 of Post-relational DatabasesKarel Minarik
 
CouchDB – A Database for the Web
CouchDB – A Database for the WebCouchDB – A Database for the Web
CouchDB – A Database for the WebKarel Minarik
 
Spoiling The Youth With Ruby (Euruko 2010)
Spoiling The Youth With Ruby (Euruko 2010)Spoiling The Youth With Ruby (Euruko 2010)
Spoiling The Youth With Ruby (Euruko 2010)Karel Minarik
 
Představení Ruby on Rails [Junior Internet]
Představení Ruby on Rails [Junior Internet]Představení Ruby on Rails [Junior Internet]
Představení Ruby on Rails [Junior Internet]Karel Minarik
 
Efektivni vyvoj webovych aplikaci v Ruby on Rails (Webexpo)
Efektivni vyvoj webovych aplikaci v Ruby on Rails (Webexpo)Efektivni vyvoj webovych aplikaci v Ruby on Rails (Webexpo)
Efektivni vyvoj webovych aplikaci v Ruby on Rails (Webexpo)Karel Minarik
 
Úvod do Ruby on Rails
Úvod do Ruby on RailsÚvod do Ruby on Rails
Úvod do Ruby on RailsKarel Minarik
 
Úvod do programování 7
Úvod do programování 7Úvod do programování 7
Úvod do programování 7Karel Minarik
 
Úvod do programování 6
Úvod do programování 6Úvod do programování 6
Úvod do programování 6Karel Minarik
 
Úvod do programování 5
Úvod do programování 5Úvod do programování 5
Úvod do programování 5Karel Minarik
 
Úvod do programování 4
Úvod do programování 4Úvod do programování 4
Úvod do programování 4Karel Minarik
 
Úvod do programování 3 (to be continued)
Úvod do programování 3 (to be continued)Úvod do programování 3 (to be continued)
Úvod do programování 3 (to be continued)Karel Minarik
 
Historie programovacích jazyků
Historie programovacích jazykůHistorie programovacích jazyků
Historie programovacích jazykůKarel Minarik
 

Más de Karel Minarik (20)

Vizualizace dat a D3.js [EUROPEN 2014]
Vizualizace dat a D3.js [EUROPEN 2014]Vizualizace dat a D3.js [EUROPEN 2014]
Vizualizace dat a D3.js [EUROPEN 2014]
 
Elasticsearch (Rubyshift 2013)
Elasticsearch (Rubyshift 2013)Elasticsearch (Rubyshift 2013)
Elasticsearch (Rubyshift 2013)
 
Elasticsearch in 15 Minutes
Elasticsearch in 15 MinutesElasticsearch in 15 Minutes
Elasticsearch in 15 Minutes
 
Realtime Analytics With Elasticsearch [New Media Inspiration 2013]
Realtime Analytics With Elasticsearch [New Media Inspiration 2013]Realtime Analytics With Elasticsearch [New Media Inspiration 2013]
Realtime Analytics With Elasticsearch [New Media Inspiration 2013]
 
Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]Elasticsearch And Ruby [RuPy2012]
Elasticsearch And Ruby [RuPy2012]
 
Shell's Kitchen: Infrastructure As Code (Webexpo 2012)
Shell's Kitchen: Infrastructure As Code (Webexpo 2012)Shell's Kitchen: Infrastructure As Code (Webexpo 2012)
Shell's Kitchen: Infrastructure As Code (Webexpo 2012)
 
Elastic Search: Beyond Ordinary Fulltext Search (Webexpo 2011 Prague)
Elastic Search: Beyond Ordinary Fulltext Search (Webexpo 2011 Prague)Elastic Search: Beyond Ordinary Fulltext Search (Webexpo 2011 Prague)
Elastic Search: Beyond Ordinary Fulltext Search (Webexpo 2011 Prague)
 
Your Data, Your Search, ElasticSearch (EURUKO 2011)
Your Data, Your Search, ElasticSearch (EURUKO 2011)Your Data, Your Search, ElasticSearch (EURUKO 2011)
Your Data, Your Search, ElasticSearch (EURUKO 2011)
 
Redis — The AK-47 of Post-relational Databases
Redis — The AK-47 of Post-relational DatabasesRedis — The AK-47 of Post-relational Databases
Redis — The AK-47 of Post-relational Databases
 
CouchDB – A Database for the Web
CouchDB – A Database for the WebCouchDB – A Database for the Web
CouchDB – A Database for the Web
 
Spoiling The Youth With Ruby (Euruko 2010)
Spoiling The Youth With Ruby (Euruko 2010)Spoiling The Youth With Ruby (Euruko 2010)
Spoiling The Youth With Ruby (Euruko 2010)
 
Představení Ruby on Rails [Junior Internet]
Představení Ruby on Rails [Junior Internet]Představení Ruby on Rails [Junior Internet]
Představení Ruby on Rails [Junior Internet]
 
Efektivni vyvoj webovych aplikaci v Ruby on Rails (Webexpo)
Efektivni vyvoj webovych aplikaci v Ruby on Rails (Webexpo)Efektivni vyvoj webovych aplikaci v Ruby on Rails (Webexpo)
Efektivni vyvoj webovych aplikaci v Ruby on Rails (Webexpo)
 
Úvod do Ruby on Rails
Úvod do Ruby on RailsÚvod do Ruby on Rails
Úvod do Ruby on Rails
 
Úvod do programování 7
Úvod do programování 7Úvod do programování 7
Úvod do programování 7
 
Úvod do programování 6
Úvod do programování 6Úvod do programování 6
Úvod do programování 6
 
Úvod do programování 5
Úvod do programování 5Úvod do programování 5
Úvod do programování 5
 
Úvod do programování 4
Úvod do programování 4Úvod do programování 4
Úvod do programování 4
 
Úvod do programování 3 (to be continued)
Úvod do programování 3 (to be continued)Úvod do programování 3 (to be continued)
Úvod do programování 3 (to be continued)
 
Historie programovacích jazyků
Historie programovacích jazykůHistorie programovacích jazyků
Historie programovacích jazyků
 

Verzovani kodu s Gitem (Karel Minarik)

  • 1. Verzování kódu s Gitem Více než „zálohování a sdílení“ Karel Minařík
  • 2. 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 nahttp://blog.karmi.cz → http://github.com/karmi → karmi.cz Verzování kódu s Gitem
  • 3. 1 Vy a verzovací systémy Verzování kódu s Gitem
  • 4. Používáte verzovací systém? Verzování kódu s Gitem
  • 5. $ 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
  • 7. Git ‣ Mercurial ‣ Subversion ‣ CVS ‣ Jiný (Perforce, DARCS, RCS, ...) Verzování kódu s Gitem
  • 8. 2 Principy verzovacích systémů Verzování kódu s Gitem
  • 9. VERZOVACÍ SYSTÉMY Verzovací systémy obecně Version Control System, VCS Software 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)… $ git clone git://git.kernel.org/pub/scm/git/git.git && git log ‐‐reverse ‐‐shortstat commit e83c5163316f89bfbde7d9ab23ca2e25604af290 Author: Linus Torvalds <torvalds@ppc970.osdl.org> 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
  • 10. VERZOVACÍ SYSTÉMY Základní pojmy 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
  • 11. VERZOVACÍ SYSTÉMY Základní workflow Working copy Commit Repository Verzování kódu s Gitem
  • 12. VERZOVACÍ SYSTÉMY K čemu je nám dobrý verzovací systém Zálohování a obnovení ze zálohy Potř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í, synchronizace Potř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ývoj Potř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 obsahu Potř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č. Deployment Potř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
  • 13. VERZOVACÍ SYSTÉMY Taxonomie (delta vs. snapshot) C1 C2 C3 C4 C5 file A !1 !2 delta storage file B !1 !2 file C !1 !2 !3 C1 C2 C3 C4 C5 DAG A A1 A1 A2 A2 storage B B B B1 B2 C C1 C2 C2 C3 Scott Chacon, Getting Git (RailsConf 2008) http://www.slideshare.net/chacon/getting-git/56 Verzování kódu s Gitem
  • 14. VERZOVACÍ SYSTÉMY Taxonomie (delta/snapshot, local/centralized/distributed) source control taxonomy local rcs delta centralized cvs svn perforce storage distributed darcs mercurial time local cp -r machine DAG centralized storage bitkeeper distributed git bazzar Scott Chacon, Getting Git (RailsConf 2008) http://www.slideshare.net/chacon/getting-git/67 Verzování kódu s Gitem
  • 15. VERZOVACÍ SYSTÉMY Subversion (poprvé a naposledy :) 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
  • 16. CO JE GIT? Přístup ke Gitu 1 Git je extrémně flexibilní 2 Git je způsob práce Verzování kódu s Gitem
  • 17. 3 Co je Git? Verzování kódu s Gitem
  • 18. Git — stupid content tracker Verzování kódu s Gitem
  • 19. git(1) Manual Page NAME git - the stupid content tracker SYNOPSIS git [--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
  • 20. stupid Verzování kódu s Gitem
  • 22. Re: Merge with git-pasky II. From: Linus Torvalds <torvalds@osdl.org> Date: 2005-04-27 06:58:44 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. Verzování kódu s Gitem
  • 23. Non-clever Verzování kódu s Gitem
  • 24. CO JE GIT? Základní vlastnosti 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
  • 25. CO JE GIT? Kdo používá Git Verzování kódu s Gitem
  • 26. CO JE GIT? Dokumentace a komunita http://whygitisbetterthanx.com http://whygitisbetterthanx.karmi.cz Verzování kódu s Gitem
  • 27. CO JE GIT? Dokumentace a komunita www.git-scm.com Verzování kódu s Gitem
  • 28. CO JE GIT? Dokumentace a komunita book.git-scm.com Verzování kódu s Gitem
  • 29. CO JE GIT? Dokumentace a komunita www.progit.org/book Verzování kódu s Gitem
  • 30. CO JE GIT? Dokumentace a komunita www.gitcasts.com/posts/railsconf-git-talk Verzování kódu s Gitem
  • 31. CO JE GIT? Dokumentace a komunita www.kernel.org/pub/software/scm/git/docs/user-manual.html Verzování kódu s Gitem
  • 32. CO JE GIT? Dokumentace a komunita www.newartisans.com/2008/04/git-from-the-bottom-up.html Verzování kódu s Gitem
  • 33. CO JE GIT? Dokumentace a komunita www.stackoverflow.com/questions/tagged/git Verzování kódu s Gitem
  • 34. CO JE GIT? Dokumentace a komunita www.stackoverflow.com/questions/tagged/git Verzování kódu s Gitem
  • 35. GIT Dokumentace a komunita www.stackoverflow.com/questions/tagged/git Verzování kódu s Gitem
  • 36. GIT Dokumentace a komunita www.stackoverflow.com/questions/tagged/git Verzování kódu s Gitem
  • 37. GIT Dokumentace a komunita www.stackoverflow.com/questions/tagged/git Verzování kódu s Gitem
  • 38. 4 Git je jednoduchý Verzování kódu s Gitem
  • 39. CO JE GIT? Instalace $ 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
  • 40. CO JE GIT? Integrace s IDE Verzování kódu s Gitem
  • 41. CO JE GIT? GUI nebo CLI? Verzování kódu s Gitem
  • 42. CO JE GIT? Nastavení identity uživatele $ git config ‐‐global user.name  "Josef Novák" $ git config ‐‐global user.email "jnovak@example.com" Verzování kódu s Gitem
  • 43. CO JE GIT? Nastavení identity uživatele $ cat ~/.gitconfig [user] name = Josef Novák email = jnovak@example.com Verzování kódu s Gitem
  • 44. CO JE GIT? Git je stupidní Git je stupidní $ cat ~/.gitconfig [user] Content‐Type: text/plain name = Josef Novák email = jnovak@example.com Verzování kódu s Gitem
  • 45. CO JE GIT? Jak Git ukládá obsah? 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
  • 46. CO JE GIT? Jak Git ukládá obsah? $ mkdir newrepo $ cd newrepo $ git init $ echo "Hello, World" > file.txt $ cat file.txt $ git status Replay $ git add file.txt $ git status $ git commit ‐m "Initial commit" $ git log ‐‐stat 01__hello_world_git.sh Verzování kódu s Gitem
  • 47. CO JE GIT? Jak Git ukládá obsah? $ 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
  • 48. CO JE GIT? Jak Git ukládá obsah? .git/objects/38/bca7264fc8b8340b560e19de3c780ae0a4b60d .git/objects/76/bf39ab0db46b183b49d9f707d86e580f78e932 Commit Tree 38bca7... 76bf39... tree 76bf39... blob 3fa0d4... file.txt parent N/A author Karel ... message Initial commit Blob 3fa0d4... Hello, World Tag 7d18cb... .git/objects/3f/a0d4b98289a95a7cd3a45c9545e622718f8d2b object 38bca7... type commit tag v.0.1 tagger Karel ... .git/objects/7d/18cb53260cd51497cd70ed8cc00ce8094be681 Verzování kódu s Gitem
  • 49. CO JE GIT? Jak Git ukládá obsah? 2 Commit Tree 799659... ae2593... tree ae2593... blob 3fa0d4... file.txt parent 3fa0d4... blob a4ebe0... other_file.txt author Karel ... message Adding somefile Blob Commit a4ebe0... Tree 1 38bca7... 76bf39... Lorem ipsum dolor tree 3fa0d4... blob 3fa0d4... file.txt parent N/A author Karel ... message Initial commit Tag 7d18cb... Blob 3fa0d4... object 38bca7... type commit tag v.0.1 Hello, World tagger Karel ... Verzování kódu s Gitem
  • 50. Základní workflow Verzování kódu s Gitem
  • 53. ZÁKLADNÍ WORKFLOW Připravení obsahu ke commitu $ git status # On branch master # # Initial commit # # Untracked files: #   (use "git add <file>..." to include in what will be committed) # #  somefile.txt nothing added to commit but untracked files present (use "git add" to  track) Verzování kódu s Gitem
  • 54. ZÁKLADNÍ WORKFLOW Připravení obsahu ke commitu $ git add somefolder $ git add somefile.txt $ git add . Verzování kódu s Gitem
  • 55. ZÁKLADNÍ WORKFLOW Připravení obsahu ke commitu $ 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
  • 56. ZÁKLADNÍ WORKFLOW Připravení obsahu ke commitu $ git rm some_folder/not_this_file.txt ‐‐cached Verzování kódu s Gitem
  • 57. ZÁKLADNÍ WORKFLOW Označení obsahu, který nechceme verzovat $ 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
  • 58. ZÁKLADNÍ WORKFLOW Uložení připravené revize do repositáře (commit) $ 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
  • 59. ZÁKLADNÍ WORKFLOW Uložení připravené revize do repositáře (commit) $ git add $ git commit Verzování kódu s Gitem
  • 60. Staging area (index) Verzování kódu s Gitem
  • 61. ZÁKLADNÍ WORKFLOW Staging area (index) Scott Chacon, Getting Git (Scotland On Rails 2009), p. 197 http://github.com/schacon/git-presentations/raw/master/sor09/GitTalk-SOR09.pdf Verzování kódu s Gitem
  • 62. ZÁKLADNÍ WORKFLOW Staging area (index) $ 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 Replay $ echo "How are you?" >> file.txt && cat ‐n file.txt $ git status $ git diff $ git diff ‐‐staged 02__staging_area.sh Verzování kódu s Gitem
  • 63. 5 Prohlížení historie Verzování kódu s Gitem
  • 67. ZÁKLADNÍ WORKFLOW Prohlížení a porovnávání revizí $ 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
  • 68. ZÁKLADNÍ WORKFLOW Identifikace revizí (commitů, snapshotů) 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 http://www.slideshare.net/chacon/getting-git/230 Verzování kódu s Gitem
  • 69. 6 Práce s historií a „undo“ Verzování kódu s Gitem
  • 70. ZÁKLADNÍ WORKFLOW Oprava předešlého commitu $ git add app/ $ git commit ‐m "Přidáno připojení k webservice" $ git status # Untracked files: Oops! #  config/webservice.ini $ git add config/webservice.ini $ git commit ‐‐amend Verzování kódu s Gitem
  • 71. ZÁKLADNÍ WORKFLOW Neměnte publikovanou, veřejnou historii ˇ $ git push origin master $ git merge hotfix Verzování kódu s Gitem
  • 72. ZÁKLADNÍ WORKFLOW Zrušení všech úprav v souboru $ 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
  • 73. ZÁKLADNÍ WORKFLOW Zrušení všech úprav v souboru Git si dává velký pozor, abyste nepřišli o data Ale pouze u obsahu, který už je v repositáři Verzování kódu s Gitem
  • 74. ZÁKLADNÍ WORKFLOW Checkout historické verze celého projektu $ git log ‐‐oneline d427f2a Change master^, v.0.1, origin/susan, atd e82162c Initial commit $ git checkout e82162c Note: moving to 'e82162c' which isn't a local branch If 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 history e82162c Initial commit $ git checkout master Verzování kódu s Gitem
  • 75. POKROČILÉ WORKFLOW Návrat „o krok zpět“ $ git log ‐‐oneline d427f2a Change e82162c Initial commit $ git reset HEAD^ ‐‐hard HEAD is now at e82162c Initial commit Verzování kódu s Gitem
  • 77. POKROČILÉ WORKFLOW Návrat „zase zpátky“ $ git reset HEAD^ ‐‐hard HEAD is now at e82162c Initial commit $ git log ‐‐oneline e82162c Initial commit $ cat .git/ORIG_HEAD d427f2a0ec416986645d6e797963711eea90c6a $ git reflog 2b9afb5 HEAD@{0}: HEAD^: updating HEAD d427f2a HEAD@{1}: commit: Change $ git reset d427f2a ‐‐hard HEAD is now at d427f2a Change Verzování kódu s Gitem
  • 78. $ git rebase ‐‐interactive Verzování kódu s Gitem
  • 79. 7 Sdílení repositáře a synchronizace Verzování kódu s Gitem
  • 80. SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE Zřízení sdíleného repositáře $ ssh example.com user@example.com: cd /path/to/git/repos user@example.com: mkdir new_repository.git user@example.com: $ git init ‐‐bare ‐‐shared=true Verzování kódu s Gitem
  • 81. SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE Zřízení lokální kopie sdíleného repositáře $ cd /path/to/local/projects # Pokud inicializujeme projekt od nuly $ git clone user@example.com:/path/to/git/repos/new_repository.git $ git clone user@example.com:/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 user@example.com:/path/to/git/repos/new_repository.git Verzování kódu s Gitem
  • 82. SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE Konfigurace vzdáleného repositáře $ git remote show origin * remote origin   Fetch URL: user@example.com:/path/to/git/repos/new_repository.git   Push  URL: user@example.com:/path/to/git/repos/new_repository.git   HEAD branch: (unknown) Verzování kódu s Gitem
  • 83. SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE Konfigurace vzdáleného repositáře $ cat .git/config # ... [remote "origin"]   fetch = +refs/heads/*:refs/remotes/origin/*   url = user@example.com:/path/to/git/repos/new_repository.git [branch "master"]   remote = origin   merge = refs/heads/master Verzování kódu s Gitem
  • 84. SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE Zřízení lokální kopie sdíleného repositáře $ git  push origin master Counting 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 user@example.com:/path/to/git/repos/new_repository.git  * [new branch]      master ‐> master Verzování kódu s Gitem
  • 85. SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE Zřízení lokální kopie sdíleného repositáře $ git  pull origin master remote: 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 user@example.com:/path/to/git/repos/new_repository.git  * branch            master     ‐> FETCH_HEAD Verzování kódu s Gitem
  • 86. SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE Základní workflow sdílení a synchronizace $ ssh user@example.com '(cd /repos/ && mkdir new_repo.git && cd  new_repo.git && git init ‐‐bare ‐‐shared=true)' $ cd existing_project $ git remote add origin user@example.com:/repos/new_repo.git Replay $ git remote show origin $ cat .git/config $ git push origin master 03__sharing_repositories.sh Verzování kódu s Gitem
  • 87. SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE Synchronizace repositářů $ 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
  • 88. SDÍLENÍ REPOSITÁŘE A SYNCHRONIZACE Synchronizace repositářů Verzování kódu s Gitem
  • 89. 8 Git je distribuovaný Verzování kódu s Gitem
  • 90. VERZOVACÍ SYSTÉMY Taxonomie (delta/snapshot, local/centralized/distributed) source control taxonomy local rcs delta centralized cvs svn perforce storage distributed darcs mercurial time local cp -r machine DAG centralized storage bitkeeper distributed git bazzar Scott Chacon, Getting Git (RailsConf 2008) http://www.slideshare.net/chacon/getting-git/67 Verzování kódu s Gitem
  • 91. GIT JE DISTRIBUOVANÝ Co znamená, že 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
  • 92. GIT JE DISTRIBUOVANÝ Co znamená, že 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
  • 93. GIT JE DISTRIBUOVANÝ Co znamená, že Git je „distribuovaný“ Workflows! http://www.slideshare.net/chacon/getting-git/474 Verzování kódu s Gitem
  • 94. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer Verzování kódu s Gitem
  • 95. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer Verzování kódu s Gitem
  • 96. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository Krycí jméno: „Jako v Subversion“ developer developer developer Verzování kódu s Gitem
  • 97. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer git clone Verzování kódu s Gitem
  • 98. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer git push Verzování kódu s Gitem
  • 99. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer git push Verzování kódu s Gitem
  • 100. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer git push Verzování kódu s Gitem
  • 101. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer git fetch && git merge git pull Verzování kódu s Gitem
  • 102. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer git push Verzování kódu s Gitem
  • 103. MOŽNOSTI WORKFLOW S GITEM Generál a pobočníci dictator blessed repository lieutenant lieutenant developer developer developer developer Verzování kódu s Gitem
  • 104. MOŽNOSTI WORKFLOW S GITEM Generál a pobočníci dictator blessed repository lieutenant lieutenant developer developer developer developer Verzování kódu s Gitem
  • 105. MOŽNOSTI WORKFLOW S GITEM Generál a pobočníci Verzování kódu s Gitem
  • 106. MOŽNOSTI WORKFLOW S GITEM Generál a pobočníci dictator blessed repository lieutenant lieutenant developer developer developer developer git clone Verzování kódu s Gitem
  • 107. MOŽNOSTI WORKFLOW S GITEM Generál a pobočníci dictator blessed repository lieutenant lieutenant developer developer developer developer git fetch && git merge Verzování kódu s Gitem
  • 108. MOŽNOSTI WORKFLOW S GITEM Generál a pobočníci dictator blessed repository lieutenant lieutenant developer developer developer developer git fetch && git merge Verzování kódu s Gitem
  • 109. MOŽNOSTI WORKFLOW S GITEM Generál a pobočníci dictator blessed repository lieutenant lieutenant developer developer developer developer git fetch && git merge Verzování kódu s Gitem
  • 110. MOŽNOSTI WORKFLOW S GITEM Generál a pobočníci dictator blessed repository lieutenant lieutenant developer developer developer developer git push Verzování kódu s Gitem
  • 111. MOŽNOSTI WORKFLOW S GITEM Generál a pobočníci dictator blessed repository lieutenant lieutenant developer developer developer developer git fetch Verzování kódu s Gitem
  • 112. MOŽNOSTI WORKFLOW S GITEM Koordinátor blessed repository developer developer public public integration developer developer manager private private Verzování kódu s Gitem
  • 113. MOŽNOSTI WORKFLOW S GITEM Koordinátor blessed repository developer developer public public integration developer developer manager private private Verzování kódu s Gitem
  • 114. MOŽNOSTI WORKFLOW S GITEM Koordinátor /schacon/ticgit github.com /yob/ticgit /pope/ticgit blessed repository developer developer public public integration developer developer manager private private Verzování kódu s Gitem
  • 115. MOŽNOSTI WORKFLOW S GITEM Koordinátor /schacon/ticgit github.com /yob/ticgit /pope/ticgit blessed repository developer developer public public „forks“ integration developer developer manager private private Verzování kódu s Gitem
  • 116. MOŽNOSTI WORKFLOW S GITEM Koordinátor blessed repository developer developer public public integration developer developer manager private private git push Verzování kódu s Gitem
  • 117. MOŽNOSTI WORKFLOW S GITEM Koordinátor blessed repository developer developer public public integration developer developer manager private private git clone Verzování kódu s Gitem
  • 118. MOŽNOSTI WORKFLOW S GITEM Koordinátor blessed repository developer developer public public integration developer developer manager private private git push Verzování kódu s Gitem
  • 119. MOŽNOSTI WORKFLOW S GITEM Koordinátor blessed repository developer developer public public integration developer developer manager private private git fetch && git merge Verzování kódu s Gitem
  • 120. MOŽNOSTI WORKFLOW S GITEM Koordinátor blessed repository developer developer public public integration developer developer manager private private git push Verzování kódu s Gitem
  • 121. MOŽNOSTI WORKFLOW S GITEM Koordinátor blessed repository developer developer public public integration developer developer manager private private git fetch && git rebase / merge Verzování kódu s Gitem
  • 122. MOŽNOSTI WORKFLOW S GITEM Koordinátor blessed repository developer developer public public integration developer developer manager private private git push Verzování kódu s Gitem
  • 123. 9 Git podporuje paralelní vývoj Verzování kódu s Gitem
  • 126. BRANCH & MERGE K čemu jsou nám užitečné větve (branches) In the ideal world, there are no bugs, no schedule crunches, no personnel changes, no market shis, and no technology revolutions. Soware 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
  • 127. BRANCH & MERGE „Klasický scénář“ 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
  • 128. BRANCH & MERGE Co je v Gitu branch? 40 písmenek v refs/heads $ find .git/refs/heads ‐type f .git/refs/heads/master $ cat .git/refs/heads/master  87c93da440b099856fe3437c5bb269f01fb95379 Verzování kódu s Gitem
  • 129. BRANCH & MERGE Git a branch workflow (...) the git behavior explicitly encourages you to not have to decide before- the-fact to create a branch – it may be that only aer 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 http://thread.gmane.org/gmane.comp.version-control.git/126568/focus=126571 Verzování kódu s Gitem
  • 130. BRANCH & MERGE Základní workflow 1 http://progit.org/book/ch3-2.html Verzování kódu s Gitem
  • 131. BRANCH & MERGE Základní workflow 2 $ git checkout ‐b iss53 http://progit.org/book/ch3-2.html Verzování kódu s Gitem
  • 132. BRANCH & MERGE Základní workflow 3 $ git commit ‐m "Pridan formular pro zmenu hesla uzivatele" http://progit.org/book/ch3-2.html Verzování kódu s Gitem
  • 133. BRANCH & MERGE Základní workflow 4 $ git checkout ‐b hotfix $ git commit ‐m "Oprava registracniho formulare na homepage" http://progit.org/book/ch3-2.html Verzování kódu s Gitem
  • 134. BRANCH & MERGE Základní workflow 5 $ git checkout master $ git merge hotfix $ git branch ‐d hotfix http://progit.org/book/ch3-2.html Verzování kódu s Gitem
  • 135. BRANCH & MERGE Základní workflow 6 $ git commit ‐m "Dokonceni formulare na zmenu hesla" http://progit.org/book/ch3-2.html Verzování kódu s Gitem
  • 136. BRANCH & MERGE Základní workflow 7 $ git checkout master $ git merge iss53   Merge made by recursive. http://progit.org/book/ch3-2.html Verzování kódu s Gitem
  • 137. BRANCH & MERGE Základní workflow 8 $ git checkout master $ git merge iss53   Merge made by recursive. http://progit.org/book/ch3-2.html Verzování kódu s Gitem
  • 138. BRANCH & MERGE „Merge hell“ „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…“ http://www.spearce.org/2007/07/difficult-gitk-graphs.html Verzování kódu s Gitem
  • 139. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository Krycí jméno: „Jako v Subversion“ developer developer developer Verzování kódu s Gitem
  • 140. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer git push Verzování kódu s Gitem
  • 141. MOŽNOSTI WORKFLOW S GITEM Centralizované worflow shared repository developer developer developer git fetch && git merge git pull Verzování kódu s Gitem
  • 142. BRANCH & MERGE Příklad workflow s rebase: topic branch $ 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 Verzování kódu s Gitem
  • 143. BRANCH & MERGE Rebase $ git rebase master $ git merge experiment $ git merge experiment http://progit.org/book/ch3-6.html Verzování kódu s Gitem
  • 144. BRANCH & MERGE Rozdíly mezi větvemi, mazání větví $ 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" Verzování kódu s Gitem
  • 145. 10 Git je flexibilní Verzování kódu s Gitem
  • 146. GIT JE FLEXIBILNÍ Integrace se Subversion 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 $ git svn init ‐s http://example.com/svn/my_proj $ git svn fetch $ git svn rebase $ git svn dcommit http://git.or.cz/course/svn.html http://gitready.com/beginner/2009/02/04/converting-from-svn.html http://www.kernel.org/pub/software/scm/git/docs/git-svn.html Verzování kódu s Gitem
  • 147. GIT JE FLEXIBILNÍ Konfigurace, aliasy $ 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 Verzování kódu s Gitem
  • 148. GIT JE FLEXIBILNÍ Interaktivní příprava commitu $ git add ‐p Verzování kódu s Gitem
  • 149. GIT JE FLEXIBILNÍ Interaktivní příprava commitu Verzování kódu s Gitem
  • 150. GIT JE FLEXIBILNÍ Interaktivní rebase $ git rebase ‐‐interactive 01df473^ Oprava commitů v historii Sloučení více commitů do jednoho Odstranění commitů Verzování kódu s Gitem
  • 151. GIT JE FLEXIBILNÍ Surový přepis historie repositáře $ 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="lubomir@roztrzity.org"; fi ' -f Verzování kódu s Gitem
  • 153. GIT JE FLEXIBILNÍ Binary bug search Bad Good $ cd repos/webexpo_planner_with_error $ git bisect start HEAD v1.0 $ git bisect run rake test Verzování kódu s Gitem
  • 154. GIT JE FLEXIBILNÍ Speciální diff nástroj Dokument Microsoft Word diff ‐‐git a/document1.doc b/document1.doc index dfe0545..ff0d2d6 100644 Binary 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 Verzování kódu s Gitem
  • 155. GIT JE FLEXIBILNÍ Git jako toolkit http://ephemera.karmi.cz/post/173776746/post-scriptum-k-setkani-na-tema-verzovaci-systemy Verzování kódu s Gitem
  • 156. GIT JE FLEXIBILNÍ Deployment ➡ Hooks ➡ Capistrano (www.capify.org) ➡ Continuous Integration server Verzování kódu s Gitem
  • 157. 11 Git hosting Verzování kódu s Gitem
  • 158. GIT HOSTING Možnosti 1 $ ssh my‐box‐somewhere‐on‐the.net 2 3 Verzování kódu s Gitem
  • 159. GIT HOSTING Fork queue Github.com „Facebook“ Downloads Network gist.github.com s Gitem Verzování kódu
  • 160. GIT HOSTING Githosting.cz Aktivita v repositářích Dashboard Prohlížeč obsahu repositáře Prohlížeč historie Githosting vs Github: Více repositářů | Méně funkcí | Umístění v ČR | Česká fakturace a podpora Verzování kódu s Gitem
  • 161. GIT ŠKOLENÍ Listopad/Prosinec 2009 www.git-fu.cz Verzování kódu s Gitem