44
Rozproszony system kontroli wersji GIT Piotr Macuk <[email protected]>

Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Embed Size (px)

Citation preview

Page 1: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Rozproszony system kontroli wersji

GIT

Piotr Macuk <[email protected]>

Page 2: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

O mnie

Programowanie 19 lat

Linux + vim 12 lat

Kontrola wersji 9 lat

Ruby (on Rails) 5 lat

Git 2 lata

Page 3: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Agenda

Czym jest git

Instalacja i konfiguracja

Budowa

Narzędzia

Współpraca

Pytania

Page 4: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Historia

2002-2005 – BitKeeper

6 kwietnia 2005 – zmiana licencji

Linus daje sobie 2 tygodnie

18 kwietnia 2005 – git obsługuje swój kod

16 czerwca 2005 – git obsługuje kod jądra

Opiekun projektu: Junio Hamano

14 lutego 2007 – wydano git 1.5.0

Page 5: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Założenia

Nieliniowy rozwój kodu

Rozproszenie pracy

Szybkość i stabilność działania

Integralność repozytorium

Obsługa bardzo dużej ilości plików

Page 6: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Czym jest git?

Stupid content tracker

Ciekawy system plików

Filozofia UNIX-a – wiele prostych narzędzi

Git != svn++

Page 7: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Instalacja i konfiguracja

$ sudo apt­get install git­core

$ git config ­­global user.name \ "Piotr Macuk"$ git config ­­global user.email \ [email protected]

/etc/gitconfig~/.gitconfig.git/configgit help config

Page 8: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

$ mkdir ­p pesel/src$ touch pesel/README$ touch pesel/src/pesel.rb

peselpesel/READMEpesel/srcpesel/src/pesel.rb

Nowy projekt

Page 9: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Utworzenie repozytorium

$ git init

peselpesel/READMEpesel/srcpesel/src/pesel.rbpesel/.git

Page 10: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Ignore

$ cat .gitignore

*.log*.pid[0­9].txt

# production.log jest ok!production.log

Page 11: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Status

$ git status

# On branch master# Untracked files:#       README#       src/nothing added to commit but untracked files present (use "git add" to track)

Page 12: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Nowe pliki

$ git add .$ git status

# On branch master# Changes to be committed:#       new file:   README#       new file:   src/pesel.rb

Page 13: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Commit

$ git commit ­m 'Init'

[master (root­commit) 7b355ec] Init0 files changed, 0 insertions(+), 0 deletions(­)create mode 100644 READMEcreate mode 100644 src/pesel.rb

$ git status

# On branch masternothing to commit (working directory clean)

Page 14: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Perspektywa

Katalog roboczy Indeks Repozytorium

Checkout

Add

Commit

pesel pesel/.git/index pesel/.git

Commit -a

Page 15: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Baza obiektów

$ cd .git/objects && find

e6/9de29bb2d1d6434b8b29ae775ad8c2e48c539129/206d2658aaf11920998fac41a9f5f7047418fb4b/b2a6cec1e0c51741998cd243367706bbfb3b837b/355ecc8206060071ff60038fa034aab580dd59

Page 16: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Zmiana pliku

$ echo 'Pesel library.' > README$ git add README$ git commit ­m 'Doc'

Page 17: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Baza obiektów

$ cd .git/objects && find

e6/9de29bb2d1d6434b8b29ae775ad8c2e48c539129/206d2658aaf11920998fac41a9f5f7047418fb4b/b2a6cec1e0c51741998cd243367706bbfb3b837b/355ecc8206060071ff60038fa034aab580dd59d3/db0ebf6844ddc3ef19920e753bdf66f332a56550/947a5824bab56cf14775c6594745f5b4409f2f6a/aa7ae7ded1c036bc433a49906733a81da6fc9e

Page 18: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

      Init     Doc

pesel tree  4bb2a6c   6aaa7aepesel/README blob  e69de29   50947a5pesel/src tree  29206d2   29206d2pesel/src/pesel.rb blob  e69de29   e69de29

SHA-1

Page 19: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Skierowany graf acykliczny

blobe69de29

tree4bb2a6c

commit7b355ec

tree29206d2

pesel

srcsrc/pesel.rb

README

commitd3db0eb

tree6aaa7ae

blob50947a5

pesel

README

Init Doc

Page 20: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Typy obiektów

commitd3db0eb

blobe69de29

tree4bb2a6c

tage795501

blob (size)\0

content

tree (size)\0

100644 blob e69de29 README040000 tree 29206d2 src

Commit (size)\0

tree 6aaa7aeparent 7b355ecauthor Piotr Macuk 

<[email protected]> 1271161942 +0200

committer Piotr Macuk <[email protected]> 1271161942 +0200

Doc

tag (size)\0

object d3db0ebtype committag v0.0.1tagger Piotr Macuk 

<[email protected]> Tue Apr 13 17:24:40 2010

First tag.

Page 21: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Obiekty – założenia

Objekty są niezmienne

Obiekty są tylko dodawane

Ten sam sposób przechowywania

obj = zlib(sha1(header + content))obj => .git/objects/

Page 22: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Gałęzie

A

B

E

F

master

HEAD

C

D

fix23

$ git branch fix23$ git checkout fix23

$ git checkout ­b fix23

$ git branch ­d fix23

Page 23: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Gałęzie

Nowy pomysł lub bug = nowa gałąź

Gałąź = wskaźnik na commit

Tworzenie gałęzi = zapis 40 bajtów do pliku

HEAD = gałąź w której jest katalog roboczy

Page 24: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Tagi

$ git tag v0.0.1

$ git tag ­a v1.0

$ git tag ­s v1.0signed

$ git tag ­l

Page 25: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Wskaźniki

A

B

E

F

master

HEAD

C

D

fix23

tag: v0.0.1

$ cd .git/refs/ && find

tags/v0.0.1heads/masterheads/fix23

Page 26: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Merge

A

B

E

F

master

HEAD

C

D

fix23

A

B

E

F

master

HEAD

C

D

$ git merge fix23$ git branch ­d fix23

G

Page 27: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

A

B

E

F

master

HEAD

C

D

fix23

A

B

E

F

master C2

D2

$ git checkout fix23$ git rebase master

fix23

HEAD

HEAD

A

B

E

F

master

C2

D2

$ git checkout master$ git merge fix23$ git branch ­d fix23

Rebase + merge

Page 28: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Historia – log

$ git log

commit d3db0ebf6844ddc3ef19920e753bdf66f332a565Author: Piotr Macuk <[email protected]>Date:   Tue Apr 13 14:43:39 2010 +0200

    Doc

commit 7b355ecc8206060071ff60038fa034aab580dd59Author: Piotr Macuk <[email protected]>Date:   Tue Apr 13 14:32:22 2010 +0200

    Init

Page 29: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Historia – log$ git log

$ git log ­p

$ git log file1 file2 dir3

$ git log tag..branch

$ git log HEAD~10..

$ git log ­10

$ git log ­­author=fred

$ git log ­­grep="some text"

$ git log ­S"some code"

Page 30: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Historia – show$ git show

commit d3db0ebf6844ddc3ef19920e753bdf66f332a565Author: Piotr Macuk <[email protected]>Date:   Tue Apr 13 14:43:39 2010 +0200

    Dokumentacja

diff ­­git a/README b/READMEindex e69de29..50947a5 100644­­­ a/README+++ b/README@@ ­0,0 +1 @@+Pesel library.

Page 31: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Różnice

Katalog roboczy Indeks Repozytorium

pesel pesel/.git/index pesel/.git

git diff

git diff HEAD

git diff ­­cached

Page 32: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Undo

$ git commit ­­amend

$ git reset ­­soft

$ git reset ­­hard # UWAGA

Page 33: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Adresowanie

d3db0ebf6844ddc3ef19920e753bdf66f332a565

d3db0eb

HEAD, master, fix23, v0.0.1

master@{1 week ago}, fix23@{yesterday}

master~5, fix23^2, d3db0eb~2

'':/opis''

d3db0eb..7b355ec

Page 34: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Protokoły

git

ssh (+ gitshell)

http/https

File

rsync

http://github.com

Page 35: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

WspółpracaKażde repozytorium jest samowystarczalne

Tworzymy sieć repozytoriów

Publiczne i prywatne

Główne repozytorium to tylko umowa

$ git clone url dir

$ git remote add janek url

$ git pull (lub git fetch)

$ git push

Page 36: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Lokalnie

privateprivate

jan$ git remote add ola file://home/ola/peselola$ git remote add jan file://home/jan/pesel

$ git pull # bez push!

ola$ git branch ­a* master  remotes/jan/master

jan ola

Page 37: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Współdzielenie

shared

private private privateprivate

$ git clone ­­bare pesel pesel.git$ scp ­r pesel.git server:~/$ git remote add shared server:~/pesel.git

Page 38: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Open source

private privateprivate

public

Opiekun Developer Developer

publicmain

publicpublic

Page 39: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Łaty

Współpraca na zasadzie wysyłania łat

$ git format­patch master~3

$ git apply *.patch

$ git add …

$ git commit

Page 40: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Wiele narzędzi

git grep

git cherry-pick

git revert

git archive

git stash

git blame

git bisect

git fsck

git gc

git prune

Page 41: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Narzędzia zewnętrzne

gitk (tcl/tk)

tig (console)

qgit (Qt)

TortoiseGit (Windows)

GitX (Mac OS X)

git svn (import, proxy)

Page 42: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Linki

http://git-scm.com

http://whygitisbetterthanx.com

Page 43: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Pytania?

Page 44: Rozproszony system kontroli wersji GITzimowisko.linux.gda.pl/2011/papers/git.pdf · O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git

Dziękuję za uwagę :)

Piotr Macuk <[email protected]>