Sunteți pe pagina 1din 67

Git

Mircea Bardac
mircea@bardac.net
30 octombrie 2009

romanian open source education


Concepte

! Source Control Management


! urm"rirea modific"rilor
! repository, list" de modific"ri
! working dir, stare curent"
Concepte
! SCM centralizat
! server: DB cu modific"ri
! client: working tree & stare

! SCM descentralizat
! oricine poate fi server
! repository si working tree în acela#i timp
! istoric complet #i lucru decentralizat
Componente SCM (1)
! Working tree
! directoare
! fi#iere

! Con$inutul repository-ului
! fi#iere
! commit-uri
! rela$iile dintre commit-uri
Componente SCM (2)

! Rela$iile între G
E

commit-uri formeaz" F

grafuri aciclice D

B C

A
Componente SCM (3)

! Tag-uri
H

E
G
! etichete
! marcheaz" anumite F

D v1.5.0
commit-uri
B C

A v1.4.0
Componente SCM (4)
Fix1 testing

H
release

! Branch-uri G
E

! marcheaz" un lan$ de F

commit-uri D v1.5.0

B C

A v1.4.0
Componente SCM (5)
HEAD

Fix1 testing

! Referin$a HEAD
H
release
E
G
! indic" un branch
! reprezint" checkout-ul F

D v1.5.0
curent
B C

A v1.4.0
Opera$ii SCM
! Bootstrap
! init
! checkout
! schimbat branch

! Modificare
! ad"ugare, #tergere, redenumire
! commit
Opera$ii SCM (cont.)
! Informa$ii
! status
! diff
! log

! Referin$e
! tag
! branch
Probleme utilizare

! gre#eli în commit-uri
(con$inut, descriere etc.)
! limitarea accesului la anumite p"r$i
ale repo-ului (IPO)
! fi#iere cu o licen$" gre#it" în repo
Diferen$e SCM
! SCM centralizat
! opera$iile necesit" prezen$a server-ului
(single point of failure, bottleneck)

! SCM descentralizat
! clone
! fetch, pull
! push
Avantaje ale
descentraliz"rii
! nu exist" single point of failure
! modele de dezvoltare variate
! lucru deconectat
! opera$ii rapide (ex: clonarea local" -
backup, commit, status etc.)
Dezavantaje ale
descentraliz"rii
! mai greu de în$eles
! managementul accesului este mai
dificil
! greu de modificat istoria
commit-urilor (aproape imposibil)
Git

! Linus Torvals
! Linux Kernel - 16 iunie 2005
! 14 februarie 2007 - v1.5.0 -
îmbun"t"$iri majore, documenta$ie
! bash scripts, porcelains, C
Git Repository

! .git - director în r"d"cina repo-ului


! .git/config - fi#ier configurare
! .git/hooks - script-uri care se execut" în
urma unor evenimente
! .git/objects - obiecte #i “packs”
! .git/refs - referin$e (tags, remotes etc.)
Git - Getting Started
! Principiu de baz"
! Git urm"re#te con$inut, nu fi#iere

! Con$inutul se poate g"si în:


! work tree, dar neurm"rit de Git
! index-ul Git (preg"tit pentru un commit)
! repository, sub forma unor commit-uri
salvate
Git “inside”

Repository Index Work tree


HEAD
10644 4d53f3 0 foo
Fix1 testing 10644 ab5f3e 0 foo2
.
10644 d54c2a 0 bar/f1 +-- foo
H
release 10644 64dc33 0 bar/22 +-- foo2
E
+-- bar
G

+-- f1
F

D v1.5.0
+-- 22
B C

A v1.4.0
Git “inside”
Repository Index Work tree
HEAD
10644 4d53f3 0 foo
Fix1 testing 10644 ab5f3e 0 foo2
.
10644 d54c2a 0 bar/f1 +-- foo
H
release 10644 64dc33 0 bar/22 +-- foo2
E
+-- bar
G

+-- f1
F

D v1.5.0
+-- 22
B C

A v1.4.0

! “staging”
! git add foo; git add -i bar/f1
! git rm f3
! git mv foo3 foo2
Git “inside”
Repository Index Work tree
HEAD
10644 4d53f3 0 foo
Fix1 testing 10644 ab5f3e 0 foo2
.
10644 d54c2a 0 bar/f1 +-- foo
H
release 10644 64dc33 0 bar/22 +-- foo2
E
+-- bar
G

+-- f1
F

D v1.5.0
+-- 22
B C

A v1.4.0

! “commiting”
! git commit -m “mesaj”
Git “inside”
Repository Index Work tree
HEAD
10644 4d53f3 0 foo
Fix1 testing 10644 ab5f3e 0 foo2
.
10644 d54c2a 0 bar/f1 +-- foo
H
release 10644 64dc33 0 bar/22 +-- foo2
E
+-- bar
G

+-- f1
F

D v1.5.0
+-- 22
B C

A v1.4.0

! “reading tree”
! git read-tree
! git checkout
! git reset
Git “inside”
Repository Index Work tree
HEAD
10644 4d53f3 0 foo
Fix1 testing 10644 ab5f3e 0 foo2
.
10644 d54c2a 0 bar/f1 +-- foo
H
release 10644 64dc33 0 bar/22 +-- foo2
E
+-- bar
G

+-- f1
F

D v1.5.0
+-- 22
B C

A v1.4.0

! “checkout”
! git checkout-index
! git checkout
! git reset
Comenzi Git & Help
! ~ 130 comenzi Git
! Lista comenzilor uzuale:
! git help

! Help:
! git <command> -h
! man git-<command>
! git help <command>
! git <command> --help
Configurare Git
! Configurarea local":
! .git/config

! Configurarea global":
! $HOME/.gitconfig
! git config --global user.name “Your name”
! git config --global user.email “you@domain.tld"
! git config --global color.ui auto
! git config --global color.pager true
Bootstraping
! Crearea unui repo
! git init

! Clonarea unui repo remote


! git clone <repo-path> [<new-name>]

• Git repo: git://url


• cale SSH: ssh://username@host/path
• cale local" absolut" sau relativ"
! repo-ul remote “origin”
Staging

! Ad"ugat con$inut
! git add file
! git add .

! %ters con$inut
! git rm file

! Redenumit con$inut
! git mv old new
Staging

! Ignorat con$inut
$ cat .gitignore
*~
*.o

! Ignorat con$inut f"r" partajarea


configura$iei
! .git/info/exclude
Commit
! Crearea unui commit cu tot
con$inutul “staged” (aflat în index)
! git commit -a -m “descriere commit”

! ID Commit = SHA1
! fiecare commit are cel pu$in un
p"rinte (excep$ie: primul commit)
! undo: git reset [--hard | --soft]
Referin$e obiecte (1)
! Commit
! HEAD = ultimul commit
! HEAD^ = penultimul
! HEAD^^ = antepenultimul etc.
! HEAD~5 = HEAD^^^^^
! Short hash: ff3bf7
! Full hash:
ff3bf7fbcae44c8a16d941f0eab3d14f7efcef61
Branches

! Ramuri de dezvoltare
! locale: git branch
! remote: git branch -r
! toate: git branch -a

! Caracterul * înaintea unui nume de


branch indic" branch-ul curent
Branches

! Crearea unui nou branch


! git branch new_branch HEAD^^^
! git checkout -b new_branch

! %tergerea unui branch


! git branch -d some_branch

! Schimbarea branch-ului
! git checkout some_other_branch
Tag-uri

! Crearea unui nou tag


! git tag new_tag HEAD^^^
! git tag -s new_tag HEAD~20

! %tergerea unui tag


! git tag -d some_tag
Referin$e obiecte (2)

! Branch
! local: master
! remote: origin/master

! Tag-uri
! direct prin numele lor, exemplu: v1.2.3
Status repository

! git status prezint"


! con$inutul din index (“staged”)
! con$inutul care nu este în index
(“non-staged”)
! con$inutul neurm"rit (“non-tracked”)
Diferen$e
! Diferen$ele index - working tree
! git diff

! Con$inutul index-ului
! git diff --cached

! Diferen$ele dintre $commit1 #i


working dir [sau $commit2]
! git diff $commit1 [$commit2]
Log, show

! Istoria salvat" în repo


! git log
! git log $REF1..$REF2
! git log -- path/to/some/file

! Con$inut
! commit: git show $COMMIT_ID
! fi#ier: git show HEAD:fi!ier
Repositories

! Locale
! Remote
! ad"ugate ca referin$e în repo-ul local
! git remote show
! git remote show origin
! git remote add bob ssh://fred@host/home/bob/repo

! opera$ii frecvente: push, fetch, pull


Exemplu utilizare
colaborativ"

HEAD

master

Bob
Exemplu utilizare
colaborativ"

HEAD

master

Bob
git add file2; git commit -m “C”
Exemplu

HEAD

master

Bob
Exemplu

HEAD

master

Fred Bob
Exemplu

HEAD

master

Fred Bob
git clone /home/bob/repo.git
Exemplu

HEAD HEAD

master master

C C

B B

A A

Fred Bob
git clone /home/bob/repo.git
Exemplu

HEAD HEAD

master origin/master master

C C

B B

A A

Fred Bob
Exemplu

HEAD HEAD

master origin/master master

C C

B B

A A

Fred Bob
git commit ...
Exemplu
HEAD

master

HEAD
F

origin/master master
D

C C

B B

A A

Fred Bob
Exemplu
HEAD

master

HEAD
F

origin/master master
D

C C

B B

A A

Fred Bob
git commit -m “E”
Exemplu
HEAD

master HEAD

F master

origin/master
D E

C C

B B

A A

Fred Bob
Exemplu
HEAD

master HEAD

F master

origin/master
D E

C C

B B

A A

Fred Bob
Exemplu
HEAD

master HEAD

F master

origin/master
D E

C C

B B

A A

Fred Bob
git fetch origin
HEAD

master origin/master HEAD

F master
E

D E

C C

B B

A A

Fred Bob
HEAD

master origin/master HEAD

F master
E

D E

C C

B B

A A

Fred Bob
git merge origin/master
HEAD

master

G origin/master HEAD

F master
E

D E

C C

B B

A A

Fred Bob
HEAD

master HEAD

F master

origin/master
D E

C C

B B

A A

Fred Bob
HEAD

master HEAD

F master

origin/master
D E

C C

B B

A A

Fred Bob
git pull origin
HEAD

master

G origin/master HEAD

F master
E

D E

C C

B B

A A

Fred Bob
HEAD

master origin/master HEAD

F master
E

D E

C C

B B

A A

Fred Bob
HEAD

master origin/master HEAD

F master
E

D E

C C

B B

A A

Fred Bob
git rebase origin/master
HEAD

master

F' HEAD

D' master

E origin/master E

C C

B B

A A

Fred Bob
HEAD

master

F' HEAD

D' master

E origin/master E

C C

B B

A A

Fred Bob
git push origin
HEAD HEAD

master origin/master master

F' F'
HEAD

D' D'
master

E origin/master E

C C

B B

A A

Fred Bob
git push origin
Tracking bugs

! git bisect
! git bisect start
! git bisect bad
! git bisect good $COMMIT
! git visualize

! git blame
Alte utiliz"ri
! Patch-uri in e-mail-uri
! Generare: git format patch <range>

• Ex: git format patch origin..mybranch

! Aplicare: git am <patch-file>

! Git peste SVN


! git svn clone <svn-repo-path>
! git svn dcommit
! git svn rebase
Solu$ii pentru
probleme “uzuale”
! gre#eli în commit-uri (con$inut,
descriere etc.)
! git commit --amend
! git rebase -i HEAD~3

! limitarea accesului la anumite p"r$i


ale repo-ului (IPO)
! limitarea accesului direct la repo (gitosis)
Solu$ii pentru
probleme “uzuale”
! fi#iere cu o licen$" gre#it" în repo
! git filter-branch --index-filter
"git rm -rf --cached --ignore-unmatch
<SOME_PATH>" HEAD

! Problem" nou": fi#iere binare


! Git nu este potrivit pentru stocarea lor
! Shallow clone: git clone --depth <depth>
Git “Best Practices”

! Commit-uri mici cu descrieri


relevante
! Un bugfix/feature per branch
! Repository-ul trebuie p"strat
întotdeauna într-o stare compilabil"
Resurse utile
! Screencast: http://excess.org/article/2008/07/ogre-
git-tutorial/ - descriere tehnic" de Bart Trojanowski

! http://ktown.kde.org/~zrusin/git/ - Git Cheatsheet

! http://www.kernel.org/pub/software/scm/git/docs/
gittutorial.html - O&cial Git tutorial

! http://gitready.com/ - Git Ready

! http://book.git-scm.com/ - The Git Community Book

! http://github.com/ - Git Hub - Git hosting

S-ar putea să vă placă și