git internals - hogwarts school of ma'git

38
HOGWARTS SCHOOL OF MA’GIT Forstå hvordan Git tænker og snakker Jan Krag 12.april 2013 For

Upload: jan-krag

Post on 24-May-2015

265 views

Category:

Technology


6 download

DESCRIPTION

English: (Dansk tekst nedenfor/Danish see below) Slidedeck (officially in Danish, but mostly "Git speak") about Git internals (commits, refs, blobs, treeish etc.) and other related subjects, like Git plumbing commands and various branching models. Made for an internal presentation I gave in our company a while back. If you are interested in this slide deck, and don't speak danish, drop me a note, and I might be convinced to translate it to English. Dansk beskrivelse: Dette er en præsentation jeg lavede for min udviklergruppe internt i firmaet (Schantz) engang i april 2013. Presentationen omhandler hovedsageligt Git's interne struktur, på det detalje-niveau hvor jeg mener at det bidrager til folks forståelse af hvad git egentlig gør og mener. Derudover berører jeg nogle af de mere lav-niveau git kommandoer (git plumbing), samt diverse branching modeller og andre relaterede ting.

TRANSCRIPT

Page 1: Git internals - Hogwarts School of ma'Git

HOGWARTS SCHOOL OF MA’GIT

Forstå hvordan Git tænker og snakker

Jan Krag 12.april 2013For Udvikling 1

Page 2: Git internals - Hogwarts School of ma'Git

GIT

er ikke

SVN + magi Hg med en anden syntax

Page 3: Git internals - Hogwarts School of ma'Git

Hvad e

r GIT

?

Et filsystem med versionering? En database? En samling af “objekter” for

content(filer), directories osv. En DAG Nogle low-level commandoer til

at manipulere disse (plumbing) Nogle high-level scripts

(porcelain)

Page 4: Git internals - Hogwarts School of ma'Git

GIT

ob

jekte

r Alle objekter gemmes I Gits

object db (I .git mappen) Objekter er komprimeret med

Zlib, og refereres af en 40-hex-cifret Sha-1 hash.

Er immutable

Page 5: Git internals - Hogwarts School of ma'Git

De 4

typer

blob = filer tree = directories commit tag

Page 6: Git internals - Hogwarts School of ma'Git

BLO

B

En blob gemmer indholdet af en fil (ikke selve filen).

Filnavn og mode gemmes ikke her

Det betyder at hvis man har flere filer med helt ens indhold I ens træ, gemmes kun 1 blob!!

Filindhold -> Zlib:deflate -> blob:a906cb

Page 7: Git internals - Hogwarts School of ma'Git

TR

EE

Et tree objekt er bare en fil og indeholder sådan set bare en liste af blobs og andre trees, sammen med filnavn, mode og sha1 for hver:

100644 blob a906cb README100644 blob a874b7 index.html040000 tree fe8971 src

-> deflate -> tree:1a736f

Page 8: Git internals - Hogwarts School of ma'Git

com

mit

Commit er en simpel fil der indeholder: Info om: author, committer, message Pointer til et tree object (sha1) Pointer til én eller flere parent commits

Page 9: Git internals - Hogwarts School of ma'Git

Første committree 1a738dauthor Jan Krag <[email protected]> 1205602288committer Jan Krag <[email protected]> 1205602288My first commit

commit: a11bef

Page 10: Git internals - Hogwarts School of ma'Git

Næste committree e1b3ecparent a11befauthor Jan Krag <[email protected]> 1205602288committer Jan Krag <[email protected]> 1205602288my second commit, which is better than the first

commit: a7d991

Page 11: Git internals - Hogwarts School of ma'Git

“merge” commit

Der kan sagtens være mere end 2 parents

Tree d8g5asparent a11befparent cd73f2author Jan …committer Jan …Merging blabla and bumdibum

commit: c983bh

Page 12: Git internals - Hogwarts School of ma'Git

Tag:1

d4

5ff

Tag objekter er navngivne “aliaser” til andre objekter (normalt commits):object 0576fatype committag v0.1tagger Jan Krag <[email protected]> 1205602288this is my v0.1 tag

Page 13: Git internals - Hogwarts School of ma'Git

~> git cat-file -p 0d7d31267eb0047bca341f8d119d971a8ccca7c0

tree 10575e4e560545665716381aeec15d4f0415a58dparent 6aaa8df13f38f5e3b88caf288b8d46b9269a66bcparent 2fae83ce8a4c430557e8b9551501a2f4b8d933eaauthor Eva Franch <[email protected]> 1365604628 +0200committer Eva Franch <[email protected]> 1365604628 +0200

Page 14: Git internals - Hogwarts School of ma'Git

~> git cat-file -p 10575e4e560545665716381aeec15d4f0415a58d

100644 blob 6b6ab4c31b08444698540f2e6e12c95b529f7f4c .gitignore100644 blob d2fb95c801ef177e3e4a6d49cb1ec543d4f7ef5b .hgignore040000 tree a6dbc05cb692962828bea8a8172319e8dc3349ac NlpAdvice040000 tree 893b964c27c8a29169e42fd8497dcae4cbbc7956 NlpAdviceLightCQ040000 tree aa52e7ed76a72d6ed47dfd9984df3a91482e3586 NlpAdviceLightDemo040000 tree a6d6355892559865d40d9730a52102092901013eNlpAdviceLightWeb040000 tree fe915628b5d6577c561b2ec6fbca1fd25b228507 NlpAdviceWeb040000 tree 68d0be8a59b14f18e9d8bbecde0ac7c80f641a2e NlpGuiTests040000 tree a1034138f5e741ecf09a72f787bc89afa05c744e NlpWeblogicStub100644 blob f003e3fece6a4849c089117998a04fcac3d9d083 build.gradle100644 blob 299ab93f36090d9211dd558330458f5cbc61ba72gradle.properties100644 blob e4aa4fd65d9af22099b86beb26b21d33d7fd4651 pom.xml100644 blob 6cc879ad82f82a5319342a9aa9244a79678b05b3 settings.gradle040000 tree 0cff60d4f81fdbea90be7db6003bf0da7327db18 target040000 tree 1273c6e3afd1fc1d37d4afee449192071b3623b4 tomcatrunner6Nlp

Page 15: Git internals - Hogwarts School of ma'Git

Refs Det modsatte af objekter, idet de er

mutable. Refs er meget simple filer gemt I

.git/refs/ Eksempler på refs er branches og

remotes

Page 16: Git internals - Hogwarts School of ma'Git

Branches - fortsat Branches er billige At lave en branch er virkelig bare at

skrive 40 karakterer i en ny fil i refs/heads/

Page 17: Git internals - Hogwarts School of ma'Git

Branch En branch er KUN en simpel one-liner fil I .git/refs/heads~/workspaces/BOSS/nlp/.git/refs/heads> lldrwxr-xr-x 7 jankrag staff 238 Apr 11 11:50 .drwxr-xr-x 6 jankrag staff 204 Apr 11 11:38 ..-rw-r--r-- 1 jankrag staff 41 Apr 11 11:50 developdrwxr-xr-x 2 jankrag staff 68 Feb 18 10:39 feature-rw-r--r-- 1 jankrag staff 41 Mar 12 10:57 masterdrwxr-xr-x 3 jankrag staff 102 Apr 11 11:50 release

~/workspaces/BOSS/nlp/.git/refs/heads> cat develop 4a6c6f50f7e9cd72306949f84fac1cff6a4b2908

Page 18: Git internals - Hogwarts School of ma'Git

Generel model

tree

commit

Blob

Branch

HEADtag

Page 19: Git internals - Hogwarts School of ma'Git

HEAD Er en simpel fil i .git der indeholder en

reference til den branch der arbejdes på:

~/nlp> cat .git/HEAD ref: refs/heads/release/v1.4.0

Page 20: Git internals - Hogwarts School of ma'Git

Vi ændrer nu den “nederste” fil:

Simple repo med 3 dirs og 3 filer.

Page 21: Git internals - Hogwarts School of ma'Git
Page 22: Git internals - Hogwarts School of ma'Git

Switch til anden branch git checkout develop Opdaterer working dir til hele det

indhold som sha1 I refs/heads/develop peger på

Opdaterer HEADS til at pege på develop

Derefter vil nye commits opdatere sha’en I refs/heads/develop

Page 23: Git internals - Hogwarts School of ma'Git
Page 24: Git internals - Hogwarts School of ma'Git

Remotes

Page 25: Git internals - Hogwarts School of ma'Git

Merge vs. rebase

Page 26: Git internals - Hogwarts School of ma'Git

TreeishEr forskellige måder at referere til et objekt. Fuld Sha:

dae86e1950b1277e545cee180551750029cfe735 Partial Sha: dae86e (ikke bestemt længde –

bare unik. Typisk 6-7 tegn) Branch el. Tag navn: develop

Dvs. Hvad som helst I .git/refs/heads eller .git/refs/tags

Page 27: Git internals - Hogwarts School of ma'Git

Treeish - upræciseDato spec: master@{yesterday} master@{1 month ago}

Relativt master@{5} - 5 commits tilbage på master

Page 28: Git internals - Hogwarts School of ma'Git

Treeish - upræciseCarrot parent e65s46^2 eller master^2 Kun meningsfyldt på commits med mere end 1

parent e65s46^^^ er lovligt

Der er adskillige flere muligheder …

Page 29: Git internals - Hogwarts School of ma'Git

Index (staging) Tidligere kaldet “cache” Det er her objekterne egentlig oprettes.

Page 30: Git internals - Hogwarts School of ma'Git

BRUG AF GIT

Page 31: Git internals - Hogwarts School of ma'Git

Config Global config ligger i .gitconfig Repo-lokal config ligger i .git/config

~/> git config --global user.name “Jan Krag”

Eller den gode gamle vi ~/.gitconfig git config -l

Page 32: Git internals - Hogwarts School of ma'Git

log$ git log --pretty=oneline cf25cc3bfb0ece7dc3609b8dc0c committing all changes 0c8a9ec46029a4e92a428cb98c9 changed the version number 0576fac355dd17e39fd2671b010 my second commit, which is.. a11bef06a3f659402fe7563abf9 first commit

$ git log -n 30 --since=”1 month ago” --until=yesterday --author=”jak”

Page 33: Git internals - Hogwarts School of ma'Git

PlumbingInspicer git objekter: git cat-file git ls-tree

gitk Grafisk brugerflade

Page 34: Git internals - Hogwarts School of ma'Git

Instaweb Svarer til hg serve Starter en local webserver (lighttpd)

Page 35: Git internals - Hogwarts School of ma'Git

Workflow modellerHvordan arbejder man sammen

Page 36: Git internals - Hogwarts School of ma'Git

Den centrale server

Page 37: Git internals - Hogwarts School of ma'Git

Løjtnant model

Page 38: Git internals - Hogwarts School of ma'Git

Integration manager model