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

Git -- rozproszony system kontroli wersji

May 10, 2015

Download

Documents

Piotr Macuk

Prezentacja przedstawiona na konferencji Pingwinaria 2010.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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]>