Figure 1: Gitlet architecture showing the relationship between working directory, staging area, and commits
Project Overview
Gitlet is a lightweight version control system that implements the core functionality of Git. This project was developed to gain a deeper understanding of how version control systems work under the hood, with a focus on the data structures and algorithms that power Git.
Features
Gitlet implements the following core Git features:
Commits: Save snapshots of your files
Branches: Create independent lines of development
Merging: Combine changes from different branches
Remote repositories: Push and pull changes to/from remote repositories
Conflict resolution: Handle conflicting changes between branches
Technical Implementation
Gitlet is implemented in Java and uses the following key components:
Content-addressable storage: Files are stored based on their content hash
Directed acyclic graph (DAG): Represents the history of commits
Serialization: Persists objects to disk for durability
SHA-1 hashing: Generates unique identifiers for commits and blobs
Tree data structure: Efficiently represents directory structures
Command-Line Interface
Gitlet provides a command-line interface similar to Git, supporting the following commands:
$ gitlet init # Initialize a new Gitlet repository $ gitlet add [file] # Add file contents to the staging area $ gitlet commit [msg] # Record changes to the repository $ gitlet rm [file] # Remove file from working directory and staging area $ gitlet log # Display commit history $ gitlet global-log # Display all commits ever made $ gitlet find [msg] # Find commit with a given message $ gitlet status # Show the status of the working directory $ gitlet checkout # Restore working directory files $ gitlet branch [name] # Create a new branch $ gitlet rm-branch # Delete a branch $ gitlet reset [commit] # Reset current branch head to commit $ gitlet merge [branch] # Join two development histories together