{
    "componentChunkName": "component---src-pages-blog-index-js",
    "path": "/blog/",
    "result": {"data":{"allMarkdownRemark":{"edges":[{"node":{"frontmatter":{"title":"Building Lit: A Journey Through Distributed Systems","description":"How building a Git clone from scratch illuminates the core principles of distributed computing, from content-addressable storage to eventual consistency.","slug":"/blog/lit","date":"2025-01-14T00:00:00.000Z","tags":["Distributed Systems","Python"],"draft":false},"html":"<span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 646px; \">\n      <a class=\"gatsby-resp-image-link\" href=\"/static/8e655d51063fb43451e0c7d4526ef341/87eb3/1.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 56.57142857142857%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAACHklEQVQoz3WRS2sUQRSF8xeSSTIzXV3dVfNwph/T093Vj0mMIkHJ0oUajEYkQTBZuNGFj0UggqBEcBHFjdn6Nz+Z6kkgYBYH6hbnfJxbtVQUisnEJ4oaxbEiGjmEw25zjjzCQZuwt06gVxv11ux9HPvENuMThj4bG5olYxSuKxFC4koPZ61N/842g+0de5Z6wOjhE0aP9ogOjwkPjhjv7uN6ymaEK22+05FU1QLo+x6e5+FrhVhZZvLqGHPyBdleRwUBs18XpG8/UJ2dU//4TXL0Bj1JkELg+Z7Nz+FXwDlMSomnFKK1QrR/QPruI6LVwh8OKc/O0cmU4PFTsvcnSMfB81WT8ZoyjnMTcGWZ+PA15vM31GhkQfX5H9so3HuBOf2K216/Anme/D+wWVnjrraIn79k8+KvXdF8OqX6/pNemhHtPrOzFA6+71vd0FDiOA7dbpdup417a4QqKmSa4dcz1GwToTVOv49flDhC0Ol0rIQQ9g2vAZXySZIpVVWRpimVKZnGCWVeUCQ5aZSQTVOqoiJPUqbTxlvXNUEQ4LoCIbwFMFe2+mQywRhDHMUUW4b8bkZ9v6LeKSm2DflWxuxBTXHPkCSJhRVFwXg8xnXd5pdLzVJZ6msrO10HoR3cgUD0HWQokIHA7TWzO5y3mXs7VvN2lyvPZnNgoSiMIs81Zi6jyTNNniryVJNPVaPLOV14zcKbK6ssU9ze1PwDERxPABxTOhAAAAAASUVORK5CYII='); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"Lit Version Control System\" title=\"Lit Version Control System\" src=\"/static/8e655d51063fb43451e0c7d4526ef341/87eb3/1.png\" srcset=\"/static/8e655d51063fb43451e0c7d4526ef341/1aaec/1.png 175w,\n/static/8e655d51063fb43451e0c7d4526ef341/98287/1.png 350w,\n/static/8e655d51063fb43451e0c7d4526ef341/87eb3/1.png 646w\" sizes=\"(max-width: 646px) 100vw, 646px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\" decoding=\"async\">\n  </a>\n    </span>\n<h2>Introduction</h2>\n<p>Every day, millions of developers push, pull, and merge code without thinking twice. But underneath Git's familiar commands lies one of the most elegant distributed systems ever built: a system that solves problems like data consistency, conflict resolution, and partition tolerance in ways that would make any distributed systems engineer proud.</p>\n<p><strong>Lit</strong> is my implementation of Git's core features from scratch in Python. Building it taught me more about distributed systems than any textbook could. This post explores how version control systems embody the fundamental principles of distributed computing.</p>\n<blockquote>\n<p>\"The best way to understand distributed systems is to build one.\"</p>\n</blockquote>\n<hr>\n<h2>The Distributed Systems Problem</h2>\n<p>Before diving into Lit, let's frame the problem. Distributed version control must solve several classic challenges:</p>\n<table>\n<thead>\n<tr>\n<th>Challenge</th>\n<th>Distributed Systems</th>\n<th>Version Control</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Ordering Events</td>\n<td>How do we know what happened first?</td>\n<td>Which commit came before which?</td>\n</tr>\n<tr>\n<td>Replication</td>\n<td>How do we keep copies in sync?</td>\n<td>How do clones stay updated?</td>\n</tr>\n<tr>\n<td>Consistency</td>\n<td>When do all nodes agree?</td>\n<td>When is a merge \"complete\"?</td>\n</tr>\n<tr>\n<td>Partition Tolerance</td>\n<td>What if nodes can't communicate?</td>\n<td>What if you're offline?</td>\n</tr>\n<tr>\n<td>Conflict Resolution</td>\n<td>What if two nodes disagree?</td>\n<td>What if two devs edit the same line?</td>\n</tr>\n</tbody>\n</table>\n<p>Git, and by extension Lit, provides elegant solutions to all of these.</p>\n<hr>\n<h2>Part I: The Object Model</h2>\n<h3>Content-Addressable Storage</h3>\n<p>At Lit's core is a simple but powerful idea: <strong>content-addressable storage</strong>. Every piece of data is stored and retrieved using its SHA-1 hash.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">LitObject</span><span class=\"token punctuation\">(</span>ABC<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Base class for all Lit objects.\"\"\"</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">compute_hash</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"\n        Objects are hashed with a header: &lt;type> &lt;size>\\0&lt;content>\n        The same content always produces the same hash.\n        \"\"\"</span>\n        data <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>serialize<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        header <span class=\"token operator\">=</span> <span class=\"token string-interpolation\"><span class=\"token string\">f\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>self<span class=\"token punctuation\">.</span><span class=\"token builtin\">type</span><span class=\"token punctuation\">}</span></span><span class=\"token string\"> </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\\0\"</span></span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>_hash <span class=\"token operator\">=</span> hashlib<span class=\"token punctuation\">.</span>sha1<span class=\"token punctuation\">(</span>header <span class=\"token operator\">+</span> data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>hexdigest<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>_hash</code></pre></div>\n<p>This design has profound implications for distributed systems:</p>\n<ul>\n<li><strong>Immutability</strong>: Objects never change. The same content always produces the same hash.</li>\n<li><strong>Integrity</strong>: Any corruption is immediately detectable. If the hash doesn't match, the data is invalid.</li>\n<li><strong>Deduplication</strong>: Identical files across the entire history are stored exactly once.</li>\n<li><strong>Trustless Verification</strong>: Any node can verify data authenticity without trusting the source.</li>\n</ul>\n<h3>The Three Object Types</h3>\n<p>Lit implements three fundamental object types:</p>\n<p><strong>1. Blobs</strong> store raw file content:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Blob</span><span class=\"token punctuation\">(</span>LitObject<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Raw file content, no metadata.\"\"\"</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">:</span> <span class=\"token builtin\">bytes</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>data <span class=\"token operator\">=</span> data <span class=\"token keyword\">or</span> <span class=\"token string\">b''</span></code></pre></div>\n<p><strong>2. Trees</strong> represent directory structures:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Tree</span><span class=\"token punctuation\">(</span>LitObject<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Directory structure: list of (mode, name, hash) entries.\"\"\"</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>entries<span class=\"token punctuation\">:</span> List<span class=\"token punctuation\">[</span>TreeEntry<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p><strong>3. Commits</strong> capture snapshots with history:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Commit</span><span class=\"token punctuation\">(</span>LitObject<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Snapshot in time with parent links.\"\"\"</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>tree<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span> <span class=\"token operator\">=</span> <span class=\"token string\">''</span>           <span class=\"token comment\"># Root tree hash</span>\n        self<span class=\"token punctuation\">.</span>parents<span class=\"token punctuation\">:</span> List<span class=\"token punctuation\">[</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>  <span class=\"token comment\"># Parent commit hashes</span>\n        self<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span> <span class=\"token operator\">=</span> <span class=\"token string\">''</span>\n        self<span class=\"token punctuation\">.</span>author_time<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>     <span class=\"token comment\"># Timestamp</span></code></pre></div>\n<p>Together, these form an <strong>immutable, content-addressed data structure</strong>: a foundation that makes the rest of the distributed system possible.</p>\n<hr>\n<h2>Part II: Ordering Events: The Commit DAG</h2>\n<h3>The Problem of Time in Distributed Systems</h3>\n<p>In a centralized system, ordering events is trivial: you have one clock. In a distributed system, each node has its own clock, and clocks can drift. How do we establish ordering?</p>\n<p>Traditional distributed systems use <strong>logical clocks</strong>:</p>\n<ul>\n<li><strong>Lamport Clocks</strong>: A single counter incremented on each event</li>\n<li><strong>Vector Clocks</strong>: A vector of counters, one per node, tracking causality</li>\n</ul>\n<p>Git takes a different approach: the <strong>Directed Acyclic Graph (DAG)</strong>.</p>\n<h3>The Commit DAG as a Logical Clock</h3>\n<p>Each commit in Lit contains pointers to its parent commits:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Commit</span><span class=\"token punctuation\">(</span>LitObject<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>parents<span class=\"token punctuation\">:</span> List<span class=\"token punctuation\">[</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>  <span class=\"token comment\"># Links to parent commits</span></code></pre></div>\n<p>This creates a DAG structure:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">        A ← B ← C ← D ← G (main, merge commit)\n             \\         ↗\n              E ← F ──┘ (feature)</code></pre></div>\n<p>The DAG provides <strong>causal ordering</strong> without synchronized clocks:</p>\n<ul>\n<li>If commit B points to A as a parent, <strong>A happened before B</strong></li>\n<li>If C and E have no ancestor relationship, they are <strong>concurrent</strong></li>\n<li>The structure itself encodes the happens-before relationship</li>\n</ul>\n<h3>Comparing to Vector Clocks</h3>\n<table>\n<thead>\n<tr>\n<th>Aspect</th>\n<th>Vector Clocks</th>\n<th>Git DAG</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Size</td>\n<td>O(n) per event, n = nodes</td>\n<td>O(k) per commit, k = parents</td>\n</tr>\n<tr>\n<td>History</td>\n<td>Implicit in clock values</td>\n<td>Explicit graph structure</td>\n</tr>\n<tr>\n<td>Concurrency</td>\n<td>Compare vectors</td>\n<td>Find merge base</td>\n</tr>\n<tr>\n<td>Visualization</td>\n<td>Abstract</td>\n<td>Natural branching diagram</td>\n</tr>\n</tbody>\n</table>\n<p>The DAG is essentially a <strong>sparse representation of a vector clock</strong> optimized for version control's access patterns.</p>\n<h3>Finding Common Ancestors</h3>\n<p>To merge two branches, Lit must find their <strong>Lowest Common Ancestor (LCA)</strong>: the most recent commit both branches share:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">find_merge_base</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> commit1<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> commit2<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> Optional<span class=\"token punctuation\">[</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"\n    Find the best common ancestor using BFS.\n    This is the merge base, essential for three-way merge.\n    \"\"\"</span>\n    <span class=\"token keyword\">if</span> commit1 <span class=\"token operator\">==</span> commit2<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> commit1\n    \n    ancestors1 <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>_get_all_ancestors<span class=\"token punctuation\">(</span>commit1<span class=\"token punctuation\">)</span>\n    ancestors2 <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>_get_all_ancestors<span class=\"token punctuation\">(</span>commit2<span class=\"token punctuation\">)</span>\n    \n    common <span class=\"token operator\">=</span> ancestors1 <span class=\"token operator\">&amp;</span> ancestors2\n    \n    <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> common<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token boolean\">None</span>  <span class=\"token comment\"># Unrelated histories</span>\n    \n    <span class=\"token comment\"># Find the closest common ancestor</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>_find_closest<span class=\"token punctuation\">(</span>commit1<span class=\"token punctuation\">,</span> commit2<span class=\"token punctuation\">,</span> common<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This LCA is crucial: it tells us what both branches started from, enabling intelligent merging.</p>\n<hr>\n<h2>Part III: Replication: Clone, Fetch, Push</h2>\n<h3>Optimistic Replication</h3>\n<p>Lit uses <strong>optimistic replication</strong>: a strategy where replicas can diverge and reconcile later:</p>\n<ol>\n<li><strong>Clone</strong>: Create a complete copy of all data</li>\n<li><strong>Work Offline</strong>: Make changes locally without coordination</li>\n<li><strong>Push/Pull</strong>: Synchronize changes when ready</li>\n<li><strong>Merge</strong>: Reconcile any divergence</li>\n</ol>\n<p>This is fundamentally different from <strong>pessimistic replication</strong> (like two-phase commit), which requires coordination before any change.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">clone</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> source_url<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> dest_path<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> Repository<span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"\n    Clone creates a complete, independent replica.\n    No coordination with source required after clone completes.\n    \"\"\"</span>\n    <span class=\"token comment\"># Copy ALL objects: complete history</span>\n    <span class=\"token keyword\">for</span> obj_file <span class=\"token keyword\">in</span> source_objects<span class=\"token punctuation\">.</span>rglob<span class=\"token punctuation\">(</span><span class=\"token string\">'*'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        copy_object<span class=\"token punctuation\">(</span>obj_file<span class=\"token punctuation\">,</span> dest_repo<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Copy refs as remote-tracking branches</span>\n    <span class=\"token keyword\">for</span> branch <span class=\"token keyword\">in</span> source_branches<span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># refs/heads/main → refs/remotes/origin/main</span>\n        create_remote_tracking_ref<span class=\"token punctuation\">(</span>branch<span class=\"token punctuation\">,</span> dest_repo<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Set up remote for future sync</span>\n    dest_repo<span class=\"token punctuation\">.</span>add_remote<span class=\"token punctuation\">(</span><span class=\"token string\">'origin'</span><span class=\"token punctuation\">,</span> source_url<span class=\"token punctuation\">)</span></code></pre></div>\n<h3>The Fetch-Merge Protocol</h3>\n<p>When synchronizing, Lit separates fetching data from integrating it:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> remote<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span> <span class=\"token operator\">=</span> <span class=\"token string\">'origin'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"\n    Download new objects WITHOUT modifying local branches.\n    Updates refs/remotes/&lt;remote>/* only.\n    \"\"\"</span>\n    url <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>get_remote_url<span class=\"token punctuation\">(</span>remote<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Transfer only missing objects</span>\n    <span class=\"token keyword\">for</span> obj_hash <span class=\"token keyword\">in</span> get_remote_objects<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> self<span class=\"token punctuation\">.</span>repo<span class=\"token punctuation\">.</span>object_exists<span class=\"token punctuation\">(</span>obj_hash<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            download_and_store<span class=\"token punctuation\">(</span>obj_hash<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Update remote-tracking refs</span>\n    <span class=\"token keyword\">for</span> branch<span class=\"token punctuation\">,</span> commit <span class=\"token keyword\">in</span> get_remote_refs<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>update_ref<span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'refs/remotes/</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>remote<span class=\"token punctuation\">}</span></span><span class=\"token string\">/</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>branch<span class=\"token punctuation\">}</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">,</span> commit<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This separation provides:</p>\n<ul>\n<li><strong>Safety</strong>: Local work is never overwritten automatically</li>\n<li><strong>Visibility</strong>: You can inspect remote changes before merging</li>\n<li><strong>Control</strong>: You decide when and how to integrate</li>\n</ul>\n<p>In Lit, this looks like: <code class=\"language-text\">lit fetch origin</code> followed by <code class=\"language-text\">lit merge origin/main</code>.</p>\n<h3>Push and Non-Fast-Forward Rejection</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">push</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> remote<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> branch<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"\n    Upload commits to remote.\n    Fails if it would lose commits (non-fast-forward).\n    \"\"\"</span>\n    local_hash <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>get_branch_hash<span class=\"token punctuation\">(</span>branch<span class=\"token punctuation\">)</span>\n    remote_hash <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>get_remote_branch_hash<span class=\"token punctuation\">(</span>remote<span class=\"token punctuation\">,</span> branch<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Safety check: ensure we're not losing history</span>\n    <span class=\"token keyword\">if</span> remote_hash <span class=\"token keyword\">and</span> <span class=\"token keyword\">not</span> self<span class=\"token punctuation\">.</span>is_ancestor<span class=\"token punctuation\">(</span>remote_hash<span class=\"token punctuation\">,</span> local_hash<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">raise</span> Exception<span class=\"token punctuation\">(</span>\n            <span class=\"token string\">\"Non-fast-forward push rejected. \"</span>\n            <span class=\"token string\">\"Pull and merge first.\"</span>\n        <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Transfer missing objects</span>\n    missing <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>find_missing_objects<span class=\"token punctuation\">(</span>local_hash<span class=\"token punctuation\">,</span> remote_hash<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">for</span> obj_hash <span class=\"token keyword\">in</span> missing<span class=\"token punctuation\">:</span>\n        upload_object<span class=\"token punctuation\">(</span>obj_hash<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Update remote ref</span>\n    update_remote_ref<span class=\"token punctuation\">(</span>remote<span class=\"token punctuation\">,</span> branch<span class=\"token punctuation\">,</span> local_hash<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This rejection of non-fast-forward pushes prevents <strong>lost updates</strong>: a critical property in distributed systems.</p>\n<hr>\n<h2>Part IV: Consistency Models</h2>\n<h3>The CAP Theorem Perspective</h3>\n<p>The CAP theorem states that a distributed system can provide at most two of:</p>\n<ul>\n<li><strong>Consistency</strong>: All nodes see the same data</li>\n<li><strong>Availability</strong>: Every request gets a response</li>\n<li><strong>Partition Tolerance</strong>: System works despite network failures</li>\n</ul>\n<p><strong>Where does Lit/Git fall?</strong></p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Lit's Approach</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Consistency</td>\n<td>❌ Eventual, replicas can diverge</td>\n</tr>\n<tr>\n<td>Availability</td>\n<td>✅ All operations work offline</td>\n</tr>\n<tr>\n<td>Partition Tolerance</td>\n<td>✅ Designed for disconnected operation</td>\n</tr>\n</tbody>\n</table>\n<p>Lit is an <strong>AP system</strong>: it prioritizes Availability and Partition Tolerance, accepting eventual consistency.</p>\n<h3>Eventual Consistency Through Merge</h3>\n<p>Git achieves <strong>eventual consistency</strong> through its merge operation:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">merge</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> branch_name<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> MergeResult<span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"\n    Merge is the consistency mechanism.\n    After merge, both branches reflect all changes.\n    \"\"\"</span>\n    theirs <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>resolve_ref<span class=\"token punctuation\">(</span>branch_name<span class=\"token punctuation\">)</span>\n    ours <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>repo<span class=\"token punctuation\">.</span>refs<span class=\"token punctuation\">.</span>resolve_head<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    base <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>find_merge_base<span class=\"token punctuation\">(</span>ours<span class=\"token punctuation\">,</span> theirs<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># If we're already up-to-date</span>\n    <span class=\"token keyword\">if</span> base <span class=\"token operator\">==</span> theirs<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> MergeResult<span class=\"token punctuation\">(</span>message<span class=\"token operator\">=</span><span class=\"token string\">\"Already up to date\"</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Fast-forward if possible</span>\n    <span class=\"token keyword\">if</span> base <span class=\"token operator\">==</span> ours<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>fast_forward<span class=\"token punctuation\">(</span>theirs<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Three-way merge required</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>three_way_merge<span class=\"token punctuation\">(</span>base<span class=\"token punctuation\">,</span> ours<span class=\"token punctuation\">,</span> theirs<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This model accepts that:</p>\n<ol>\n<li>Replicas can diverge (during disconnected work)</li>\n<li>Divergence is explicitly reconciled (through merge)</li>\n<li>After reconciliation, consistency is restored</li>\n</ol>\n<h3>Strong vs. Eventual: A Trade-off</h3>\n<table>\n<thead>\n<tr>\n<th>Aspect</th>\n<th>Strong Consistency</th>\n<th>Eventual (Git)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Latency</td>\n<td>High (coordination)</td>\n<td>Low (local ops)</td>\n</tr>\n<tr>\n<td>Availability</td>\n<td>Limited during partitions</td>\n<td>Always available</td>\n</tr>\n<tr>\n<td>Complexity</td>\n<td>Simpler mental model</td>\n<td>Must handle divergence</td>\n</tr>\n<tr>\n<td>Use Case</td>\n<td>Banking, inventory</td>\n<td>Collaborative dev</td>\n</tr>\n</tbody>\n</table>\n<p>For collaborative software development, eventual consistency is the right choice: developers need to work independently, and merge conflicts are a natural part of the workflow.</p>\n<hr>\n<h2>Part V: Conflict Resolution: The Three-Way Merge</h2>\n<h3>The Core Algorithm</h3>\n<p>When two developers modify the same file, Lit must decide what to do. The <strong>three-way merge</strong> algorithm compares three versions:</p>\n<ol>\n<li><strong>Base</strong>: The common ancestor</li>\n<li><strong>Ours</strong>: The current branch</li>\n<li><strong>Theirs</strong>: The branch being merged</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">three_way_merge_file</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> base<span class=\"token punctuation\">:</span> <span class=\"token builtin\">bytes</span><span class=\"token punctuation\">,</span> ours<span class=\"token punctuation\">:</span> <span class=\"token builtin\">bytes</span><span class=\"token punctuation\">,</span> theirs<span class=\"token punctuation\">:</span> <span class=\"token builtin\">bytes</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> Tuple<span class=\"token punctuation\">[</span><span class=\"token builtin\">bytes</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">bool</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"\n    Merge a single file using three-way merge.\n    Returns (merged_content, had_conflicts).\n    \"\"\"</span>\n    <span class=\"token comment\"># Case 1: Same in both, no conflict</span>\n    <span class=\"token keyword\">if</span> ours <span class=\"token operator\">==</span> theirs<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> ours<span class=\"token punctuation\">,</span> <span class=\"token boolean\">False</span>\n    \n    <span class=\"token comment\"># Case 2: Only we changed it</span>\n    <span class=\"token keyword\">if</span> base <span class=\"token operator\">==</span> theirs<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> ours<span class=\"token punctuation\">,</span> <span class=\"token boolean\">False</span>\n    \n    <span class=\"token comment\"># Case 3: Only they changed it</span>\n    <span class=\"token keyword\">if</span> base <span class=\"token operator\">==</span> ours<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> theirs<span class=\"token punctuation\">,</span> <span class=\"token boolean\">False</span>\n    \n    <span class=\"token comment\"># Case 4: Both changed, need line-by-line merge</span>\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>_merge_lines<span class=\"token punctuation\">(</span>base<span class=\"token punctuation\">,</span> ours<span class=\"token punctuation\">,</span> theirs<span class=\"token punctuation\">)</span></code></pre></div>\n<h3>Conflict Detection</h3>\n<p>When both branches modify the same lines differently, Lit detects a conflict:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">_merge_lines</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> base<span class=\"token punctuation\">:</span> <span class=\"token builtin\">bytes</span><span class=\"token punctuation\">,</span> ours<span class=\"token punctuation\">:</span> <span class=\"token builtin\">bytes</span><span class=\"token punctuation\">,</span> theirs<span class=\"token punctuation\">:</span> <span class=\"token builtin\">bytes</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> Tuple<span class=\"token punctuation\">[</span><span class=\"token builtin\">bytes</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">bool</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Line-by-line merge with conflict detection.\"\"\"</span>\n    \n    base_lines <span class=\"token operator\">=</span> base<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>splitlines<span class=\"token punctuation\">(</span>keepends<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    ours_lines <span class=\"token operator\">=</span> ours<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>splitlines<span class=\"token punctuation\">(</span>keepends<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    theirs_lines <span class=\"token operator\">=</span> theirs<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>splitlines<span class=\"token punctuation\">(</span>keepends<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    \n    result <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    has_conflicts <span class=\"token operator\">=</span> <span class=\"token boolean\">False</span>\n    \n    <span class=\"token keyword\">for</span> base_line<span class=\"token punctuation\">,</span> our_line<span class=\"token punctuation\">,</span> their_line <span class=\"token keyword\">in</span> align_lines<span class=\"token punctuation\">(</span>base_lines<span class=\"token punctuation\">,</span> ours_lines<span class=\"token punctuation\">,</span> theirs_lines<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> our_line <span class=\"token operator\">==</span> their_line<span class=\"token punctuation\">:</span>\n            result<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>our_line<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">elif</span> base_line <span class=\"token operator\">==</span> their_line<span class=\"token punctuation\">:</span>\n            result<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>our_line<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># We changed it</span>\n        <span class=\"token keyword\">elif</span> base_line <span class=\"token operator\">==</span> our_line<span class=\"token punctuation\">:</span>\n            result<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>their_line<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># They changed it</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># Both changed differently: CONFLICT</span>\n            has_conflicts <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n            result<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n                <span class=\"token string\">\"&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD\\n\"</span><span class=\"token punctuation\">,</span>\n                our_line<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"=======\\n\"</span><span class=\"token punctuation\">,</span>\n                their_line<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\">>>>>>> theirs\\n\"</span>\n            <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">return</span> <span class=\"token string\">''</span><span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> has_conflicts</code></pre></div>\n<h3>Why Three Versions?</h3>\n<p>Without the base, you can't distinguish between:</p>\n<ul>\n<li>\"A changed X to Y, B kept X\" (take Y)</li>\n<li>\"A changed X to Y, B changed X to Z\" (conflict!)</li>\n</ul>\n<p>The base provides <strong>context</strong> for intelligent merging: this is why merge bases matter.</p>\n<h3>Auto-Merge Strategies</h3>\n<p>When conflicts arise, Lit offers automatic resolution with <code class=\"language-text\">lit merge feature --auto</code>. By default, the <code class=\"language-text\">recent</code> strategy is used, where the most recent commits take precedence. But you have options:</p>\n<ul>\n<li><code class=\"language-text\">lit merge feature --auto</code> uses <code class=\"language-text\">recent</code> strategy by default</li>\n<li><code class=\"language-text\">lit merge feature --auto=ours</code> keeps the current branch's version</li>\n<li><code class=\"language-text\">lit merge feature --auto=theirs</code> takes the incoming branch's version</li>\n<li><code class=\"language-text\">lit merge feature --auto=union</code> combines both versions</li>\n</ul>\n<p>This could particularly be useful in CI/CD pipelines or when you have a clear policy about which branch should \"win\" in conflicts.</p>\n<hr>\n<h2>Part VI: Consensus Without Coordination</h2>\n<h3>The Illusion of Agreement</h3>\n<p>Traditional distributed systems achieve consensus through protocols like <strong>Paxos</strong> or <strong>Raft</strong>, requiring multiple rounds of communication. Lit achieves something remarkable: <strong>the appearance of consensus without real-time coordination</strong>.</p>\n<p>How? Through <strong>deterministic merge semantics</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># If DevA and DevB both merge the same branches...</span>\ndevA<span class=\"token punctuation\">:</span> merge<span class=\"token punctuation\">(</span>feature<span class=\"token punctuation\">,</span> main<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># → produces commit X</span>\ndevB<span class=\"token punctuation\">:</span> merge<span class=\"token punctuation\">(</span>feature<span class=\"token punctuation\">,</span> main<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># → produces commit X'</span>\n\n<span class=\"token comment\"># X and X' will have:</span>\n<span class=\"token comment\"># Same tree (same file contents)</span>\n<span class=\"token comment\"># Same parents (same history links)</span>\n<span class=\"token comment\"># Different hashes (different timestamps/authors)</span></code></pre></div>\n<p>The resulting <strong>content</strong> is identical, even without communication. The merge algorithm is deterministic given the same inputs.</p>\n<h3>CRDT-like Properties</h3>\n<p>Git's object model shares properties with <strong>Conflict-Free Replicated Data Types (CRDTs)</strong>:</p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Git Implementation</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Commutativity</td>\n<td>Merge order doesn't affect content</td>\n</tr>\n<tr>\n<td>Associativity</td>\n<td>(A merge B) merge C = A merge (B merge C)</td>\n</tr>\n<tr>\n<td>Idempotency</td>\n<td>Merging same branch twice is safe</td>\n</tr>\n</tbody>\n</table>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># Commutativity demonstration:</span>\nmerge<span class=\"token punctuation\">(</span>A<span class=\"token punctuation\">,</span> B<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># Same content as...</span>\nmerge<span class=\"token punctuation\">(</span>B<span class=\"token punctuation\">,</span> A<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># this (different commit hash, same tree)</span>\n\n<span class=\"token comment\"># Idempotency demonstration:</span>\nmerge<span class=\"token punctuation\">(</span>feature<span class=\"token punctuation\">)</span>\nmerge<span class=\"token punctuation\">(</span>feature<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># Second merge is a no-op</span></code></pre></div>\n<p>These properties ensure that <strong>regardless of synchronization order</strong>, replicas converge to the same state.</p>\n<hr>\n<h2>Part VII: Advanced Operations</h2>\n<h3>Stash: Local State Management</h3>\n<p>The stash saves uncommitted work without creating a commit on any branch. Running <code class=\"language-text\">lit stash</code> saves your changes and cleans the working directory:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">StashManager</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">push</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> message<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> StashEntry<span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"Save working directory and index state.\"\"\"</span>\n        \n        <span class=\"token comment\"># Capture current state as trees</span>\n        index_tree <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>_build_tree_from_index<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        work_tree <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>_build_tree_from_working_dir<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \n        entry <span class=\"token operator\">=</span> StashEntry<span class=\"token punctuation\">(</span>\n            message<span class=\"token operator\">=</span>message <span class=\"token keyword\">or</span> <span class=\"token string-interpolation\"><span class=\"token string\">f\"WIP on </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>branch<span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">,</span>\n            branch<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>get_current_branch<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            commit<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>repo<span class=\"token punctuation\">.</span>refs<span class=\"token punctuation\">.</span>resolve_head<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            index_tree<span class=\"token operator\">=</span>index_tree<span class=\"token punctuation\">,</span>\n            work_tree<span class=\"token operator\">=</span>work_tree<span class=\"token punctuation\">,</span>\n            timestamp<span class=\"token operator\">=</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># Save to stash stack</span>\n        self<span class=\"token punctuation\">.</span>_push_to_stack<span class=\"token punctuation\">(</span>entry<span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># Reset working directory</span>\n        self<span class=\"token punctuation\">.</span>_reset_to_head<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">return</span> entry</code></pre></div>\n<h3>Rebase: Rewriting History</h3>\n<p>Rebase replays commits on top of a new base, creating <strong>new commits with the same changes</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">rebase</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> upstream<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Replay commits on a new base.\"\"\"</span>\n    \n    onto <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>resolve_ref<span class=\"token punctuation\">(</span>upstream<span class=\"token punctuation\">)</span>\n    head <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>repo<span class=\"token punctuation\">.</span>refs<span class=\"token punctuation\">.</span>resolve_head<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    base <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>find_merge_base<span class=\"token punctuation\">(</span>onto<span class=\"token punctuation\">,</span> head<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Get commits to replay (base..HEAD)</span>\n    commits <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>get_commits_between<span class=\"token punctuation\">(</span>base<span class=\"token punctuation\">,</span> head<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Move HEAD to the new base</span>\n    self<span class=\"token punctuation\">.</span>reset_hard<span class=\"token punctuation\">(</span>onto<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># Replay each commit</span>\n    <span class=\"token keyword\">for</span> commit_hash <span class=\"token keyword\">in</span> commits<span class=\"token punctuation\">:</span>\n        original <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>repo<span class=\"token punctuation\">.</span>read_object<span class=\"token punctuation\">(</span>commit_hash<span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># Apply changes from this commit</span>\n        changes <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>get_commit_changes<span class=\"token punctuation\">(</span>commit_hash<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>apply_changes<span class=\"token punctuation\">(</span>changes<span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># Create new commit with same message</span>\n        new_hash <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>create_commit<span class=\"token punctuation\">(</span>\n            message<span class=\"token operator\">=</span>original<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">,</span>\n            author<span class=\"token operator\">=</span>original<span class=\"token punctuation\">.</span>author\n        <span class=\"token punctuation\">)</span></code></pre></div>\n<p><strong>Before rebase:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">        A ← B ← C (main)\n             \\\n              D ← E (feature)</code></pre></div>\n<p><strong>After <code class=\"language-text\">lit rebase main</code> on feature:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">        A ← B ← C (main)\n                 \\\n                  D' ← E' (feature)</code></pre></div>\n<p>D' and E' are <strong>new commits</strong>: same changes, different hashes, different parents.</p>\n<hr>\n<h2>Part VIII: The Architecture</h2>\n<h3>Layered Design</h3>\n<p>Lit follows a clean separation of concerns:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">┌─────────────────────────────────────────────────────────────┐\n│                        CLI Layer                             │\n│    init │ add │ commit │ branch │ merge │ fetch │ push      │\n└────────────────────────────┬────────────────────────────────┘\n                             │\n┌────────────────────────────▼────────────────────────────────┐\n│                    Operations Layer                          │\n│        DiffEngine │ MergeEngine │ StashManager               │\n└────────────────────────────┬────────────────────────────────┘\n                             │\n┌────────────────────────────▼────────────────────────────────┐\n│                       Core Layer                             │\n│    Repository │ Objects │ Index │ Refs │ RemoteManager      │\n└────────────────────────────┬────────────────────────────────┘\n                             │\n┌────────────────────────────▼────────────────────────────────┐\n│                     Storage Layer                            │\n│              .lit/ directory (filesystem)                    │\n└─────────────────────────────────────────────────────────────┘</code></pre></div>\n<h3>Repository Structure</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">.lit/\n├── objects/           # Content-addressable object database\n│   ├── ab/           # Sharded by first 2 hex chars\n│   │   └── cdef...   # Compressed object data\n│   └── ...\n├── refs/\n│   ├── heads/        # Local branches\n│   │   └── main      # → commit hash\n│   ├── tags/         # Tags\n│   └── remotes/      # Remote-tracking branches\n│       └── origin/\n│           └── main\n├── HEAD              # Current branch reference\n├── index             # Staging area (binary format)\n└── config            # Repository configuration</code></pre></div>\n<hr>\n<h2>Conclusion: What Building Lit Taught Me</h2>\n<h3>The Elegance of Git's Design</h3>\n<p>Building a version control system from scratch revealed the brilliance of Git's architecture:</p>\n<ol>\n<li>\n<p><strong>Content-addressable storage</strong> solves integrity, deduplication, and verification in one elegant abstraction</p>\n</li>\n<li>\n<p><strong>The commit DAG</strong> provides causal ordering without synchronized clocks: a distributed systems problem solved through data structure design</p>\n</li>\n<li>\n<p><strong>Three-way merge</strong> enables automatic conflict resolution by preserving context through the merge base</p>\n</li>\n<li>\n<p><strong>Optimistic replication</strong> with explicit merge gives developers freedom while maintaining consistency</p>\n</li>\n</ol>\n<h3>Distributed Systems Principles in Practice</h3>\n<table>\n<thead>\n<tr>\n<th>Concept</th>\n<th>How Git/Lit Implements It</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Logical Clocks</td>\n<td>Commit DAG encodes happens-before</td>\n</tr>\n<tr>\n<td>Replication</td>\n<td>Clone creates full replicas</td>\n</tr>\n<tr>\n<td>Consistency</td>\n<td>Eventual consistency via merge</td>\n</tr>\n<tr>\n<td>Partition Tolerance</td>\n<td>Full offline operation support</td>\n</tr>\n<tr>\n<td>Conflict Resolution</td>\n<td>Three-way merge with user intervention</td>\n</tr>\n<tr>\n<td>Consensus</td>\n<td>Deterministic merge = same result</td>\n</tr>\n</tbody>\n</table>\n<h3>Try It Yourself</h3>\n<p>Lit implements 27 Git commands and is designed for learning. Check out the <a href=\"https://github.com/firiho/lit#quick-example-merge-conflict--auto-resolution\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Quick Example on GitHub</a> for a hands-on walkthrough of merge conflicts and auto-resolution.</p>\n<p>Building your own VCS is one of the best ways to understand both Git and distributed systems. The concepts transfer directly to distributed databases, consensus protocols, and any system where multiple nodes must agree on shared state.</p>\n<hr>\n<h2>Resources</h2>\n<ul>\n<li><a href=\"https://github.com/firiho/lit\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Lit on GitHub</a>: Full source code with 358 tests</li>\n<li><a href=\"https://git-scm.com/book/en/v2\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Pro Git Book</a>: Comprehensive Git guide</li>\n<li><a href=\"https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Git Internals</a>: Deep dive into Git's plumbing</li>\n</ul>\n<hr>\n<p><em>Lit is an educational project demonstrating distributed systems principles. For production use, please use Git.</em></p>"}}]}},"pageContext":{}},
    "staticQueryHashes": ["1994492073","2009693873","2031412112","2318781110","3825832676"]}