Git internals - Hogwarts School of ma'Git
-
Upload
jan-krag -
Category
Technology
-
view
264 -
download
6
description
Transcript of 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
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