Git - rozproszony system kontroli wersji

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

description

Autor: Piotr Macuk Git ma ciekawą historię i znanego autora. To projekt, który powstał w ekspresowym tempie i zdeklasował rywali. Jest to rozproszony system kontroli wersji, używany przy rozwijaniu jądra Linuksa.

Transcript of Git - rozproszony system kontroli wersji

Page 1: Git - rozproszony system kontroli wersji

Rozproszony system kontroli wersji

GIT

Piotr Macuk <[email protected]>

Page 2: Git - rozproszony system kontroli wersji

O mnie

Programowanie 19 lat

Linux + vim 12 lat

Kontrola wersji 9 lat

Ruby (on Rails) 5 lat

Git 2 lata

Page 3: Git - rozproszony system kontroli wersji

Agenda

Czym jest git

Instalacja i konfiguracja

Budowa

Narzędzia

Współpraca

Pytania

Page 4: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

Czym jest git?

Stupid content tracker

Ciekawy system plików

Filozofia UNIX-a – wiele prostych narzędzi

Git != svn++

Page 7: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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

peselpesel/READMEpesel/srcpesel/src/pesel.rb

Nowy projekt

Page 9: Git - rozproszony system kontroli wersji

Utworzenie repozytorium

$ git init

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

Page 10: Git - rozproszony system kontroli wersji

Ignore

$ cat .gitignore

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

# production.log jest ok!production.log

Page 11: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

Nowe pliki

$ git add .$ git status

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

Page 13: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

Perspektywa

Katalog roboczy Indeks Repozytorium

Checkout

Add

Commit

pesel pesel/.git/index pesel/.git

Commit -a

Page 15: Git - rozproszony system kontroli wersji

Baza obiektów

$ cd .git/objects && find

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

Page 16: Git - rozproszony system kontroli wersji

Zmiana pliku

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

Page 17: Git - rozproszony system kontroli wersji

Baza obiektów

$ cd .git/objects && find

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

Page 18: Git - rozproszony system kontroli wersji

      Init     Doc

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

SHA-1

Page 19: Git - rozproszony system kontroli wersji

Skierowany graf acykliczny

blobe69de29

tree4bb2a6c

commit7b355ec

tree29206d2

pesel

srcsrc/pesel.rb

README

commitd3db0eb

tree6aaa7ae

blob50947a5

pesel

README

Init Doc

Page 20: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

Tagi

$ git tag v0.0.1

$ git tag ­a v1.0

$ git tag ­s v1.0signed

$ git tag ­l

Page 25: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

Różnice

Katalog roboczy Indeks Repozytorium

pesel pesel/.git/index pesel/.git

git diff

git diff HEAD

git diff ­­cached

Page 32: Git - rozproszony system kontroli wersji

Undo

$ git commit ­­amend

$ git reset ­­soft

$ git reset ­­hard # UWAGA

Page 33: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

Protokoły

git

ssh (+ gitshell)

http/https

File

rsync

http://github.com

Page 35: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

Open source

private privateprivate

public

Opiekun Developer Developer

publicmain

publicpublic

Page 39: Git - rozproszony system kontroli wersji

Łaty

Współpraca na zasadzie wysyłania łat

$ git format­patch master~3

$ git apply *.patch

$ git add …

$ git commit

Page 40: Git - rozproszony system kontroli wersji

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: Git - rozproszony system kontroli wersji

Narzędzia zewnętrzne

gitk (tcl/tk)

tig (console)

qgit (Qt)

TortoiseGit (Windows)

GitX (Mac OS X)

git svn (import, proxy)

Page 42: Git - rozproszony system kontroli wersji

Linki

http://git-scm.com

http://whygitisbetterthanx.com

Page 43: Git - rozproszony system kontroli wersji

Pytania?

Page 44: Git - rozproszony system kontroli wersji

Dziękuję za uwagę :)

Piotr Macuk <[email protected]>