SlideShare a Scribd company logo
How GIT Works Internally
SeongJae Park <sj38.park@gmail.com>
Nice To Meet You
SeongJae Park
sj38.park@gmail.com
Git
DVCS(Distributed Version Control System)
http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png
Git
DVCS(Distributed Version Control System)
Made-by Linus Torvalds For Linux
http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png
http://cdn.memegenerator.net/instances/400x/37078331.jpg
Git
Many Projects Use Git Because It’s Awesome
http://blog.appliedis.com/wp-content/uploads/2013/11/android1.png
http://upload.wikimedia.org/wikipedia/en/4/40/Octocat,_a_Mascot_of_Github.jpg
http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Tux.svg/512px-Tux.svg.png
http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png
Git
Hard To Learn
Confusing For CVCS Users
Push? Pull? Fetch? Rebase? HEAD???
http://www.quickmeme.com/img/fd/fd09e17b3393b2ea1cd7e52af1ad7c77f3c2d7a83e9f47d4b90ba3af52dde329.jpg
http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png
Git: The Information Manager From Hell
http://www.youblob.com/sites/default/files/styles/large/public/field/image/frontlego1.png?itok=XA5CXt84
Git: The Information Manager From Hell
$ git log e83c516
commit e83c5163316f89bfbde7d9ab23ca2e25604af290
Author: Linus Torvalds <torvalds@ppc970.osdl.org>
Date: Thu Apr 7 15:13:13 2005 -0700
Initial revision of "git", the information manager from hell
http://www.youblob.com/sites/default/files/styles/large/public/field/image/frontlego1.png?itok=XA5CXt84
Git: The Information Manager From Hell
That’s Why So Confusing And Hard To Learn
$ git log e83c516
commit e83c5163316f89bfbde7d9ab23ca2e25604af290
Author: Linus Torvalds <torvalds@ppc970.osdl.org>
Date: Thu Apr 7 15:13:13 2005 -0700
Initial revision of "git", the information manager from hell
http://www.youblob.com/sites/default/files/styles/large/public/field/image/frontlego1.png?itok=XA5CXt84
This Time, We Will...
See How Git Works From The Scratch
https://lh4.googleusercontent.com/gBpfuABUjSNi2RagtJrGi8TW-pmtgak_0qtGOGubihvKH-5-umreO9C
wJgjX2kaA9E7RkLwtEwiDnoMtOgm4iMJ0IWhvXlzlKL1kNVUYWuNa-gLRtRoyNjkVYg
This Time, We Will...
See How Git Works From The Scratch
Just For Fun
...Or To Be Friend Of Git
https://lh4.googleusercontent.com/gBpfuABUjSNi2RagtJrGi8TW-pmtgak_0qtGOGubihvKH-5-umreO9C
wJgjX2kaA9E7RkLwtEwiDnoMtOgm4iMJ0IWhvXlzlKL1kNVUYWuNa-gLRtRoyNjkVYg
This Time, We Will...
See How Git Works From The Scratch
Just For Fun
...Or To Be Friend Of Git
Forget About The
Complicated Commands
This Time
https://lh4.googleusercontent.com/gBpfuABUjSNi2RagtJrGi8TW-pmtgak_0qtGOGubihvKH-5-umreO9C
wJgjX2kaA9E7RkLwtEwiDnoMtOgm4iMJ0IWhvXlzlKL1kNVUYWuNa-gLRtRoyNjkVYg
In Short,
Git Is A Content-Addressable Storage System
http://www.juliagiff.com/wp-content/uploads/2014/03/tld
r_trollcat.jpg
In Short,
Git Is A Content-Addressable Storage System
Blob, Tree, Commit, Reference. That’s It =3
http://www.juliagiff.com/wp-content/uploads/2014/03/tld
r_trollcat.jpg
Plumbers: Unsung Heroes Behind
● Git Looks Graceful Owing To Plumbing
Commands Consisting Them
http://cfile4.uf.tistory.com/image/182FF7244CFDDFB33CC999
http://cfile29.uf.tistory.com/image/18574F224CFDD89B163073
Plumbers: Unsung Heroes Behind
● Git Looks Graceful Owing To Plumbing
Commands Consisting Them
○ The Wounded Foots Are What We Interested In
http://cfile4.uf.tistory.com/image/182FF7244CFDDFB33CC999
http://cfile29.uf.tistory.com/image/18574F224CFDD89B163073
Again, From The Scratch
VCS? Why? How?
Why VCS?
Usual Life Of File
FileA ver 0 FileB ver 0
Why VCS?
Usual Life Of File
FileA ver 0 FileB ver 1FileB ver 0
Why VCS?
Usual Life Of File
FileA ver 0 FileB ver 1
Why VCS?
Usual Life Of File
FileB ver 1 FileA ver 1FileA ver 0
Why VCS?
Usual Life Of File
FileB ver 1 FileA ver 1
Why VCS?
Usual Life Of File
FileB ver 2FileA ver 1FileB ver 1
Why VCS?
Usual Life Of File
FileB ver 2FileA ver 1
Why VCS?
Usual Life Of File
FileB ver 2FileA ver 1
We Need Version Control System
VCS Would...
Record Every Changes Safely, Efficiently
We Need Version Control System
VCS Would...
Record Every Changes Safely, Efficiently
Able To Check Out Any Version
We Need Version Control System
VCS Would...
Record Every Changes Safely, Efficiently
Able To Check Out Any Version
Easy To Read History
Brute-force Idea
Version Control Using File System
Brute-force Idea
Rename / Backup Every Files Whenever
Change Made
Brute-force Idea
Rename / Backup Every Files Whenever
Change Made
$ ls
foo.c
Brute-force Idea
Rename / Backup Every Files Whenever
Change Made
$ ls
foo.c
foo_20140111.c
Brute-force Idea
Rename / Backup Every Files Whenever
Change Made
$ ls
foo.c
foo_20140111.c
foo_final.c
Brute-force Idea
Rename / Backup Every Files Whenever
Change Made
$ ls
foo.c
foo_20140111.c
foo_final.c
foo_realfinal.c
foo_planb.c
foo_finalfinal.c
Brute-force Idea
Rename / Backup Every Files Whenever
Change Made
$ ls
foo.c
foo_20140111.c
foo_final.c
foo_realfinal.c
foo_planb.c
foo_finalfinal.c
Brute-force Idea + History Isolation
Keep Working / History Directory Seperately.
Brute-force Idea + History Isolation
Keep Working / History Directory Seperately.
Better, But...
$ find . -type f
./working/foo.c
./history/foo_20140111.c
./history/foo_final.c
./history/foo_realfinal.c
./history/foo_planb.c
./history/foo_finalfinal.c
TODOs From Version Control Using FS
Use Storage Space-Efficiently
TODOs From Version Control Using FS
Use Storage Space-Efficiently
Easy History Searching
Mission #1:
Store History Space-Efficiently
Basic Idea: Avoid Duplicated Objects
Basic Idea: Avoid Duplicated Objects
Content-Addressable Storage System
Basic Idea: Avoid Duplicated Objects
Content-Addressable Storage System
Key: SHA-1 Hash Of Object’s Content
Value: Compressed Content
Basic Idea: Avoid Duplicated Objects
Content-Addressable Storage System
Key: SHA-1 Hash Of Object’s Content
Value: Compressed Content
Same Content Never Saved Twice
Save / Load ‘homer’
$ mkdir simpsons; cd simpsons; git init
Initialized empty Git repository in simpsons/.git/
$ echo ‘homer’ | git hash-object -w --stdin
4aa0bfa07f1680c50a1567ecc37bc3b6aa567b8f
$
Save / Load ‘homer’
$ mkdir simpsons; cd simpsons; git init
Initialized empty Git repository in simpsons/.git/
$ echo ‘homer’ | git hash-object -w --stdin
4aa0bfa07f1680c50a1567ecc37bc3b6aa567b8f
$ find .git/objects/ -type f
.git/objects/4a/a0bfa07f1680c50a1567ecc37bc3b6aa567b8f
$
Save / Load ‘homer’
$ mkdir simpsons; cd simpsons; git init
Initialized empty Git repository in simpsons/.git/
$ echo ‘homer’ | git hash-object -w --stdin
4aa0bfa07f1680c50a1567ecc37bc3b6aa567b8f
$ find .git/objects/ -type f
.git/objects/4a/a0bfa07f1680c50a1567ecc37bc3b6aa567b8f
$ git cat-file -p 4aa0b
homer
$ git cat-file -t 4aa0b
blob
What `hash-object -w` did
hash_object_w(‘homern’)
What `hash-object -w` did
hash_object_w(‘homern’)
# Save compressed header + content at sha1 path
def hash_object_w(content):
header = ‘blob %d0’ % len(content)
store = header + content
sha1 = sha.new(store).hexdigest()
What `hash-object -w` did
hash_object_w(‘homern’)
# Save compressed header + content at sha1 path
def hash_object_w(content):
header = ‘blob %d0’ % len(content)
store = header + content
sha1 = sha.new(store).hexdigest()
dir = ‘.git/objects/’ + sha1[0:2] + ‘/’
filename = sha1[2:]
What `hash-object -w` did
hash_object_w(‘homern’)
# Save compressed header + content at sha1 path
def hash_object_w(content):
header = ‘blob %d0’ % len(content)
store = header + content
sha1 = sha.new(store).hexdigest()
dir = ‘.git/objects/’ + sha1[0:2] + ‘/’
filename = sha1[2:]
open(dir + filename, ‘w’).write(
zlib.compress(store))
Version Control Using Hash Value
$ echo “bart” > son
$ git hash-object -w son
e00ddae83bdab443f4267426623aa34636c935f2
$
Version Control Using Hash Value
$ echo “bart” > son
$ git hash-object -w son
e00ddae83bdab443f4267426623aa34636c935f2
$ echo “hugo” > son
$ git hash-object -w son
8e1e2f09585e021c9727585af72e10871d7be7ce
$
Version Control Using Hash Value
$ echo “bart” > son
$ git hash-object -w son
e00ddae83bdab443f4267426623aa34636c935f2
$ echo “hugo” > son
$ git hash-object -w son
8e1e2f09585e021c9727585af72e10871d7be7ce
$
# Need former version, “bart”
$ git cat-file -p e00dd > son
$ cat son
bart
TODOs From Version Control Using FS
Use Storage Space-Efficiently
Easy History Searching
Version Control Using Hash Value
● DONE
○ Efficient Space Usage
○ Safe Record / Checkout Of History
https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
Version Control Using Hash Value
● DONE
○ Efficient Space Usage
○ Safe Record / Checkout Of History
● TODO
○ Support Directory Structure
○ History Management
○ Better Reference Than Hash Value
https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
WAIT!
Q: What If Small Changes Inside A Big File?
WAIT!
Q: What If Small Changes Inside A Big File?
$ du -h bigfile.c
188Kbigfile.c
$ du -sh
408K.
$ echo ‘/* small change */’ >> bigfile.c
$ git commit -as -m “small change, big difference”
$ du -sh
496K.
$
WAIT!
Q: What If Small Change Inside A Big File?
A: Git Pick up Diff-Only If Necessary
But, Don’t Forget To Keep It Small, Simple
$ du -sh
496K.
$ git gc
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 1), reused 0 (delta 0)
$ du -sh
388K.
Mission #2:
Store History Of Directories
tree Object
Point Other Objects(Using Hash) With Name
tree Object
Point Other Objects(Using Hash) With Name
tree
blob blob tree
blob
a113f2
mommy b8934
son
c9240
pets
d9b13
cat
tree Object
Point Other Objects(Using Hash) With Name
“A Root tree Object Is A Snapshot”
tree
blob blob tree
blob
a113f2
mommy b8934
son
c9240
pets
d9b13
cat
I’m a
snapshot
tree object
$ mkdir pets; echo ‘snowball’ > pets/cat
$ git update-index --add son pets/cat
$ git write-tree
15ee76ed3e744b6796950d07f26283d033ea3ea7
$
tree object
$ mkdir pets; echo ‘snowball’ > pets/cat
$ git update-index --add son pets/cat
$ git write-tree
15ee76ed3e744b6796950d07f26283d033ea3ea7
$ git cat-file -p 15ee7
040000 tree 85ab72cf1946dc56392718a1aafb3c6f66c02072 pets
100644 blob 8e1e2f09585e021c9727585af72e10871d7be7ce son
$
tree object
$ mkdir pets; echo ‘snowball’ > pets/cat
$ git update-index --add son pets/cat
$ git write-tree
15ee76ed3e744b6796950d07f26283d033ea3ea7
$ git cat-file -p 15ee7
040000 tree 85ab72cf1946dc56392718a1aafb3c6f66c02072 pets
100644 blob 8e1e2f09585e021c9727585af72e10871d7be7ce son
$ git cat-file -p 85ab7
100644 blob 6a1f952e1baedcb3db93a3ea5e3389e5a87941e9 cat
$ git cat-file -p 6a1f9
snowball
$
Internal Data Structure
tree
blob tree
8e1e2
son
85ab7
pets
Internal Data Structure
tree
blob tree
blob
6a1f9
cat
8e1e2
son
85ab7
pets
Version Control Using tree Object
$ echo “bart” > son
$ git update-index --add son
$ git write-tree
661e6ad514a7f05c46c2931280cb78a339d34ee2
$
Version Control Using tree Object
$ echo “bart” > son
$ git update-index --add son
$ git write-tree
661e6ad514a7f05c46c2931280cb78a339d34ee2
$ git cat-file -p 661e6
040000 tree 85ab72cf1946dc56392718a1aafb3c6f66c02072 pets
100644 blob e00ddae83bdab443f4267426623aa34636c935f2 son
$
Version Control Using tree Object
$ echo “bart” > son
$ git update-index --add son
$ git write-tree
661e6ad514a7f05c46c2931280cb78a339d34ee2
$ git cat-file -p 661e6
040000 tree 85ab72cf1946dc56392718a1aafb3c6f66c02072 pets
100644 blob e00ddae83bdab443f4267426623aa34636c935f2 son
$ git cat-file -p e00dd
bart
$
Internal Data Structure
tree
blob tree
blob
8e1e2
son
85ab7
pets
6a1f9
cat
Internal Data Structure
tree
blob tree
blob
tree
blob
e00dd
son85ab7
pets
8e1e2
son
85ab7
pets
6a1f9
cat
Version Control Using Hash Value
● DONE
○ Efficient Space Usage
○ Safe Record / Checkout Of History
● TODO
○ Support Directory Structure
○ History Management
○ Better Reference Than Hash Value
https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
Version Control Using tree Object
● DONE
○ Efficient Space Usage
○ Safe Record / Checkout Of History
○ Support Directory Structure
● TODO
○ History Management
○ Better Reference Than Hash Value
https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
Mission #3:
Commit Message
commit Object
Describe Who / When / Why The Change Made
http://modthink.com/wp-content/uploads/2013/05/WhoWhatWhenWhereWHY.jpg
commit Object
Describe Who / When / Why The Change Made
Point A tree Object With Information Above
http://modthink.com/wp-content/uploads/2013/05/WhoWhatWhenWhereWHY.jpg
commit Object
$ echo '1st commit' | git commit-tree 661e6
0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0
$
commit Object
$ echo '1st commit' | git commit-tree 661e6
0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0
$
$ git cat-file -p d075c
tree 661e6ad514a7f05c46c2931280cb78a339d34ee2
author SeongJae Park <s**@gmail.com> 1410527921 +0900
committer SeongJae Park <s**@gmail.com> 1410527921 +0900
1st commit
$
commit Object
$ echo '1st commit' | git commit-tree 661e6
0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0
$
$ git cat-file -p d075c
tree 661e6ad514a7f05c46c2931280cb78a339d34ee2
author SeongJae Park <s**@gmail.com> 1410527921 +0900
committer SeongJae Park <s**@gmail.com> 1410527921 +0900
1st commit
$
Who When
Why
Version Control Using commit Object
$ echo '2nd commit' | git commit-tree 15ee7 -p 0ca73
003b5e66caa89a6228c7b4d91e0475e56bf1bdf6
$
$ git cat-file -p 003b5
tree 15ee76ed3e744b6796950d07f26283d033ea3ea7
parent 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0
author SeongJae Park <s**@gmail.com> 1410528231 +0900
committer SeongJae Park <s**@gmail.com> 1410528231 +0900
2nd commit
$
Internal Data Structure
That’s Why People Says, “A Commit is a
snapshot”
tree
blob tree
blob
tree
blob
commit commit
tree
parent
tree
85ab7
pets
8e1e2
son
85ab7
pets
6a1f9
cat
e00dd
son
Version Control Using tree Object
● DONE
○ Efficient Space Usage
○ Safe Record / Checkout Of History
○ Support Directory Structure
● TODO
○ History Management
○ Better Reference Than Hash Value
https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
Version Control Using commit Object
● DONE
○ Efficient Space Usage
○ Safe Record / Checkout Of History
○ Support Directory Structure
○ Manage History Well
● TODO
○ Better Reference Than Hash Value
https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
Mission #4:
Human Readable Name
Git References
File With Human-Readable Name
Git References
File With Human-Readable Name
Storing SHA-1 Value Of commit Object
Git References
File With Human-Readable Name
Storing SHA-1 Value Of commit Object
Resides In .git/refs/
Git References Using echo
$ echo "0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0" > .git/refs/heads/first
$
Git References Using echo
$ echo "0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0" > .git/refs/heads/first
$
$ git log --pretty=oneline first
0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit
$
Git References Using echo
$ echo "0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0" > .git/refs/heads/first
$
$ git log --pretty=oneline first
0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit
$
$ find .git/refs/heads -type f
.git/refs/heads/first
.git/refs/heads/master
$
Git References Using update-ref
$ git update-ref refs/heads/master 003b5
$ git log --pretty=oneline master
003b5e66caa89a6228c7b4d91e0475e56bf1bdf6 2nd commit
0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit
$
Git References Using update-ref
$ git update-ref refs/heads/master 003b5
$ git log --pretty=oneline master
003b5e66caa89a6228c7b4d91e0475e56bf1bdf6 2nd commit
0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit
$
$ find .git/refs/heads -type f
.git/refs/heads/first
.git/refs/heads/master
$
Git References Using update-ref
$ git update-ref refs/heads/master 003b5
$ git log --pretty=oneline master
003b5e66caa89a6228c7b4d91e0475e56bf1bdf6 2nd commit
0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit
$
$ find .git/refs/heads -type f
.git/refs/heads/first
.git/refs/heads/master
$
$ cat .git/refs/heads/master
003b5e66caa89a6228c7b4d91e0475e56bf1bdf6
Internal Data Structure
tree
blob tree
blob
tree
blob
commit commit
tree
parent
tree
85ab7
pets
8e1e2
son
85ab7
pets
e00dd
son
6a1f9
cat
Internal Data Structure
tree
blob tree
blob
tree
blob
commit commit
tree
parent
tree
refs/heads/
master
refs/heads/
first
85ab7
pets
8e1e2
son
85ab7
pets
e00dd
son
6a1f9
cat
Version Control Using commit Object
● DONE
○ Efficient Space Usage
○ Safe Record / Checkout Of History
○ Support Directory Structure
○ Manage History Well
● TODO
○ Better Reference Than Hash Value
https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
Version Control Using Reference
● DONE
○ Efficient Space Usage
○ Safe Record / Checkout Of History
○ Support Directory Structure
○ Manage History Well
○ Easy To Remember Specific Snapshot
● TODO
○ ...cooperation?
https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
FAQ #1
How Git Make-up Working Directory?
How Git Knows Current Commit?
Answer: HEAD
How Git Knows Current Commit?
Answer: HEAD
HEAD Points reference Using ref format(Not
SHA-1)
How Git Knows Current Commit?
Answer: HEAD
HEAD Points reference Using ref format
(Not SHA-1)
$ cat .git/HEAD
ref: refs/heads/master
HEAD
$ cat .git/HEAD
ref: refs/heads/master
$
HEAD
$ cat .git/HEAD
ref: refs/heads/master
$ git branch
first
* master
$
HEAD
$ cat .git/HEAD
ref: refs/heads/master
$ git branch
first
* master
$
$ git symbolic-ref HEAD refs/heads/first
$ cat .git/HEAD
ref: refs/heads/first
$ git branch
* first
master
Internal Data Structure
tree
blob tree
blob
tree
blob
commit commit
tree
parent
tree
refs/heads/
master
refs/heads/
first
85ab7
pets
8e1e2
son
85ab7
pets
e00dd
son
6a1f9
cat
Internal Data Structure
tree
blob tree
blob
tree
blob
commit commit
tree
parent
tree
refs/heads/
master
refs/heads/
first
.git/HEAD
85ab7
pets
8e1e2
son
85ab7
pets
e00dd
son
6a1f9
cat
FAQ #2
Cloned. Now Fetch Or Pull ?
Fetch / Pull
Fetch Or Pull To Get Latest Code?
Fetch
● Just Fetch Remote Repository’s Objects And
References To Local Git Internal Storage
Fetch
● Just Fetch Remote Repository’s Objects And
References To Local Git Internal Storage
● If You Need The Changes On Your Working
Directory,
Fetch
● Just Fetch Remote Repository’s Objects And
References To Local Git Internal Storage
● If You Need The Changes On Your Working
Directory,
○ Manually Merge Them Using git-merge Or,
○ Checkout
Fetch
Refspec Describes Source / Destination
$ cat .git/config | grep remote -A3
[remote "origin"]
url = git://10.0.0.1/git/simpsons.git
fetch = +refs/heads/*:refs/remotes/origin/*
Source Destination
Fetch: Before
url = git://10.0.0.1/git/simpsons.git
fetch = +refs/heads/*:refs/remotes/origin/*
tree
blob tree
blob
a134f
son
799cf
pets
7cc07
cat
tree
blob
65464
son
799cf
pets
commit commit
tree
parent
tree
refs/
heads/
master
.git/
HEAD
git://10.0.0.1/git/simpsons.git
tree
blob tree
blob
a134f
son
799cf
pets
7cc07
cat
commit
tree
refs/
heads/
master
.git/
HEAD
file:///home/sjpark/simpsons
Fetch: After
url = git://10.0.0.1/git/simpsons.git
fetch = +refs/heads/*:refs/remotes/origin/*
tree
blob tree
blob
a134f
son
799cf
pets
7cc07
cat
tree
blob
65464
son
799cf
pets
commit commit
tree
parent
tree
refs/
heads/
master
.git/
HEAD
git://10.0.0.1/git/simpsons.git
tree
blob tree
blob
a134f
son
799cf
pets
7cc07
cat
tree
blob
65464
son
799cf
pets
commit commit
tree
parent
tree
refs/
remotes/
origin/
master
refs/
heads/
master
.git/
HEAD
file:///home/sjpark/simpsons
git merge origin/master
tree
blob tree
blob
a134f
son
799cf
pets
7cc07
cat
tree
blob
65464
son
799cf
pets
commit commit
tree
parent
tree
refs/
remotes/
origin/
master
refs/
heads/
first
.git/
HEAD
tree
blob tree
blob
a134f
son
799cf
pets
7cc07
cat
tree
blob
65464
son
799cf
pets
commit commit
tree
parent
tree
refs/
remotes/
origin/
master
refs/
heads/
first
.git/
HEAD
Pull
Pull Is Just An Abbrev Of Fetch && Merge
May Merge Conflict Occur…
Pull Is Sufficient For Simple Project
Wrap-up
In Short,
Git Is A Content-Addressable File System
Blob, Tree, Commit, Reference. That’s It =3
http://www.juliagiff.com/wp-content/uploads/2014/03/tld
r_trollcat.jpg
Thank you :)
http://jeancharpentier.files.wordpress.com/2012/02/capture-plein-c3a9cran-01022012-230955.jpg
Slide-share
http://www.slideshare.net/SeongJaePark1/dee
p-darkside-ofgit
Latest Version Of This Slide Would Be
There
References
http://git-scm.com/book
http://www.youtube.com/watch?v=4XpnKHJAok8
http://en.wikipedia.org/wiki/The_Simpsons
This slide has been used for
Samsung Open Source CONference 2014
This work by SeongJae Park is licensed under the
Creative Commons Attribution-ShareAlike 3.0 Unported
License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/3.0/.

More Related Content

What's hot

Git (Internals)
Git (Internals)Git (Internals)
Git (Internals)
Sabin Bhatta
 
The everyday developer's guide to version control with Git
The everyday developer's guide to version control with GitThe everyday developer's guide to version control with Git
The everyday developer's guide to version control with Git
E Carter
 
Git Started With Git
Git Started With GitGit Started With Git
Git Started With Git
Nick Quaranto
 
Github
GithubGithub
Github
MeetPatel710
 
Advanced Git
Advanced GitAdvanced Git
Advanced Git
Sergiu-Ioan Ungur
 
Git vs svn
Git vs svnGit vs svn
Git vs svn
Suman Mukherjee
 
Git & GitLab
Git & GitLabGit & GitLab
Git & GitLab
Gaurav Wable
 
Monitoring MySQL Replication lag with Prometheus & pt-heartbeat
Monitoring MySQL Replication lag with Prometheus & pt-heartbeatMonitoring MySQL Replication lag with Prometheus & pt-heartbeat
Monitoring MySQL Replication lag with Prometheus & pt-heartbeat
Julien Pivotto
 
Git Lab Introduction
Git Lab IntroductionGit Lab Introduction
Git Lab Introduction
Krunal Doshi
 
Git utilisation quotidienne
Git   utilisation quotidienneGit   utilisation quotidienne
Git utilisation quotidienne
Sylvain Witmeyer
 
Git for beginners
Git for beginnersGit for beginners
Git for beginners
Arulmurugan Rajaraman
 
Case Study: Migration to GitLab (from Bitbucket) at AppsFlyer
Case Study: Migration to GitLab (from Bitbucket) at AppsFlyerCase Study: Migration to GitLab (from Bitbucket) at AppsFlyer
Case Study: Migration to GitLab (from Bitbucket) at AppsFlyer
Noa Harel
 
Git One Day Training Notes
Git One Day Training NotesGit One Day Training Notes
Git One Day Training Notes
glen_a_smith
 
Git-flow workflow and pull-requests
Git-flow workflow and pull-requestsGit-flow workflow and pull-requests
Git-flow workflow and pull-requests
Bartosz Kosarzycki
 
Git training v10
Git training v10Git training v10
Git training v10
Skander Hamza
 
Git 101 for Beginners
Git 101 for Beginners Git 101 for Beginners
Git 101 for Beginners
Anurag Upadhaya
 
Intro to Git and GitHub
Intro to Git and GitHubIntro to Git and GitHub
Intro to Git and GitHub
Panagiotis Papadopoulos
 
Introduction to Git and Github
Introduction to Git and GithubIntroduction to Git and Github
Introduction to Git and Github
Roland Emmanuel Salunga
 
Git in 10 minutes
Git in 10 minutesGit in 10 minutes
Git in 10 minutes
Safique Ahmed Faruque
 

What's hot (20)

Git (Internals)
Git (Internals)Git (Internals)
Git (Internals)
 
The everyday developer's guide to version control with Git
The everyday developer's guide to version control with GitThe everyday developer's guide to version control with Git
The everyday developer's guide to version control with Git
 
Introduction to Git and Github
Introduction to Git and GithubIntroduction to Git and Github
Introduction to Git and Github
 
Git Started With Git
Git Started With GitGit Started With Git
Git Started With Git
 
Github
GithubGithub
Github
 
Advanced Git
Advanced GitAdvanced Git
Advanced Git
 
Git vs svn
Git vs svnGit vs svn
Git vs svn
 
Git & GitLab
Git & GitLabGit & GitLab
Git & GitLab
 
Monitoring MySQL Replication lag with Prometheus & pt-heartbeat
Monitoring MySQL Replication lag with Prometheus & pt-heartbeatMonitoring MySQL Replication lag with Prometheus & pt-heartbeat
Monitoring MySQL Replication lag with Prometheus & pt-heartbeat
 
Git Lab Introduction
Git Lab IntroductionGit Lab Introduction
Git Lab Introduction
 
Git utilisation quotidienne
Git   utilisation quotidienneGit   utilisation quotidienne
Git utilisation quotidienne
 
Git for beginners
Git for beginnersGit for beginners
Git for beginners
 
Case Study: Migration to GitLab (from Bitbucket) at AppsFlyer
Case Study: Migration to GitLab (from Bitbucket) at AppsFlyerCase Study: Migration to GitLab (from Bitbucket) at AppsFlyer
Case Study: Migration to GitLab (from Bitbucket) at AppsFlyer
 
Git One Day Training Notes
Git One Day Training NotesGit One Day Training Notes
Git One Day Training Notes
 
Git-flow workflow and pull-requests
Git-flow workflow and pull-requestsGit-flow workflow and pull-requests
Git-flow workflow and pull-requests
 
Git training v10
Git training v10Git training v10
Git training v10
 
Git 101 for Beginners
Git 101 for Beginners Git 101 for Beginners
Git 101 for Beginners
 
Intro to Git and GitHub
Intro to Git and GitHubIntro to Git and GitHub
Intro to Git and GitHub
 
Introduction to Git and Github
Introduction to Git and GithubIntroduction to Git and Github
Introduction to Git and Github
 
Git in 10 minutes
Git in 10 minutesGit in 10 minutes
Git in 10 minutes
 

Similar to Deep dark-side of git: How git works internally

DO YOU WANT TO USE A VCS
DO YOU WANT TO USE A VCSDO YOU WANT TO USE A VCS
DO YOU WANT TO USE A VCS
SeongJae Park
 
GTFO: Git Theory For OpenSource
GTFO: Git Theory For OpenSourceGTFO: Git Theory For OpenSource
GTFO: Git Theory For OpenSource
Forest Mars
 
Git - An Introduction
Git - An IntroductionGit - An Introduction
Git - An Introduction
Behzad Altaf
 
Git inter-snapshot public
Git  inter-snapshot publicGit  inter-snapshot public
Git inter-snapshot public
SeongJae Park
 
That's (g)it! par Sébastien Dawans CETIC
That's (g)it! par Sébastien Dawans CETICThat's (g)it! par Sébastien Dawans CETIC
That's (g)it! par Sébastien Dawans CETIC
La FeWeb
 
Git
GitGit
Becoming a Git Master - Nicola Paolucci
Becoming a Git Master - Nicola PaolucciBecoming a Git Master - Nicola Paolucci
Becoming a Git Master - Nicola Paolucci
Atlassian
 
Git basics
Git basicsGit basics
Git basics
Malihe Asemani
 
390a gitintro 12au
390a gitintro 12au390a gitintro 12au
390a gitintro 12au
Nguyen Van Hung
 
.Git for WordPress Developers
.Git for WordPress Developers.Git for WordPress Developers
.Git for WordPress Developers
mpvanwinkle
 
Git Anti-Patterns: How To Mess Up With Git and Love it Again - DevoxxPL 2017
Git Anti-Patterns: How To Mess Up With Git and Love it Again - DevoxxPL 2017Git Anti-Patterns: How To Mess Up With Git and Love it Again - DevoxxPL 2017
Git Anti-Patterns: How To Mess Up With Git and Love it Again - DevoxxPL 2017
Lemi Orhan Ergin
 
Git Magic: Versioning Files like a Boss
Git Magic: Versioning Files like a BossGit Magic: Versioning Files like a Boss
Git Magic: Versioning Files like a Boss
tmacwilliam
 
Source Code Management systems
Source Code Management systemsSource Code Management systems
Source Code Management systems
xSawyer
 
Version control
Version controlVersion control
Version control
Rajesh Khadka
 
Git Anti-Patterns: How To Mess Up With Git and Love it Again
Git Anti-Patterns: How To Mess Up With Git and Love it AgainGit Anti-Patterns: How To Mess Up With Git and Love it Again
Git Anti-Patterns: How To Mess Up With Git and Love it Again
Lemi Orhan Ergin
 
Becoming a Git Master
Becoming a Git MasterBecoming a Git Master
Becoming a Git Master
Nicola Paolucci
 
Introduction to GIT
Introduction to GITIntroduction to GIT
Introduction to GIT
Arpit Mohan
 
Git Basics (Professionals)
 Git Basics (Professionals) Git Basics (Professionals)
Git Basics (Professionals)
bryanbibat
 
簡單介紹git
簡單介紹git簡單介紹git
簡單介紹git
Grace Chien
 

Similar to Deep dark-side of git: How git works internally (20)

DO YOU WANT TO USE A VCS
DO YOU WANT TO USE A VCSDO YOU WANT TO USE A VCS
DO YOU WANT TO USE A VCS
 
GTFO: Git Theory For OpenSource
GTFO: Git Theory For OpenSourceGTFO: Git Theory For OpenSource
GTFO: Git Theory For OpenSource
 
Git - An Introduction
Git - An IntroductionGit - An Introduction
Git - An Introduction
 
Git inter-snapshot public
Git  inter-snapshot publicGit  inter-snapshot public
Git inter-snapshot public
 
That's (g)it! par Sébastien Dawans CETIC
That's (g)it! par Sébastien Dawans CETICThat's (g)it! par Sébastien Dawans CETIC
That's (g)it! par Sébastien Dawans CETIC
 
Git
GitGit
Git
 
Becoming a Git Master - Nicola Paolucci
Becoming a Git Master - Nicola PaolucciBecoming a Git Master - Nicola Paolucci
Becoming a Git Master - Nicola Paolucci
 
Git basics
Git basicsGit basics
Git basics
 
390a gitintro 12au
390a gitintro 12au390a gitintro 12au
390a gitintro 12au
 
Loading...git
Loading...gitLoading...git
Loading...git
 
.Git for WordPress Developers
.Git for WordPress Developers.Git for WordPress Developers
.Git for WordPress Developers
 
Git Anti-Patterns: How To Mess Up With Git and Love it Again - DevoxxPL 2017
Git Anti-Patterns: How To Mess Up With Git and Love it Again - DevoxxPL 2017Git Anti-Patterns: How To Mess Up With Git and Love it Again - DevoxxPL 2017
Git Anti-Patterns: How To Mess Up With Git and Love it Again - DevoxxPL 2017
 
Git Magic: Versioning Files like a Boss
Git Magic: Versioning Files like a BossGit Magic: Versioning Files like a Boss
Git Magic: Versioning Files like a Boss
 
Source Code Management systems
Source Code Management systemsSource Code Management systems
Source Code Management systems
 
Version control
Version controlVersion control
Version control
 
Git Anti-Patterns: How To Mess Up With Git and Love it Again
Git Anti-Patterns: How To Mess Up With Git and Love it AgainGit Anti-Patterns: How To Mess Up With Git and Love it Again
Git Anti-Patterns: How To Mess Up With Git and Love it Again
 
Becoming a Git Master
Becoming a Git MasterBecoming a Git Master
Becoming a Git Master
 
Introduction to GIT
Introduction to GITIntroduction to GIT
Introduction to GIT
 
Git Basics (Professionals)
 Git Basics (Professionals) Git Basics (Professionals)
Git Basics (Professionals)
 
簡單介紹git
簡單介紹git簡單介紹git
簡單介紹git
 

More from SeongJae Park

Biscuit: an operating system written in go
Biscuit:  an operating system written in goBiscuit:  an operating system written in go
Biscuit: an operating system written in go
SeongJae Park
 
GCMA: Guaranteed Contiguous Memory Allocator
GCMA: Guaranteed Contiguous Memory AllocatorGCMA: Guaranteed Contiguous Memory Allocator
GCMA: Guaranteed Contiguous Memory Allocator
SeongJae Park
 
Linux Kernel Memory Model
Linux Kernel Memory ModelLinux Kernel Memory Model
Linux Kernel Memory Model
SeongJae Park
 
An Introduction to the Formalised Memory Model for Linux Kernel
An Introduction to the Formalised Memory Model for Linux KernelAn Introduction to the Formalised Memory Model for Linux Kernel
An Introduction to the Formalised Memory Model for Linux Kernel
SeongJae Park
 
Design choices of golang for high scalability
Design choices of golang for high scalabilityDesign choices of golang for high scalability
Design choices of golang for high scalability
SeongJae Park
 
Brief introduction to kselftest
Brief introduction to kselftestBrief introduction to kselftest
Brief introduction to kselftest
SeongJae Park
 
Understanding of linux kernel memory model
Understanding of linux kernel memory modelUnderstanding of linux kernel memory model
Understanding of linux kernel memory model
SeongJae Park
 
Let the contribution begin (EST futures)
Let the contribution begin  (EST futures)Let the contribution begin  (EST futures)
Let the contribution begin (EST futures)
SeongJae Park
 
Porting golang development environment developed with golang
Porting golang development environment developed with golangPorting golang development environment developed with golang
Porting golang development environment developed with golang
SeongJae Park
 
gcma: guaranteed contiguous memory allocator
gcma:  guaranteed contiguous memory allocatorgcma:  guaranteed contiguous memory allocator
gcma: guaranteed contiguous memory allocator
SeongJae Park
 
An introduction to_golang.avi
An introduction to_golang.aviAn introduction to_golang.avi
An introduction to_golang.avi
SeongJae Park
 
Develop Android/iOS app using golang
Develop Android/iOS app using golangDevelop Android/iOS app using golang
Develop Android/iOS app using golang
SeongJae Park
 
Develop Android app using Golang
Develop Android app using GolangDevelop Android app using Golang
Develop Android app using Golang
SeongJae Park
 
Sw install with_without_docker
Sw install with_without_dockerSw install with_without_docker
Sw install with_without_docker
SeongJae Park
 
(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi
SeongJae Park
 
Deep dark side of git - prologue
Deep dark side of git - prologueDeep dark side of git - prologue
Deep dark side of git - prologueSeongJae Park
 
Experimental android hacking using reflection
Experimental android hacking using reflectionExperimental android hacking using reflection
Experimental android hacking using reflection
SeongJae Park
 
ash
ashash
Hacktime for adk
Hacktime for adkHacktime for adk
Hacktime for adk
SeongJae Park
 
Let the contribution begin
Let the contribution beginLet the contribution begin
Let the contribution begin
SeongJae Park
 

More from SeongJae Park (20)

Biscuit: an operating system written in go
Biscuit:  an operating system written in goBiscuit:  an operating system written in go
Biscuit: an operating system written in go
 
GCMA: Guaranteed Contiguous Memory Allocator
GCMA: Guaranteed Contiguous Memory AllocatorGCMA: Guaranteed Contiguous Memory Allocator
GCMA: Guaranteed Contiguous Memory Allocator
 
Linux Kernel Memory Model
Linux Kernel Memory ModelLinux Kernel Memory Model
Linux Kernel Memory Model
 
An Introduction to the Formalised Memory Model for Linux Kernel
An Introduction to the Formalised Memory Model for Linux KernelAn Introduction to the Formalised Memory Model for Linux Kernel
An Introduction to the Formalised Memory Model for Linux Kernel
 
Design choices of golang for high scalability
Design choices of golang for high scalabilityDesign choices of golang for high scalability
Design choices of golang for high scalability
 
Brief introduction to kselftest
Brief introduction to kselftestBrief introduction to kselftest
Brief introduction to kselftest
 
Understanding of linux kernel memory model
Understanding of linux kernel memory modelUnderstanding of linux kernel memory model
Understanding of linux kernel memory model
 
Let the contribution begin (EST futures)
Let the contribution begin  (EST futures)Let the contribution begin  (EST futures)
Let the contribution begin (EST futures)
 
Porting golang development environment developed with golang
Porting golang development environment developed with golangPorting golang development environment developed with golang
Porting golang development environment developed with golang
 
gcma: guaranteed contiguous memory allocator
gcma:  guaranteed contiguous memory allocatorgcma:  guaranteed contiguous memory allocator
gcma: guaranteed contiguous memory allocator
 
An introduction to_golang.avi
An introduction to_golang.aviAn introduction to_golang.avi
An introduction to_golang.avi
 
Develop Android/iOS app using golang
Develop Android/iOS app using golangDevelop Android/iOS app using golang
Develop Android/iOS app using golang
 
Develop Android app using Golang
Develop Android app using GolangDevelop Android app using Golang
Develop Android app using Golang
 
Sw install with_without_docker
Sw install with_without_dockerSw install with_without_docker
Sw install with_without_docker
 
(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi
 
Deep dark side of git - prologue
Deep dark side of git - prologueDeep dark side of git - prologue
Deep dark side of git - prologue
 
Experimental android hacking using reflection
Experimental android hacking using reflectionExperimental android hacking using reflection
Experimental android hacking using reflection
 
ash
ashash
ash
 
Hacktime for adk
Hacktime for adkHacktime for adk
Hacktime for adk
 
Let the contribution begin
Let the contribution beginLet the contribution begin
Let the contribution begin
 

Recently uploaded

Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
Globus
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
informapgpstrackings
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
wottaspaceseo
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
Globus
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
e20449
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
kalichargn70th171
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
Georgi Kodinov
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
AMB-Review
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERRORTROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
Tier1 app
 

Recently uploaded (20)

Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERRORTROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
 

Deep dark-side of git: How git works internally

  • 1. How GIT Works Internally SeongJae Park <sj38.park@gmail.com>
  • 2. Nice To Meet You SeongJae Park sj38.park@gmail.com
  • 3. Git DVCS(Distributed Version Control System) http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png
  • 4. Git DVCS(Distributed Version Control System) Made-by Linus Torvalds For Linux http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png http://cdn.memegenerator.net/instances/400x/37078331.jpg
  • 5. Git Many Projects Use Git Because It’s Awesome http://blog.appliedis.com/wp-content/uploads/2013/11/android1.png http://upload.wikimedia.org/wikipedia/en/4/40/Octocat,_a_Mascot_of_Github.jpg http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Tux.svg/512px-Tux.svg.png http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png
  • 6. Git Hard To Learn Confusing For CVCS Users Push? Pull? Fetch? Rebase? HEAD??? http://www.quickmeme.com/img/fd/fd09e17b3393b2ea1cd7e52af1ad7c77f3c2d7a83e9f47d4b90ba3af52dde329.jpg http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png
  • 7. Git: The Information Manager From Hell http://www.youblob.com/sites/default/files/styles/large/public/field/image/frontlego1.png?itok=XA5CXt84
  • 8. Git: The Information Manager From Hell $ git log e83c516 commit e83c5163316f89bfbde7d9ab23ca2e25604af290 Author: Linus Torvalds <torvalds@ppc970.osdl.org> Date: Thu Apr 7 15:13:13 2005 -0700 Initial revision of "git", the information manager from hell http://www.youblob.com/sites/default/files/styles/large/public/field/image/frontlego1.png?itok=XA5CXt84
  • 9. Git: The Information Manager From Hell That’s Why So Confusing And Hard To Learn $ git log e83c516 commit e83c5163316f89bfbde7d9ab23ca2e25604af290 Author: Linus Torvalds <torvalds@ppc970.osdl.org> Date: Thu Apr 7 15:13:13 2005 -0700 Initial revision of "git", the information manager from hell http://www.youblob.com/sites/default/files/styles/large/public/field/image/frontlego1.png?itok=XA5CXt84
  • 10. This Time, We Will... See How Git Works From The Scratch https://lh4.googleusercontent.com/gBpfuABUjSNi2RagtJrGi8TW-pmtgak_0qtGOGubihvKH-5-umreO9C wJgjX2kaA9E7RkLwtEwiDnoMtOgm4iMJ0IWhvXlzlKL1kNVUYWuNa-gLRtRoyNjkVYg
  • 11. This Time, We Will... See How Git Works From The Scratch Just For Fun ...Or To Be Friend Of Git https://lh4.googleusercontent.com/gBpfuABUjSNi2RagtJrGi8TW-pmtgak_0qtGOGubihvKH-5-umreO9C wJgjX2kaA9E7RkLwtEwiDnoMtOgm4iMJ0IWhvXlzlKL1kNVUYWuNa-gLRtRoyNjkVYg
  • 12. This Time, We Will... See How Git Works From The Scratch Just For Fun ...Or To Be Friend Of Git Forget About The Complicated Commands This Time https://lh4.googleusercontent.com/gBpfuABUjSNi2RagtJrGi8TW-pmtgak_0qtGOGubihvKH-5-umreO9C wJgjX2kaA9E7RkLwtEwiDnoMtOgm4iMJ0IWhvXlzlKL1kNVUYWuNa-gLRtRoyNjkVYg
  • 13. In Short, Git Is A Content-Addressable Storage System http://www.juliagiff.com/wp-content/uploads/2014/03/tld r_trollcat.jpg
  • 14. In Short, Git Is A Content-Addressable Storage System Blob, Tree, Commit, Reference. That’s It =3 http://www.juliagiff.com/wp-content/uploads/2014/03/tld r_trollcat.jpg
  • 15. Plumbers: Unsung Heroes Behind ● Git Looks Graceful Owing To Plumbing Commands Consisting Them http://cfile4.uf.tistory.com/image/182FF7244CFDDFB33CC999 http://cfile29.uf.tistory.com/image/18574F224CFDD89B163073
  • 16. Plumbers: Unsung Heroes Behind ● Git Looks Graceful Owing To Plumbing Commands Consisting Them ○ The Wounded Foots Are What We Interested In http://cfile4.uf.tistory.com/image/182FF7244CFDDFB33CC999 http://cfile29.uf.tistory.com/image/18574F224CFDD89B163073
  • 17. Again, From The Scratch VCS? Why? How?
  • 18. Why VCS? Usual Life Of File FileA ver 0 FileB ver 0
  • 19. Why VCS? Usual Life Of File FileA ver 0 FileB ver 1FileB ver 0
  • 20. Why VCS? Usual Life Of File FileA ver 0 FileB ver 1
  • 21. Why VCS? Usual Life Of File FileB ver 1 FileA ver 1FileA ver 0
  • 22. Why VCS? Usual Life Of File FileB ver 1 FileA ver 1
  • 23. Why VCS? Usual Life Of File FileB ver 2FileA ver 1FileB ver 1
  • 24. Why VCS? Usual Life Of File FileB ver 2FileA ver 1
  • 25. Why VCS? Usual Life Of File FileB ver 2FileA ver 1
  • 26. We Need Version Control System VCS Would... Record Every Changes Safely, Efficiently
  • 27. We Need Version Control System VCS Would... Record Every Changes Safely, Efficiently Able To Check Out Any Version
  • 28. We Need Version Control System VCS Would... Record Every Changes Safely, Efficiently Able To Check Out Any Version Easy To Read History
  • 29. Brute-force Idea Version Control Using File System
  • 30. Brute-force Idea Rename / Backup Every Files Whenever Change Made
  • 31. Brute-force Idea Rename / Backup Every Files Whenever Change Made $ ls foo.c
  • 32. Brute-force Idea Rename / Backup Every Files Whenever Change Made $ ls foo.c foo_20140111.c
  • 33. Brute-force Idea Rename / Backup Every Files Whenever Change Made $ ls foo.c foo_20140111.c foo_final.c
  • 34. Brute-force Idea Rename / Backup Every Files Whenever Change Made $ ls foo.c foo_20140111.c foo_final.c foo_realfinal.c foo_planb.c foo_finalfinal.c
  • 35. Brute-force Idea Rename / Backup Every Files Whenever Change Made $ ls foo.c foo_20140111.c foo_final.c foo_realfinal.c foo_planb.c foo_finalfinal.c
  • 36. Brute-force Idea + History Isolation Keep Working / History Directory Seperately.
  • 37. Brute-force Idea + History Isolation Keep Working / History Directory Seperately. Better, But... $ find . -type f ./working/foo.c ./history/foo_20140111.c ./history/foo_final.c ./history/foo_realfinal.c ./history/foo_planb.c ./history/foo_finalfinal.c
  • 38. TODOs From Version Control Using FS Use Storage Space-Efficiently
  • 39. TODOs From Version Control Using FS Use Storage Space-Efficiently Easy History Searching
  • 40. Mission #1: Store History Space-Efficiently
  • 41. Basic Idea: Avoid Duplicated Objects
  • 42. Basic Idea: Avoid Duplicated Objects Content-Addressable Storage System
  • 43. Basic Idea: Avoid Duplicated Objects Content-Addressable Storage System Key: SHA-1 Hash Of Object’s Content Value: Compressed Content
  • 44. Basic Idea: Avoid Duplicated Objects Content-Addressable Storage System Key: SHA-1 Hash Of Object’s Content Value: Compressed Content Same Content Never Saved Twice
  • 45. Save / Load ‘homer’ $ mkdir simpsons; cd simpsons; git init Initialized empty Git repository in simpsons/.git/ $ echo ‘homer’ | git hash-object -w --stdin 4aa0bfa07f1680c50a1567ecc37bc3b6aa567b8f $
  • 46. Save / Load ‘homer’ $ mkdir simpsons; cd simpsons; git init Initialized empty Git repository in simpsons/.git/ $ echo ‘homer’ | git hash-object -w --stdin 4aa0bfa07f1680c50a1567ecc37bc3b6aa567b8f $ find .git/objects/ -type f .git/objects/4a/a0bfa07f1680c50a1567ecc37bc3b6aa567b8f $
  • 47. Save / Load ‘homer’ $ mkdir simpsons; cd simpsons; git init Initialized empty Git repository in simpsons/.git/ $ echo ‘homer’ | git hash-object -w --stdin 4aa0bfa07f1680c50a1567ecc37bc3b6aa567b8f $ find .git/objects/ -type f .git/objects/4a/a0bfa07f1680c50a1567ecc37bc3b6aa567b8f $ git cat-file -p 4aa0b homer $ git cat-file -t 4aa0b blob
  • 48. What `hash-object -w` did hash_object_w(‘homern’)
  • 49. What `hash-object -w` did hash_object_w(‘homern’) # Save compressed header + content at sha1 path def hash_object_w(content): header = ‘blob %d0’ % len(content) store = header + content sha1 = sha.new(store).hexdigest()
  • 50. What `hash-object -w` did hash_object_w(‘homern’) # Save compressed header + content at sha1 path def hash_object_w(content): header = ‘blob %d0’ % len(content) store = header + content sha1 = sha.new(store).hexdigest() dir = ‘.git/objects/’ + sha1[0:2] + ‘/’ filename = sha1[2:]
  • 51. What `hash-object -w` did hash_object_w(‘homern’) # Save compressed header + content at sha1 path def hash_object_w(content): header = ‘blob %d0’ % len(content) store = header + content sha1 = sha.new(store).hexdigest() dir = ‘.git/objects/’ + sha1[0:2] + ‘/’ filename = sha1[2:] open(dir + filename, ‘w’).write( zlib.compress(store))
  • 52. Version Control Using Hash Value $ echo “bart” > son $ git hash-object -w son e00ddae83bdab443f4267426623aa34636c935f2 $
  • 53. Version Control Using Hash Value $ echo “bart” > son $ git hash-object -w son e00ddae83bdab443f4267426623aa34636c935f2 $ echo “hugo” > son $ git hash-object -w son 8e1e2f09585e021c9727585af72e10871d7be7ce $
  • 54. Version Control Using Hash Value $ echo “bart” > son $ git hash-object -w son e00ddae83bdab443f4267426623aa34636c935f2 $ echo “hugo” > son $ git hash-object -w son 8e1e2f09585e021c9727585af72e10871d7be7ce $ # Need former version, “bart” $ git cat-file -p e00dd > son $ cat son bart
  • 55. TODOs From Version Control Using FS Use Storage Space-Efficiently Easy History Searching
  • 56. Version Control Using Hash Value ● DONE ○ Efficient Space Usage ○ Safe Record / Checkout Of History https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
  • 57. Version Control Using Hash Value ● DONE ○ Efficient Space Usage ○ Safe Record / Checkout Of History ● TODO ○ Support Directory Structure ○ History Management ○ Better Reference Than Hash Value https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
  • 58. WAIT! Q: What If Small Changes Inside A Big File?
  • 59. WAIT! Q: What If Small Changes Inside A Big File? $ du -h bigfile.c 188Kbigfile.c $ du -sh 408K. $ echo ‘/* small change */’ >> bigfile.c $ git commit -as -m “small change, big difference” $ du -sh 496K. $
  • 60. WAIT! Q: What If Small Change Inside A Big File? A: Git Pick up Diff-Only If Necessary But, Don’t Forget To Keep It Small, Simple $ du -sh 496K. $ git gc Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (6/6), done. Total 6 (delta 1), reused 0 (delta 0) $ du -sh 388K.
  • 61. Mission #2: Store History Of Directories
  • 62. tree Object Point Other Objects(Using Hash) With Name
  • 63. tree Object Point Other Objects(Using Hash) With Name tree blob blob tree blob a113f2 mommy b8934 son c9240 pets d9b13 cat
  • 64. tree Object Point Other Objects(Using Hash) With Name “A Root tree Object Is A Snapshot” tree blob blob tree blob a113f2 mommy b8934 son c9240 pets d9b13 cat I’m a snapshot
  • 65. tree object $ mkdir pets; echo ‘snowball’ > pets/cat $ git update-index --add son pets/cat $ git write-tree 15ee76ed3e744b6796950d07f26283d033ea3ea7 $
  • 66. tree object $ mkdir pets; echo ‘snowball’ > pets/cat $ git update-index --add son pets/cat $ git write-tree 15ee76ed3e744b6796950d07f26283d033ea3ea7 $ git cat-file -p 15ee7 040000 tree 85ab72cf1946dc56392718a1aafb3c6f66c02072 pets 100644 blob 8e1e2f09585e021c9727585af72e10871d7be7ce son $
  • 67. tree object $ mkdir pets; echo ‘snowball’ > pets/cat $ git update-index --add son pets/cat $ git write-tree 15ee76ed3e744b6796950d07f26283d033ea3ea7 $ git cat-file -p 15ee7 040000 tree 85ab72cf1946dc56392718a1aafb3c6f66c02072 pets 100644 blob 8e1e2f09585e021c9727585af72e10871d7be7ce son $ git cat-file -p 85ab7 100644 blob 6a1f952e1baedcb3db93a3ea5e3389e5a87941e9 cat $ git cat-file -p 6a1f9 snowball $
  • 68. Internal Data Structure tree blob tree 8e1e2 son 85ab7 pets
  • 69. Internal Data Structure tree blob tree blob 6a1f9 cat 8e1e2 son 85ab7 pets
  • 70. Version Control Using tree Object $ echo “bart” > son $ git update-index --add son $ git write-tree 661e6ad514a7f05c46c2931280cb78a339d34ee2 $
  • 71. Version Control Using tree Object $ echo “bart” > son $ git update-index --add son $ git write-tree 661e6ad514a7f05c46c2931280cb78a339d34ee2 $ git cat-file -p 661e6 040000 tree 85ab72cf1946dc56392718a1aafb3c6f66c02072 pets 100644 blob e00ddae83bdab443f4267426623aa34636c935f2 son $
  • 72. Version Control Using tree Object $ echo “bart” > son $ git update-index --add son $ git write-tree 661e6ad514a7f05c46c2931280cb78a339d34ee2 $ git cat-file -p 661e6 040000 tree 85ab72cf1946dc56392718a1aafb3c6f66c02072 pets 100644 blob e00ddae83bdab443f4267426623aa34636c935f2 son $ git cat-file -p e00dd bart $
  • 73. Internal Data Structure tree blob tree blob 8e1e2 son 85ab7 pets 6a1f9 cat
  • 74. Internal Data Structure tree blob tree blob tree blob e00dd son85ab7 pets 8e1e2 son 85ab7 pets 6a1f9 cat
  • 75. Version Control Using Hash Value ● DONE ○ Efficient Space Usage ○ Safe Record / Checkout Of History ● TODO ○ Support Directory Structure ○ History Management ○ Better Reference Than Hash Value https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
  • 76. Version Control Using tree Object ● DONE ○ Efficient Space Usage ○ Safe Record / Checkout Of History ○ Support Directory Structure ● TODO ○ History Management ○ Better Reference Than Hash Value https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
  • 78. commit Object Describe Who / When / Why The Change Made http://modthink.com/wp-content/uploads/2013/05/WhoWhatWhenWhereWHY.jpg
  • 79. commit Object Describe Who / When / Why The Change Made Point A tree Object With Information Above http://modthink.com/wp-content/uploads/2013/05/WhoWhatWhenWhereWHY.jpg
  • 80. commit Object $ echo '1st commit' | git commit-tree 661e6 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 $
  • 81. commit Object $ echo '1st commit' | git commit-tree 661e6 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 $ $ git cat-file -p d075c tree 661e6ad514a7f05c46c2931280cb78a339d34ee2 author SeongJae Park <s**@gmail.com> 1410527921 +0900 committer SeongJae Park <s**@gmail.com> 1410527921 +0900 1st commit $
  • 82. commit Object $ echo '1st commit' | git commit-tree 661e6 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 $ $ git cat-file -p d075c tree 661e6ad514a7f05c46c2931280cb78a339d34ee2 author SeongJae Park <s**@gmail.com> 1410527921 +0900 committer SeongJae Park <s**@gmail.com> 1410527921 +0900 1st commit $ Who When Why
  • 83. Version Control Using commit Object $ echo '2nd commit' | git commit-tree 15ee7 -p 0ca73 003b5e66caa89a6228c7b4d91e0475e56bf1bdf6 $ $ git cat-file -p 003b5 tree 15ee76ed3e744b6796950d07f26283d033ea3ea7 parent 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 author SeongJae Park <s**@gmail.com> 1410528231 +0900 committer SeongJae Park <s**@gmail.com> 1410528231 +0900 2nd commit $
  • 84. Internal Data Structure That’s Why People Says, “A Commit is a snapshot” tree blob tree blob tree blob commit commit tree parent tree 85ab7 pets 8e1e2 son 85ab7 pets 6a1f9 cat e00dd son
  • 85. Version Control Using tree Object ● DONE ○ Efficient Space Usage ○ Safe Record / Checkout Of History ○ Support Directory Structure ● TODO ○ History Management ○ Better Reference Than Hash Value https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
  • 86. Version Control Using commit Object ● DONE ○ Efficient Space Usage ○ Safe Record / Checkout Of History ○ Support Directory Structure ○ Manage History Well ● TODO ○ Better Reference Than Hash Value https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
  • 88. Git References File With Human-Readable Name
  • 89. Git References File With Human-Readable Name Storing SHA-1 Value Of commit Object
  • 90. Git References File With Human-Readable Name Storing SHA-1 Value Of commit Object Resides In .git/refs/
  • 91. Git References Using echo $ echo "0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0" > .git/refs/heads/first $
  • 92. Git References Using echo $ echo "0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0" > .git/refs/heads/first $ $ git log --pretty=oneline first 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit $
  • 93. Git References Using echo $ echo "0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0" > .git/refs/heads/first $ $ git log --pretty=oneline first 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit $ $ find .git/refs/heads -type f .git/refs/heads/first .git/refs/heads/master $
  • 94. Git References Using update-ref $ git update-ref refs/heads/master 003b5 $ git log --pretty=oneline master 003b5e66caa89a6228c7b4d91e0475e56bf1bdf6 2nd commit 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit $
  • 95. Git References Using update-ref $ git update-ref refs/heads/master 003b5 $ git log --pretty=oneline master 003b5e66caa89a6228c7b4d91e0475e56bf1bdf6 2nd commit 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit $ $ find .git/refs/heads -type f .git/refs/heads/first .git/refs/heads/master $
  • 96. Git References Using update-ref $ git update-ref refs/heads/master 003b5 $ git log --pretty=oneline master 003b5e66caa89a6228c7b4d91e0475e56bf1bdf6 2nd commit 0ca7304ad6f5a40f8a26ba05b10b514ff2d8d8a0 1st commit $ $ find .git/refs/heads -type f .git/refs/heads/first .git/refs/heads/master $ $ cat .git/refs/heads/master 003b5e66caa89a6228c7b4d91e0475e56bf1bdf6
  • 97. Internal Data Structure tree blob tree blob tree blob commit commit tree parent tree 85ab7 pets 8e1e2 son 85ab7 pets e00dd son 6a1f9 cat
  • 98. Internal Data Structure tree blob tree blob tree blob commit commit tree parent tree refs/heads/ master refs/heads/ first 85ab7 pets 8e1e2 son 85ab7 pets e00dd son 6a1f9 cat
  • 99. Version Control Using commit Object ● DONE ○ Efficient Space Usage ○ Safe Record / Checkout Of History ○ Support Directory Structure ○ Manage History Well ● TODO ○ Better Reference Than Hash Value https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
  • 100. Version Control Using Reference ● DONE ○ Efficient Space Usage ○ Safe Record / Checkout Of History ○ Support Directory Structure ○ Manage History Well ○ Easy To Remember Specific Snapshot ● TODO ○ ...cooperation? https://www.sciencenews.org/sites/default/files/main/articles/sad_opener.jpg
  • 101. FAQ #1 How Git Make-up Working Directory?
  • 102. How Git Knows Current Commit? Answer: HEAD
  • 103. How Git Knows Current Commit? Answer: HEAD HEAD Points reference Using ref format(Not SHA-1)
  • 104. How Git Knows Current Commit? Answer: HEAD HEAD Points reference Using ref format (Not SHA-1) $ cat .git/HEAD ref: refs/heads/master
  • 105. HEAD $ cat .git/HEAD ref: refs/heads/master $
  • 106. HEAD $ cat .git/HEAD ref: refs/heads/master $ git branch first * master $
  • 107. HEAD $ cat .git/HEAD ref: refs/heads/master $ git branch first * master $ $ git symbolic-ref HEAD refs/heads/first $ cat .git/HEAD ref: refs/heads/first $ git branch * first master
  • 108. Internal Data Structure tree blob tree blob tree blob commit commit tree parent tree refs/heads/ master refs/heads/ first 85ab7 pets 8e1e2 son 85ab7 pets e00dd son 6a1f9 cat
  • 109. Internal Data Structure tree blob tree blob tree blob commit commit tree parent tree refs/heads/ master refs/heads/ first .git/HEAD 85ab7 pets 8e1e2 son 85ab7 pets e00dd son 6a1f9 cat
  • 110. FAQ #2 Cloned. Now Fetch Or Pull ?
  • 111. Fetch / Pull Fetch Or Pull To Get Latest Code?
  • 112. Fetch ● Just Fetch Remote Repository’s Objects And References To Local Git Internal Storage
  • 113. Fetch ● Just Fetch Remote Repository’s Objects And References To Local Git Internal Storage ● If You Need The Changes On Your Working Directory,
  • 114. Fetch ● Just Fetch Remote Repository’s Objects And References To Local Git Internal Storage ● If You Need The Changes On Your Working Directory, ○ Manually Merge Them Using git-merge Or, ○ Checkout
  • 115. Fetch Refspec Describes Source / Destination $ cat .git/config | grep remote -A3 [remote "origin"] url = git://10.0.0.1/git/simpsons.git fetch = +refs/heads/*:refs/remotes/origin/* Source Destination
  • 116. Fetch: Before url = git://10.0.0.1/git/simpsons.git fetch = +refs/heads/*:refs/remotes/origin/* tree blob tree blob a134f son 799cf pets 7cc07 cat tree blob 65464 son 799cf pets commit commit tree parent tree refs/ heads/ master .git/ HEAD git://10.0.0.1/git/simpsons.git tree blob tree blob a134f son 799cf pets 7cc07 cat commit tree refs/ heads/ master .git/ HEAD file:///home/sjpark/simpsons
  • 117. Fetch: After url = git://10.0.0.1/git/simpsons.git fetch = +refs/heads/*:refs/remotes/origin/* tree blob tree blob a134f son 799cf pets 7cc07 cat tree blob 65464 son 799cf pets commit commit tree parent tree refs/ heads/ master .git/ HEAD git://10.0.0.1/git/simpsons.git tree blob tree blob a134f son 799cf pets 7cc07 cat tree blob 65464 son 799cf pets commit commit tree parent tree refs/ remotes/ origin/ master refs/ heads/ master .git/ HEAD file:///home/sjpark/simpsons
  • 118. git merge origin/master tree blob tree blob a134f son 799cf pets 7cc07 cat tree blob 65464 son 799cf pets commit commit tree parent tree refs/ remotes/ origin/ master refs/ heads/ first .git/ HEAD tree blob tree blob a134f son 799cf pets 7cc07 cat tree blob 65464 son 799cf pets commit commit tree parent tree refs/ remotes/ origin/ master refs/ heads/ first .git/ HEAD
  • 119. Pull Pull Is Just An Abbrev Of Fetch && Merge May Merge Conflict Occur… Pull Is Sufficient For Simple Project
  • 121. In Short, Git Is A Content-Addressable File System Blob, Tree, Commit, Reference. That’s It =3 http://www.juliagiff.com/wp-content/uploads/2014/03/tld r_trollcat.jpg
  • 125. This slide has been used for Samsung Open Source CONference 2014
  • 126. This work by SeongJae Park is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/.