<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Wait, Did Databricks Just Put Git Inside My Database? in Community Articles</title>
    <link>https://community.databricks.com/t5/community-articles/wait-did-databricks-just-put-git-inside-my-database/m-p/146805#M997</link>
    <description>&lt;H1&gt;Wait, Did Databricks Just Put Git Inside My Database?&lt;/H1&gt;
&lt;P&gt;If you've been scratching your head at Lakebase's "branching" feature wondering "am I working with a database or GitHub?"—you're not alone. Let me break down what's actually happening here, because once it clicks, it changes how you think about database development entirely.&lt;/P&gt;
&lt;H2&gt;Prerequisites&lt;/H2&gt;
&lt;P&gt;Before we dive in, make sure you've got:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A Databricks workspace on AWS (Lakebase Autoscaling is AWS-only for now)&lt;/LI&gt;
&lt;LI&gt;Your workspace in a supported region: &lt;CODE&gt;us-east-1&lt;/CODE&gt;, &lt;CODE&gt;us-east-2&lt;/CODE&gt;, &lt;CODE&gt;eu-central-1&lt;/CODE&gt;, &lt;CODE&gt;eu-west-1&lt;/CODE&gt;, &lt;CODE&gt;eu-west-2&lt;/CODE&gt;, &lt;CODE&gt;ap-south-1&lt;/CODE&gt;, &lt;CODE&gt;ap-southeast-1&lt;/CODE&gt;, or &lt;CODE&gt;ap-southeast-2&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;Lakebase Autoscaling Preview enabled by your workspace admin&lt;/LI&gt;
&lt;LI&gt;A Lakebase project created (takes about 30 seconds)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;So What Actually IS Lakebase Branching?&lt;/H2&gt;
&lt;P&gt;Here's the thing that confused me initially: Lakebase isn't Delta Lake. It's a fully managed PostgreSQL database. So when we talk about "branching," we're not talking about Delta's transaction log or time travel—we're talking about something fundamentally different.&lt;/P&gt;
&lt;P&gt;When you create a Lakebase project, you automatically get two branches: &lt;CODE&gt;production&lt;/CODE&gt; (your root/default branch) and &lt;CODE&gt;development&lt;/CODE&gt; (a child of production). From there, you can create child branches from any existing branch, building out a hierarchy that looks eerily familiar to anyone who's used Git:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE&gt;production (root - protected)
├── staging
│   └── feature-payments
└── development
    ├── dev-alice
    └── dev-bob
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Each branch is a fully independent PostgreSQL database environment. Changes you make in &lt;CODE&gt;dev-alice&lt;/CODE&gt; don't touch &lt;CODE&gt;dev-bob&lt;/CODE&gt;, and neither affects &lt;CODE&gt;production&lt;/CODE&gt;. It's complete isolation—but without the hours of data copying you'd normally need.&lt;/P&gt;
&lt;H2&gt;The Copy-on-Write Magic (Why It's Instant)&lt;/H2&gt;
&lt;P&gt;Okay, so how does a 200GB database branch in 3 seconds? The answer is copy-on-write storage, and it's actually pretty elegant.&lt;/P&gt;
&lt;P&gt;When you create a branch, Lakebase doesn't duplicate your data. Instead, the new branch just gets pointers to the same underlying storage as its parent. Think of it like Git's branching—the branch itself is essentially free because it's just referencing the same data.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE&gt;BEFORE ANY CHANGES:
                                     
production branch      dev branch (just created)
┌──────────────┐      ┌──────────────┐
│ users table  │◄─────│ → pointer    │
│ orders table │◄─────│ → pointer    │  
│ products     │◄─────│ → pointer    │
└──────────────┘      └──────────────┘
     (actual data)        (no storage cost yet)

AFTER MODIFYING users TABLE IN dev:

production branch      dev branch
┌──────────────┐      ┌──────────────┐
│ users table  │      │ users table' │ ← only this is new storage
│ orders table │◄─────│ → pointer    │
│ products     │◄─────│ → pointer    │
└──────────────┘      └──────────────┘
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The implications are huge:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Branch creation is instant&lt;/STRONG&gt; regardless of database size—10GB or 10TB, doesn't matter&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;You only pay for what changes&lt;/STRONG&gt;—modify 1GB in a 100GB database, you pay for ~1GB extra storage&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Zero performance hit&lt;/STRONG&gt; on production during branching&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2&gt;Creating Your First Branch&lt;/H2&gt;
&lt;P&gt;You can create branches through the Lakebase App UI, Python SDK, Java SDK, CLI, or REST API. Here's the UI workflow:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Open the Lakebase App from the apps switcher&lt;/LI&gt;
&lt;LI&gt;Navigate to your project's Branches page&lt;/LI&gt;
&lt;LI&gt;Click &lt;STRONG&gt;Create branch&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Give it a name (I like the pattern &lt;CODE&gt;dev/yourname&lt;/CODE&gt; for personal branches)&lt;/LI&gt;
&lt;LI&gt;Choose your source—current data or a point in time&lt;/LI&gt;
&lt;LI&gt;Click Create&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;That's it. A few seconds later, you've got a complete branch with its own compute endpoint and connection string.&lt;/P&gt;
&lt;P&gt;If you prefer code, here's the Python SDK approach:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-python"&gt;from databricks.sdk import WorkspaceClient
from databricks.sdk.service.postgres import Branch, BranchSpec, Duration

w = WorkspaceClient()

# Create a branch with 7-day expiration
branch_spec = BranchSpec(
    ttl=Duration(seconds=604800),  # 7 days in seconds
    source_branch="projects/my-project/branches/production"
)

branch = Branch(spec=branch_spec)

result = w.postgres.create_branch(
    parent="projects/my-project",
    branch=branch,
    branch_id="dev-alice"
).wait()

print(f"Branch created: {result.name}")
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Or via CLI:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-bash"&gt;databricks postgres create-branch projects/my-project dev-alice \
  --json '{
    "spec": {
      "source_branch": "projects/my-project/branches/development",
      "ttl": "604800s"
    }
  }'
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;Pro tip&lt;/STRONG&gt;: You can set branches to auto-expire. UI presets are 1 hour, 1 day, or 7 days. Via API, you can set any TTL up to 30 days max—perfect for CI/CD test branches that should clean themselves up.&lt;/P&gt;
&lt;H2&gt;Once You're IN the Branch, It's Just Postgres&lt;/H2&gt;
&lt;P&gt;Here's where it feels normal again. Once you connect to your branch (each branch has its own connection string), you're just running standard PostgreSQL:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-sql"&gt;-- Create a new table for your feature
CREATE TABLE user_preferences (
    id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id),
    theme VARCHAR(50) DEFAULT 'light',
    notifications BOOLEAN DEFAULT true,
    created_at TIMESTAMP DEFAULT NOW()
);

-- Add a column to an existing table
ALTER TABLE users ADD COLUMN last_login TIMESTAMP;

-- Create an index
CREATE INDEX idx_users_last_login ON users(last_login);

-- Insert test data
INSERT INTO user_preferences (user_id, theme) 
VALUES (1, 'dark'), (2, 'light'), (3, 'dark');
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;No special syntax. No branch-aware commands. Just write your migrations like you always have.&lt;/P&gt;
&lt;H2&gt;The Elephant in the Room: There's No Merge&lt;/H2&gt;
&lt;P&gt;Alright, here's the part that'll trip you up if you're expecting full Git semantics: &lt;STRONG&gt;Lakebase doesn't have native merge functionality&lt;/STRONG&gt;. You can't just click a button to promote changes from &lt;CODE&gt;dev-alice&lt;/CODE&gt; back to &lt;CODE&gt;development&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;The docs are clear: "To move changes from child to parent, use your standard migration tools."&lt;/P&gt;
&lt;P&gt;So what's the actual workflow? It looks like this:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Develop and test your schema changes on your feature branch&lt;/LI&gt;
&lt;LI&gt;Use &lt;STRONG&gt;Schema Diff&lt;/STRONG&gt; (more on this in a sec) to review exactly what changed&lt;/LI&gt;
&lt;LI&gt;Apply those same migrations to the parent branch using your migration framework—Alembic, Prisma, Django migrations, Flyway, whatever you use&lt;/LI&gt;
&lt;LI&gt;Reset or delete your feature branch&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;It's not as seamless as Git merge, but honestly? It forces good migration hygiene. You can't get lazy and just "merge and hope"—you have to actually track your schema changes properly.&lt;/P&gt;
&lt;H2&gt;Schema Diff: Your Pre-Merge Safety Net&lt;/H2&gt;
&lt;P&gt;This feature partially makes up for the lack of merge. Schema Diff lets you compare the DDL between any two branches, showing exactly what's different.&lt;/P&gt;
&lt;P&gt;To use it:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Navigate to your child branch in the Lakebase App&lt;/LI&gt;
&lt;LI&gt;Click &lt;STRONG&gt;Schema diff&lt;/STRONG&gt; in the Parent branch section&lt;/LI&gt;
&lt;LI&gt;Select your base branch (defaults to parent) and database&lt;/LI&gt;
&lt;LI&gt;Click Compare&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;You'll get a side-by-side view: red for removed/changed from base, green for added/changed in your branch. It captures tables, columns, constraints, indexes—all your schema objects.&lt;/P&gt;
&lt;P&gt;I've started using this before EVERY migration promotion. It's caught a few "oops, I didn't mean to add that column" moments.&lt;/P&gt;
&lt;H2&gt;Branch Reset: The One-Way Refresh&lt;/H2&gt;
&lt;P&gt;Branch reset instantly updates a child branch to match its parent's current state. Key word: &lt;STRONG&gt;one-way&lt;/STRONG&gt;. Parent to child only.&lt;/P&gt;
&lt;P&gt;When would you use this?&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Starting fresh on a new feature after finishing the previous one&lt;/LI&gt;
&lt;LI&gt;Your dev branch has drifted too far from production&lt;/LI&gt;
&lt;LI&gt;You want the latest production data without creating a new branch&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A few gotchas here:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Reset is a complete overwrite&lt;/STRONG&gt;—any local changes are gone&lt;/LI&gt;
&lt;LI&gt;Existing connections are temporarily interrupted (but reconnect automatically with the same connection details)&lt;/LI&gt;
&lt;LI&gt;Root branches (like &lt;CODE&gt;production&lt;/CODE&gt;) can't be reset since they have no parent&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Can't reset branches that have children&lt;/STRONG&gt;—delete the children first&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Point-in-Time Branching: Your "Oh No" Recovery Button&lt;/H2&gt;
&lt;P&gt;This is one of my favorite features. You can create a branch from any point within your restore window (configurable from 2 to 35 days).&lt;/P&gt;
&lt;P&gt;Real scenario: Someone ran a &lt;CODE&gt;DELETE FROM orders WHERE status = 'pending'&lt;/CODE&gt; without a &lt;CODE&gt;WHERE order_date &amp;lt; ...&lt;/CODE&gt; clause. Poof—three days of orders gone.&lt;/P&gt;
&lt;P&gt;With point-in-time branching:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Create a new branch set to 10 minutes before the disaster&lt;/LI&gt;
&lt;LI&gt;Connect to that branch&lt;/LI&gt;
&lt;LI&gt;Query and extract the missing records&lt;/LI&gt;
&lt;LI&gt;Insert them back into production&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;No calling support. No restoring from backups. Just branch, query, fix.&lt;/P&gt;
&lt;H2&gt;My Development Workflow (What Actually Works)&lt;/H2&gt;
&lt;P&gt;After a few weeks of using this, here's the pattern that's clicked for my team:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE&gt;production (protected)
└── development
    ├── dev/alice
    ├── dev/bob
    └── dev/charlie
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Each dev gets their own long-lived branch off &lt;CODE&gt;development&lt;/CODE&gt;. We reset them weekly to stay reasonably current with shared changes.&lt;/P&gt;
&lt;P&gt;The workflow:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Reset&lt;/STRONG&gt; your branch from &lt;CODE&gt;development&lt;/CODE&gt; to start fresh&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Develop&lt;/STRONG&gt; your feature—write migrations, test with real-ish data&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Schema Diff&lt;/STRONG&gt; against &lt;CODE&gt;development&lt;/CODE&gt; to review changes&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Apply migrations&lt;/STRONG&gt; to &lt;CODE&gt;development&lt;/CODE&gt; using our standard Alembic workflow&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Test&lt;/STRONG&gt; on &lt;CODE&gt;development&lt;/CODE&gt; with the team&lt;/LI&gt;
&lt;LI&gt;Repeat the migration promotion to &lt;CODE&gt;production&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Reset&lt;/STRONG&gt; your personal branch and start the next feature&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;For CI/CD, we spin up ephemeral branches with short expiration:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-python"&gt;import uuid
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.postgres import Branch, BranchSpec, Duration

w = WorkspaceClient()
branch_id = f"ci-{uuid.uuid4().hex[:8]}"

# Create 2-hour ephemeral branch
branch_spec = BranchSpec(
    ttl=Duration(seconds=7200),  # 2 hours
    source_branch="projects/my-project/branches/development"
)
branch = Branch(spec=branch_spec)

result = w.postgres.create_branch(
    parent="projects/my-project",
    branch=branch,
    branch_id=branch_id
).wait()

# Run integration tests against branch endpoint
# Branch auto-deletes after 2 hours
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;No more fighting over shared test databases. No more "who left test data in staging?"&lt;/P&gt;
&lt;H2&gt;How This Differs from Delta Lake Time Travel&lt;/H2&gt;
&lt;P&gt;I keep getting asked this, so let's clear it up:&lt;/P&gt;
&lt;TABLE&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH&gt;&amp;nbsp;&lt;/TH&gt;
&lt;TH&gt;Lakebase Branching&lt;/TH&gt;
&lt;TH&gt;Delta Lake Time Travel&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;What it is&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;PostgreSQL with copy-on-write&lt;/TD&gt;
&lt;TD&gt;Delta table version history&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Workload&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;OLTP (transactional)&lt;/TD&gt;
&lt;TD&gt;OLAP (analytical)&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Scope&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;Entire database&lt;/TD&gt;
&lt;TD&gt;Individual tables&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Can you write?&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;Yes, full read/write&lt;/TD&gt;
&lt;TD&gt;No, historical versions are read-only&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Syntax&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;SDK/CLI/API for branches, SQL inside&lt;/TD&gt;
&lt;TD&gt;&lt;CODE&gt;VERSION AS OF&lt;/CODE&gt;, &lt;CODE&gt;TIMESTAMP AS OF&lt;/CODE&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;Delta time travel lets you &lt;EM&gt;read&lt;/EM&gt; historical states. Lakebase branching gives you a &lt;EM&gt;writable, isolated copy&lt;/EM&gt; that starts from a point in time. Very different use cases.&lt;/P&gt;
&lt;H2&gt;Limits You'll Actually Hit&lt;/H2&gt;
&lt;P&gt;Before you go branch-crazy, here are the limits that matter:&lt;/P&gt;
&lt;TABLE&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH&gt;Resource&lt;/TH&gt;
&lt;TH&gt;Limit&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;Branches per project&lt;/TD&gt;
&lt;TD&gt;500&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Unarchived branches&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;10&lt;/STRONG&gt; (this one bites people)&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Concurrent active computes&lt;/TD&gt;
&lt;TD&gt;20 (default branch exempt)&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Databases per branch&lt;/TD&gt;
&lt;TD&gt;500&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Roles per branch&lt;/TD&gt;
&lt;TD&gt;500&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Max data size per branch&lt;/TD&gt;
&lt;TD&gt;8 TB&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Protected branches&lt;/TD&gt;
&lt;TD&gt;1 per project&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Root branches&lt;/TD&gt;
&lt;TD&gt;3 per project&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;History retention (restore window)&lt;/TD&gt;
&lt;TD&gt;2-35 days&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Branch expiration max&lt;/TD&gt;
&lt;TD&gt;30 days&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;The &lt;STRONG&gt;unarchived branches limit of 10&lt;/STRONG&gt; is the one that catches teams off guard. If you're spinning up lots of dev branches, inactive ones get archived automatically. Protected branches and default branches are exempt from archival.&lt;/P&gt;
&lt;H2&gt;The Unity Catalog Connection&lt;/H2&gt;
&lt;P&gt;You can register Lakebase databases in Unity Catalog for unified governance and cross-source queries. But here's the important part: &lt;STRONG&gt;Unity Catalog catalogs are read-only mirrors&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;You can query your Lakebase data from Databricks SQL alongside your Lakehouse tables:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-sql"&gt;-- Join OLTP data with analytics
SELECT 
    o.order_id,
    o.customer_id,
    c.lifetime_value,
    c.churn_risk_score
FROM lakebase_catalog.public.orders o
JOIN main.analytics.customer_360 c 
    ON o.customer_id = c.customer_id
WHERE o.order_date &amp;gt; CURRENT_DATE - INTERVAL '7 days';
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But if you want to &lt;EM&gt;write&lt;/EM&gt; to Lakebase, you need to connect directly to your branch endpoint. Also note: each branch requires separate catalog registration, and metadata syncs have caching—new objects may need a manual refresh to appear.&lt;/P&gt;
&lt;H2&gt;Final Thoughts&lt;/H2&gt;
&lt;P&gt;Lakebase branching isn't trying to replace Git for your code—it's bringing the same mental model to your data layer. The ability to instantly create isolated, writable copies of your database changes the development calculus entirely.&lt;/P&gt;
&lt;P&gt;No more waiting for database clones. No more "hope this migration doesn't break prod." No more shared test environments where everyone's stepping on each other.&lt;/P&gt;
&lt;P&gt;The lack of native merge is a real limitation, but it's one that forces you to treat migrations as first-class citizens anyway—which is probably what you should've been doing all along.&lt;/P&gt;
&lt;P&gt;Give it a shot on your next feature. Spin up a personal branch, break something on purpose, reset, and try again. Once you experience that workflow, going back to "let me clone the database real quick" feels like the stone age.&lt;/P&gt;
&lt;HR /&gt;
&lt;P&gt;&lt;EM&gt;Got questions about Lakebase branching? Drop them in the comments. And if you've figured out a clever workflow I haven't thought of, I'm all ears.&lt;/EM&gt;&lt;/P&gt;</description>
    <pubDate>Wed, 04 Feb 2026 12:22:36 GMT</pubDate>
    <dc:creator>AbhaySingh</dc:creator>
    <dc:date>2026-02-04T12:22:36Z</dc:date>
    <item>
      <title>Wait, Did Databricks Just Put Git Inside My Database?</title>
      <link>https://community.databricks.com/t5/community-articles/wait-did-databricks-just-put-git-inside-my-database/m-p/146805#M997</link>
      <description>&lt;H1&gt;Wait, Did Databricks Just Put Git Inside My Database?&lt;/H1&gt;
&lt;P&gt;If you've been scratching your head at Lakebase's "branching" feature wondering "am I working with a database or GitHub?"—you're not alone. Let me break down what's actually happening here, because once it clicks, it changes how you think about database development entirely.&lt;/P&gt;
&lt;H2&gt;Prerequisites&lt;/H2&gt;
&lt;P&gt;Before we dive in, make sure you've got:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A Databricks workspace on AWS (Lakebase Autoscaling is AWS-only for now)&lt;/LI&gt;
&lt;LI&gt;Your workspace in a supported region: &lt;CODE&gt;us-east-1&lt;/CODE&gt;, &lt;CODE&gt;us-east-2&lt;/CODE&gt;, &lt;CODE&gt;eu-central-1&lt;/CODE&gt;, &lt;CODE&gt;eu-west-1&lt;/CODE&gt;, &lt;CODE&gt;eu-west-2&lt;/CODE&gt;, &lt;CODE&gt;ap-south-1&lt;/CODE&gt;, &lt;CODE&gt;ap-southeast-1&lt;/CODE&gt;, or &lt;CODE&gt;ap-southeast-2&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;Lakebase Autoscaling Preview enabled by your workspace admin&lt;/LI&gt;
&lt;LI&gt;A Lakebase project created (takes about 30 seconds)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;So What Actually IS Lakebase Branching?&lt;/H2&gt;
&lt;P&gt;Here's the thing that confused me initially: Lakebase isn't Delta Lake. It's a fully managed PostgreSQL database. So when we talk about "branching," we're not talking about Delta's transaction log or time travel—we're talking about something fundamentally different.&lt;/P&gt;
&lt;P&gt;When you create a Lakebase project, you automatically get two branches: &lt;CODE&gt;production&lt;/CODE&gt; (your root/default branch) and &lt;CODE&gt;development&lt;/CODE&gt; (a child of production). From there, you can create child branches from any existing branch, building out a hierarchy that looks eerily familiar to anyone who's used Git:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE&gt;production (root - protected)
├── staging
│   └── feature-payments
└── development
    ├── dev-alice
    └── dev-bob
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Each branch is a fully independent PostgreSQL database environment. Changes you make in &lt;CODE&gt;dev-alice&lt;/CODE&gt; don't touch &lt;CODE&gt;dev-bob&lt;/CODE&gt;, and neither affects &lt;CODE&gt;production&lt;/CODE&gt;. It's complete isolation—but without the hours of data copying you'd normally need.&lt;/P&gt;
&lt;H2&gt;The Copy-on-Write Magic (Why It's Instant)&lt;/H2&gt;
&lt;P&gt;Okay, so how does a 200GB database branch in 3 seconds? The answer is copy-on-write storage, and it's actually pretty elegant.&lt;/P&gt;
&lt;P&gt;When you create a branch, Lakebase doesn't duplicate your data. Instead, the new branch just gets pointers to the same underlying storage as its parent. Think of it like Git's branching—the branch itself is essentially free because it's just referencing the same data.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE&gt;BEFORE ANY CHANGES:
                                     
production branch      dev branch (just created)
┌──────────────┐      ┌──────────────┐
│ users table  │◄─────│ → pointer    │
│ orders table │◄─────│ → pointer    │  
│ products     │◄─────│ → pointer    │
└──────────────┘      └──────────────┘
     (actual data)        (no storage cost yet)

AFTER MODIFYING users TABLE IN dev:

production branch      dev branch
┌──────────────┐      ┌──────────────┐
│ users table  │      │ users table' │ ← only this is new storage
│ orders table │◄─────│ → pointer    │
│ products     │◄─────│ → pointer    │
└──────────────┘      └──────────────┘
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The implications are huge:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Branch creation is instant&lt;/STRONG&gt; regardless of database size—10GB or 10TB, doesn't matter&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;You only pay for what changes&lt;/STRONG&gt;—modify 1GB in a 100GB database, you pay for ~1GB extra storage&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Zero performance hit&lt;/STRONG&gt; on production during branching&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2&gt;Creating Your First Branch&lt;/H2&gt;
&lt;P&gt;You can create branches through the Lakebase App UI, Python SDK, Java SDK, CLI, or REST API. Here's the UI workflow:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Open the Lakebase App from the apps switcher&lt;/LI&gt;
&lt;LI&gt;Navigate to your project's Branches page&lt;/LI&gt;
&lt;LI&gt;Click &lt;STRONG&gt;Create branch&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Give it a name (I like the pattern &lt;CODE&gt;dev/yourname&lt;/CODE&gt; for personal branches)&lt;/LI&gt;
&lt;LI&gt;Choose your source—current data or a point in time&lt;/LI&gt;
&lt;LI&gt;Click Create&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;That's it. A few seconds later, you've got a complete branch with its own compute endpoint and connection string.&lt;/P&gt;
&lt;P&gt;If you prefer code, here's the Python SDK approach:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-python"&gt;from databricks.sdk import WorkspaceClient
from databricks.sdk.service.postgres import Branch, BranchSpec, Duration

w = WorkspaceClient()

# Create a branch with 7-day expiration
branch_spec = BranchSpec(
    ttl=Duration(seconds=604800),  # 7 days in seconds
    source_branch="projects/my-project/branches/production"
)

branch = Branch(spec=branch_spec)

result = w.postgres.create_branch(
    parent="projects/my-project",
    branch=branch,
    branch_id="dev-alice"
).wait()

print(f"Branch created: {result.name}")
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Or via CLI:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-bash"&gt;databricks postgres create-branch projects/my-project dev-alice \
  --json '{
    "spec": {
      "source_branch": "projects/my-project/branches/development",
      "ttl": "604800s"
    }
  }'
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;Pro tip&lt;/STRONG&gt;: You can set branches to auto-expire. UI presets are 1 hour, 1 day, or 7 days. Via API, you can set any TTL up to 30 days max—perfect for CI/CD test branches that should clean themselves up.&lt;/P&gt;
&lt;H2&gt;Once You're IN the Branch, It's Just Postgres&lt;/H2&gt;
&lt;P&gt;Here's where it feels normal again. Once you connect to your branch (each branch has its own connection string), you're just running standard PostgreSQL:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-sql"&gt;-- Create a new table for your feature
CREATE TABLE user_preferences (
    id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id),
    theme VARCHAR(50) DEFAULT 'light',
    notifications BOOLEAN DEFAULT true,
    created_at TIMESTAMP DEFAULT NOW()
);

-- Add a column to an existing table
ALTER TABLE users ADD COLUMN last_login TIMESTAMP;

-- Create an index
CREATE INDEX idx_users_last_login ON users(last_login);

-- Insert test data
INSERT INTO user_preferences (user_id, theme) 
VALUES (1, 'dark'), (2, 'light'), (3, 'dark');
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;No special syntax. No branch-aware commands. Just write your migrations like you always have.&lt;/P&gt;
&lt;H2&gt;The Elephant in the Room: There's No Merge&lt;/H2&gt;
&lt;P&gt;Alright, here's the part that'll trip you up if you're expecting full Git semantics: &lt;STRONG&gt;Lakebase doesn't have native merge functionality&lt;/STRONG&gt;. You can't just click a button to promote changes from &lt;CODE&gt;dev-alice&lt;/CODE&gt; back to &lt;CODE&gt;development&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;The docs are clear: "To move changes from child to parent, use your standard migration tools."&lt;/P&gt;
&lt;P&gt;So what's the actual workflow? It looks like this:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Develop and test your schema changes on your feature branch&lt;/LI&gt;
&lt;LI&gt;Use &lt;STRONG&gt;Schema Diff&lt;/STRONG&gt; (more on this in a sec) to review exactly what changed&lt;/LI&gt;
&lt;LI&gt;Apply those same migrations to the parent branch using your migration framework—Alembic, Prisma, Django migrations, Flyway, whatever you use&lt;/LI&gt;
&lt;LI&gt;Reset or delete your feature branch&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;It's not as seamless as Git merge, but honestly? It forces good migration hygiene. You can't get lazy and just "merge and hope"—you have to actually track your schema changes properly.&lt;/P&gt;
&lt;H2&gt;Schema Diff: Your Pre-Merge Safety Net&lt;/H2&gt;
&lt;P&gt;This feature partially makes up for the lack of merge. Schema Diff lets you compare the DDL between any two branches, showing exactly what's different.&lt;/P&gt;
&lt;P&gt;To use it:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Navigate to your child branch in the Lakebase App&lt;/LI&gt;
&lt;LI&gt;Click &lt;STRONG&gt;Schema diff&lt;/STRONG&gt; in the Parent branch section&lt;/LI&gt;
&lt;LI&gt;Select your base branch (defaults to parent) and database&lt;/LI&gt;
&lt;LI&gt;Click Compare&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;You'll get a side-by-side view: red for removed/changed from base, green for added/changed in your branch. It captures tables, columns, constraints, indexes—all your schema objects.&lt;/P&gt;
&lt;P&gt;I've started using this before EVERY migration promotion. It's caught a few "oops, I didn't mean to add that column" moments.&lt;/P&gt;
&lt;H2&gt;Branch Reset: The One-Way Refresh&lt;/H2&gt;
&lt;P&gt;Branch reset instantly updates a child branch to match its parent's current state. Key word: &lt;STRONG&gt;one-way&lt;/STRONG&gt;. Parent to child only.&lt;/P&gt;
&lt;P&gt;When would you use this?&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Starting fresh on a new feature after finishing the previous one&lt;/LI&gt;
&lt;LI&gt;Your dev branch has drifted too far from production&lt;/LI&gt;
&lt;LI&gt;You want the latest production data without creating a new branch&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A few gotchas here:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Reset is a complete overwrite&lt;/STRONG&gt;—any local changes are gone&lt;/LI&gt;
&lt;LI&gt;Existing connections are temporarily interrupted (but reconnect automatically with the same connection details)&lt;/LI&gt;
&lt;LI&gt;Root branches (like &lt;CODE&gt;production&lt;/CODE&gt;) can't be reset since they have no parent&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Can't reset branches that have children&lt;/STRONG&gt;—delete the children first&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Point-in-Time Branching: Your "Oh No" Recovery Button&lt;/H2&gt;
&lt;P&gt;This is one of my favorite features. You can create a branch from any point within your restore window (configurable from 2 to 35 days).&lt;/P&gt;
&lt;P&gt;Real scenario: Someone ran a &lt;CODE&gt;DELETE FROM orders WHERE status = 'pending'&lt;/CODE&gt; without a &lt;CODE&gt;WHERE order_date &amp;lt; ...&lt;/CODE&gt; clause. Poof—three days of orders gone.&lt;/P&gt;
&lt;P&gt;With point-in-time branching:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Create a new branch set to 10 minutes before the disaster&lt;/LI&gt;
&lt;LI&gt;Connect to that branch&lt;/LI&gt;
&lt;LI&gt;Query and extract the missing records&lt;/LI&gt;
&lt;LI&gt;Insert them back into production&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;No calling support. No restoring from backups. Just branch, query, fix.&lt;/P&gt;
&lt;H2&gt;My Development Workflow (What Actually Works)&lt;/H2&gt;
&lt;P&gt;After a few weeks of using this, here's the pattern that's clicked for my team:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE&gt;production (protected)
└── development
    ├── dev/alice
    ├── dev/bob
    └── dev/charlie
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Each dev gets their own long-lived branch off &lt;CODE&gt;development&lt;/CODE&gt;. We reset them weekly to stay reasonably current with shared changes.&lt;/P&gt;
&lt;P&gt;The workflow:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Reset&lt;/STRONG&gt; your branch from &lt;CODE&gt;development&lt;/CODE&gt; to start fresh&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Develop&lt;/STRONG&gt; your feature—write migrations, test with real-ish data&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Schema Diff&lt;/STRONG&gt; against &lt;CODE&gt;development&lt;/CODE&gt; to review changes&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Apply migrations&lt;/STRONG&gt; to &lt;CODE&gt;development&lt;/CODE&gt; using our standard Alembic workflow&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Test&lt;/STRONG&gt; on &lt;CODE&gt;development&lt;/CODE&gt; with the team&lt;/LI&gt;
&lt;LI&gt;Repeat the migration promotion to &lt;CODE&gt;production&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Reset&lt;/STRONG&gt; your personal branch and start the next feature&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;For CI/CD, we spin up ephemeral branches with short expiration:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-python"&gt;import uuid
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.postgres import Branch, BranchSpec, Duration

w = WorkspaceClient()
branch_id = f"ci-{uuid.uuid4().hex[:8]}"

# Create 2-hour ephemeral branch
branch_spec = BranchSpec(
    ttl=Duration(seconds=7200),  # 2 hours
    source_branch="projects/my-project/branches/development"
)
branch = Branch(spec=branch_spec)

result = w.postgres.create_branch(
    parent="projects/my-project",
    branch=branch,
    branch_id=branch_id
).wait()

# Run integration tests against branch endpoint
# Branch auto-deletes after 2 hours
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;No more fighting over shared test databases. No more "who left test data in staging?"&lt;/P&gt;
&lt;H2&gt;How This Differs from Delta Lake Time Travel&lt;/H2&gt;
&lt;P&gt;I keep getting asked this, so let's clear it up:&lt;/P&gt;
&lt;TABLE&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH&gt;&amp;nbsp;&lt;/TH&gt;
&lt;TH&gt;Lakebase Branching&lt;/TH&gt;
&lt;TH&gt;Delta Lake Time Travel&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;What it is&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;PostgreSQL with copy-on-write&lt;/TD&gt;
&lt;TD&gt;Delta table version history&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Workload&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;OLTP (transactional)&lt;/TD&gt;
&lt;TD&gt;OLAP (analytical)&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Scope&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;Entire database&lt;/TD&gt;
&lt;TD&gt;Individual tables&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Can you write?&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;Yes, full read/write&lt;/TD&gt;
&lt;TD&gt;No, historical versions are read-only&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Syntax&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;SDK/CLI/API for branches, SQL inside&lt;/TD&gt;
&lt;TD&gt;&lt;CODE&gt;VERSION AS OF&lt;/CODE&gt;, &lt;CODE&gt;TIMESTAMP AS OF&lt;/CODE&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;Delta time travel lets you &lt;EM&gt;read&lt;/EM&gt; historical states. Lakebase branching gives you a &lt;EM&gt;writable, isolated copy&lt;/EM&gt; that starts from a point in time. Very different use cases.&lt;/P&gt;
&lt;H2&gt;Limits You'll Actually Hit&lt;/H2&gt;
&lt;P&gt;Before you go branch-crazy, here are the limits that matter:&lt;/P&gt;
&lt;TABLE&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH&gt;Resource&lt;/TH&gt;
&lt;TH&gt;Limit&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;Branches per project&lt;/TD&gt;
&lt;TD&gt;500&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Unarchived branches&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;10&lt;/STRONG&gt; (this one bites people)&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Concurrent active computes&lt;/TD&gt;
&lt;TD&gt;20 (default branch exempt)&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Databases per branch&lt;/TD&gt;
&lt;TD&gt;500&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Roles per branch&lt;/TD&gt;
&lt;TD&gt;500&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Max data size per branch&lt;/TD&gt;
&lt;TD&gt;8 TB&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Protected branches&lt;/TD&gt;
&lt;TD&gt;1 per project&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Root branches&lt;/TD&gt;
&lt;TD&gt;3 per project&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;History retention (restore window)&lt;/TD&gt;
&lt;TD&gt;2-35 days&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Branch expiration max&lt;/TD&gt;
&lt;TD&gt;30 days&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;The &lt;STRONG&gt;unarchived branches limit of 10&lt;/STRONG&gt; is the one that catches teams off guard. If you're spinning up lots of dev branches, inactive ones get archived automatically. Protected branches and default branches are exempt from archival.&lt;/P&gt;
&lt;H2&gt;The Unity Catalog Connection&lt;/H2&gt;
&lt;P&gt;You can register Lakebase databases in Unity Catalog for unified governance and cross-source queries. But here's the important part: &lt;STRONG&gt;Unity Catalog catalogs are read-only mirrors&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;You can query your Lakebase data from Databricks SQL alongside your Lakehouse tables:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-sql"&gt;-- Join OLTP data with analytics
SELECT 
    o.order_id,
    o.customer_id,
    c.lifetime_value,
    c.churn_risk_score
FROM lakebase_catalog.public.orders o
JOIN main.analytics.customer_360 c 
    ON o.customer_id = c.customer_id
WHERE o.order_date &amp;gt; CURRENT_DATE - INTERVAL '7 days';
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But if you want to &lt;EM&gt;write&lt;/EM&gt; to Lakebase, you need to connect directly to your branch endpoint. Also note: each branch requires separate catalog registration, and metadata syncs have caching—new objects may need a manual refresh to appear.&lt;/P&gt;
&lt;H2&gt;Final Thoughts&lt;/H2&gt;
&lt;P&gt;Lakebase branching isn't trying to replace Git for your code—it's bringing the same mental model to your data layer. The ability to instantly create isolated, writable copies of your database changes the development calculus entirely.&lt;/P&gt;
&lt;P&gt;No more waiting for database clones. No more "hope this migration doesn't break prod." No more shared test environments where everyone's stepping on each other.&lt;/P&gt;
&lt;P&gt;The lack of native merge is a real limitation, but it's one that forces you to treat migrations as first-class citizens anyway—which is probably what you should've been doing all along.&lt;/P&gt;
&lt;P&gt;Give it a shot on your next feature. Spin up a personal branch, break something on purpose, reset, and try again. Once you experience that workflow, going back to "let me clone the database real quick" feels like the stone age.&lt;/P&gt;
&lt;HR /&gt;
&lt;P&gt;&lt;EM&gt;Got questions about Lakebase branching? Drop them in the comments. And if you've figured out a clever workflow I haven't thought of, I'm all ears.&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 04 Feb 2026 12:22:36 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/wait-did-databricks-just-put-git-inside-my-database/m-p/146805#M997</guid>
      <dc:creator>AbhaySingh</dc:creator>
      <dc:date>2026-02-04T12:22:36Z</dc:date>
    </item>
    <item>
      <title>Re: Wait, Did Databricks Just Put Git Inside My Database?</title>
      <link>https://community.databricks.com/t5/community-articles/wait-did-databricks-just-put-git-inside-my-database/m-p/146816#M998</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/192145"&gt;@AbhaySingh&lt;/a&gt;&amp;nbsp;,&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;This was a fun read — and a great way to spark discussion about what “Git inside my database” really means in practice.&lt;/P&gt;
&lt;P class="p1"&gt;From what I’m seeing in the product world, Databricks isn’t literally putting Git &lt;I&gt;inside&lt;/I&gt; the storage engine of your tables — it’s &lt;I&gt;bringing Git workflows directly into the workspace UX&lt;/I&gt; so your notebooks, SQL queries, dashboards and other artifacts live in Git folders/Repos and you can branch, commit, push and pull without context-switching out of Databricks.&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;That shift has a ton of practical value for teams that want classic software engineering best practices — feature branches, CI/CD, collaboration — but it’s also worth grounding expectations a bit: the Git integration is fundamentally a workspace-level source control layer, not a metadata/time-travel layer over the &lt;I&gt;data&lt;/I&gt; in your tables. In other words, you’re not versioning your Delta lake like a Git object store here — you’re versioning the &lt;I&gt;code and queries you write against it.&lt;/I&gt;&lt;I&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class="p1"&gt;Curious to hear how folks are using this in real projects — especially around branching strategies and managing merge workflows across notebooks and SQL.&lt;/P&gt;
&lt;P class="p1"&gt;Cheers, Louis! &lt;span class="lia-unicode-emoji" title=":rocket:"&gt;🚀&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 04 Feb 2026 14:39:16 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/wait-did-databricks-just-put-git-inside-my-database/m-p/146816#M998</guid>
      <dc:creator>Louis_Frolio</dc:creator>
      <dc:date>2026-02-04T14:39:16Z</dc:date>
    </item>
  </channel>
</rss>

