git internals - hogwarts school of ma'git
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
HOGWARTS SCHOOL OF MA’GIT
Forstå hvordan Git tænker og snakker
Jan Krag 12.april 2013For Udvikling 1
GIT
er ikke
SVN + magi Hg med en anden syntax
Hvad e
r GIT
så
?
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)
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
De 4
typer
blob = filer tree = directories commit tag
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
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
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
Første committree 1a738dauthor Jan Krag <[email protected]> 1205602288committer Jan Krag <[email protected]> 1205602288My first commit
commit: a11bef
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
“merge” commit
Der kan sagtens være mere end 2 parents
Tree d8g5asparent a11befparent cd73f2author Jan …committer Jan …Merging blabla and bumdibum
commit: c983bh
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
~> git cat-file -p 0d7d31267eb0047bca341f8d119d971a8ccca7c0
tree 10575e4e560545665716381aeec15d4f0415a58dparent 6aaa8df13f38f5e3b88caf288b8d46b9269a66bcparent 2fae83ce8a4c430557e8b9551501a2f4b8d933eaauthor Eva Franch <[email protected]> 1365604628 +0200committer Eva Franch <[email protected]> 1365604628 +0200
~> 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
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
Branches - fortsat Branches er billige At lave en branch er virkelig bare at
skrive 40 karakterer i en ny fil i refs/heads/
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
Generel model
tree
commit
Blob
Branch
HEADtag
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
Vi ændrer nu den “nederste” fil:
Simple repo med 3 dirs og 3 filer.
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
Remotes
Merge vs. rebase
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
Treeish - upræciseDato spec: master@{yesterday} master@{1 month ago}
Relativt master@{5} - 5 commits tilbage på master
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 …
Index (staging) Tidligere kaldet “cache” Det er her objekterne egentlig oprettes.
BRUG AF 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
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”
PlumbingInspicer git objekter: git cat-file git ls-tree
gitk Grafisk brugerflade
Instaweb Svarer til hg serve Starter en local webserver (lighttpd)
Workflow modellerHvordan arbejder man sammen
Den centrale server
Løjtnant model
Integration manager model