Home / Git

Understanding Git's Data Model (Blobs, Trees, Commits)

Git, the most popular version control system, uses a unique data model to manage the changes made to a project. This data model consists of three main components, namely blobs, trees, and commits. Understanding how these components work together is crucial for anyone using Git.


A blob, short for "binary large object," represents the content of a file. It can be any file - whether it's a text file, an image, a document, or even a binary executable. Git handles each file in a project as a separate blob. Blobs are stored as objects in a Git repository and are identified by their SHA-1 hash.

When a file is initially added to Git, it is converted into a blob and assigned a unique SHA-1 hash based on its content. Blobs are immutable, meaning that once a blob is created, it cannot be changed. If a file is modified, Git creates a new blob representing the updated version.


A tree in Git represents a directory or a folder. It is essentially a collection of blobs and other trees. Each tree contains a list of references to blobs and other trees, along with their file names and permissions. By organizing blobs into a tree structure, Git can maintain the hierarchical structure of a project.

Similar to blobs, Git assigns each tree a unique SHA-1 hash based on its content. However, unlike blobs, trees can be modified. If a file is added, deleted, or modified within a directory, Git creates a new tree that reflects the changes. The new tree retains references to any unchanged objects while updating or adding references for the modified or new objects.


Commits are the backbone of Git's data model. A commit represents a specific version of a project at a given point in time. It contains a snapshot of the project's directory structure represented by a tree, along with some metadata like the author, timestamp, and a commit message.

A commit is created when changes are made to a project. Git creates a new tree to represent the project's updated state and creates a commit object that points to this tree. Each commit has a unique SHA-1 hash, and it also includes a reference to its parent commit(s), thus forming a chain.

Git's commit chain enables it to track the entire history of a project. By traversing the commit graph backward, Git can reconstruct any past version of the project by applying the changes introduced through each commit. This allows for efficient branching, merging, and reverting of changes.


Git's data model, based on the concepts of blobs, trees, and commits, is key to its effectiveness as a version control system. Understanding how these components interact and represent the project's files, directories, and history is essential for working effectively with Git. Whether you're a beginner or an experienced user, getting to grips with Git's data model is a fundamental step towards mastering this powerful tool.

noob to master © copyleft