--- title: "Backend branching" sidebarTitle: "Branching" description: "Spin up an isolated copy of your project to test schema and config changes" --- A branch is a child project with its own Postgres, auth config, storage, edge functions, email templates, realtime channels, and schedules. Merge back when ready or reset and retry. Available on InsForge OSS 2.1.0+. ## Concepts Each branch runs on its own EC2 instance, restored from the parent at create time. `merge` runs a three-way diff against the parent's create-time state. The branch shares the parent's `JWT_SECRET` but gets its own `API_KEY`. Compute services and frontend deployments do not branch. ## Usage Create a branch with `full` (schema + data) or `schema-only` (faster, empty user tables). ```bash npx @insforge/cli branch create feat-billing --mode full npx @insforge/cli branch list ``` Preview the merge SQL before applying. ```bash npx @insforge/cli branch merge feat-billing --dry-run --save-sql ./preview.sql npx @insforge/cli branch merge feat-billing ``` Roll back to the create-time snapshot, or delete the branch. ```bash npx @insforge/cli branch reset feat-billing npx @insforge/cli branch delete feat-billing ``` ## Specific usage cases Use a branch for risky schema migrations, RLS rewrites, OAuth provider swaps, and edge function refactors. Skip it for trivial changes and data backfills (user-data rows are not auto-merged). Merges block on conflicts. Resolve on the branch or reset and retry. Quotas: 3 parent projects per org, 2 active branches per parent, no nesting. A successful merge does not auto-delete the branch. ## More resources - [Database migrations](/core-concepts/database/migrations) for forward-only SQL files. - [Database overview](/core-concepts/database/overview) for what runs under each branch. - [CLI reference](https://github.com/InsForge/InsForge) for the full `branch` flag set.