Pages / #git / #version-control
How Git stores data
Git keeps every version as objects named by the SHA-1 of their bytes: blobs for file contents, trees for folders, commits for snapshots. A branch is a file holding one hash.
Commit and watch the objectsInteractive
- Object types
- blob, tree, commit, tag
- Object name
- SHA-1, 40 hex characters
- Where objects live
- .git/objects, by hash
- A branch on disk
- 41 bytes
- Compression
- zlib
- History shape
- Directed acyclic graph
From HEAD to the bytes
In words
Objects named by their content
7/7
Git is a content-addressable filesystem: at its core is a simple key-value data store 12. Store some content and the key you get back is its SHA-1 hash, a checksum of the content plus a header 3, usually written as 40 hexadecimal characters 4. The object goes under .git/objects, in a folder named for the first 2 characters of the hash and a file named for the other 38 5, compressed with zlib 6. A blob holds only the content, not the file name 7.
7 of 7 quotes found in their sources
-
Pro Git, 10.2 Git Internals - Git Objects git-scm.com
Git is a content-addressable filesystem
Quote found in the source -
Pro Git, 10.2 Git Internals - Git Objects git-scm.com
at the core of Git is a simple key-value data store
Quote found in the source -
Pro Git, 10.2 Git Internals - Git Objects git-scm.com
This is the SHA-1 hash — a checksum of the content you’re storing plus a header
Quote found in the source -
gitglossary: a Git glossary (git-scm.com) git-scm.com
The object name is usually represented by a 40 character hexadecimal string.
Quote found in the source -
Pro Git, 10.2 Git Internals - Git Objects git-scm.com
The subdirectory is named with the first 2 characters of the SHA-1, and the filename is the remaining 38 characters.
Quote found in the source -
Pro Git, 10.2 Git Internals - Git Objects git-scm.com
Git compresses the new content with zlib
Quote found in the source -
Pro Git, 10.2 Git Internals - Git Objects git-scm.com
you aren't storing the filename in your system — just the content
Quote found in the source
Trees, commits and the graph
4/4
Names live in trees: each tree entry is the SHA-1 of a blob or subtree with its mode, type and filename 1. A commit names the top-level tree of a snapshot and its parent commits, if any, plus author and committer 2. Because every commit points at its parents, the commits form a directed acyclic graph 3, a graph of the same kind PageRank walks over links. Blob, tree, commit and tag are the four object types 4.
4 of 4 quotes found in their sources
-
Pro Git, 10.2 Git Internals - Git Objects git-scm.com
A single tree object contains one or more entries, each of which is the SHA-1 hash of a blob or subtree with its associated mode, type, and filename.
Quote found in the source -
Pro Git, 10.2 Git Internals - Git Objects git-scm.com
it specifies the top-level tree for the snapshot of the project at that point; the parent commits if any
Quote found in the source -
gitglossary: a Git glossary (git-scm.com) git-scm.com
The commit objects form a directed acyclic graph, because they have parents (directed)
Quote found in the source -
gitglossary: a Git glossary (git-scm.com) git-scm.com
One of the identifiers "commit", "tree", "tag" or "blob"
Quote found in the source
A branch is a 41-byte file
4/4
A branch is a simple pointer or reference to the head of a line of work 1. On disk it is a file holding the 40-character hash of a commit, so creating one means writing 41 bytes: 40 characters and a newline 2. HEAD is usually a symbolic reference to the branch you are on 3, and the branch head moves forward as you commit 4.
4 of 4 quotes found in their sources
-
Pro Git, 10.3 Git Internals - Git References git-scm.com
That's basically what a branch in Git is: a simple pointer or reference to the head of a line of work.
Quote found in the source -
Pro Git, 3.1 Git Branching - Branches in a Nutshell git-scm.com
Creating a new branch is as quick and simple as writing 41 bytes to a file (40 characters and a newline).
Quote found in the source -
Pro Git, 10.3 Git Internals - Git References git-scm.com
Usually the HEAD file is a symbolic reference to the branch you're currently on.
Quote found in the source -
gitglossary: a Git glossary (git-scm.com) git-scm.com
The tip of the branch is referenced by a branch head, which moves forward as additional development is done on the branch.
Quote found in the source