Skip to main content

Can you put n8n workflows in git?

Yes. n8n's source control pushes workflow JSON to a Git branch, and a pull overwrites the target instance. The feature is on Business and Enterprise plans.

n8n source control and its limits.

n8n's own documentation says "you shouldn't view n8n's source control as full version control." Here is what it does and where the gaps are.

CapabilityWhat it doesWhere it stops
Storage formatPushes workflow JSON, tags, and credential stubs to a Git branchFormat is workflow JSON. The diff is node positions, connection arrays, and unchanged configuration
Diff viewShows added, modified, and deleted nodes before you pullA one-parameter change buries the reviewer in thousands of lines of JSON
MergeEnvironments map to separate branchesNo merge. A pull replaces the entire workflow. No conflict detection
RollbackCan pull a previous branch stateOverwrites everything on the target instance. No per-version revert
Pull requestsPRs happen in GitHub or GitLabn8n has no awareness of them. Review happens externally
CredentialsPushes stubs with ID, name, and typeValues not synced. Recreate credentials on each instance
AvailabilityWorks with GitHub, GitLab, and other Git providersBusiness and Enterprise plans only. Community Edition has no version control
Storage format
What it doesPushes workflow JSON, tags, and credential stubs to a Git branch
Where it stopsFormat is workflow JSON. The diff is node positions, connection arrays, and unchanged configuration
Diff view
What it doesShows added, modified, and deleted nodes before you pull
Where it stopsA one-parameter change buries the reviewer in thousands of lines of JSON
Merge
What it doesEnvironments map to separate branches
Where it stopsNo merge. A pull replaces the entire workflow. No conflict detection
Rollback
What it doesCan pull a previous branch state
Where it stopsOverwrites everything on the target instance. No per-version revert
Pull requests
What it doesPRs happen in GitHub or GitLab
Where it stopsn8n has no awareness of them. Review happens externally
Credentials
What it doesPushes stubs with ID, name, and type
Where it stopsValues not synced. Recreate credentials on each instance
Availability
What it doesWorks with GitHub, GitLab, and other Git providers
Where it stopsBusiness and Enterprise plans only. Community Edition has no version control

qbash Tasks.

A Task is an AI automation written in Python, hosted on a managed runtime. A developer writes the script; anyone runs it from a form. Integrations, model calls, version control, and logging are built in.

Model and provider agnostic.

  • Anthropic
  • OpenAI
  • Gemini
  • xAI
  • OpenRouter
  • Amazon
  • Perplexity
  • MoonshotAI
  • Meta
  • Qwen

When the automation is code, version control is built in.

A task is a Python script. Diffs are line-level and readable. Every save is a version, and any version restores in one click.

  • Every save writes a version with a line-level diff of Python. A toggle switches between the version and a diff against the one before it.
  • One-click rollback to any previous version. Restoring saves your current draft as a new version, so nothing is lost.
  • tests.py is versioned alongside the task code, so the diff shows whether the tests moved with the change.
  • Saving deploys. The new version is live on the managed runtime with no CI pipeline to configure.
  • 45+ integrations called in code, with credentials brokered server-side and shared across the org.
  • Every run is logged with status, inputs, output, errors, duration, and trigger source. Each step is recorded as it happens.
triage.py
issues = aisle.integrations.github.list_issues(
    state="open", labels="needs-triage",
)

for issue in issues:
    triage = aisle.ai.run_prompt(
        slug="triage-issue",
        variables={
            "title": issue["title"],
            "body": issue["body"],
        },
    )
    aisle.integrations.github.update_issue(
        issue["number"], labels=[triage["category"]],
    )
    aisle.integrations.slack.create_message(
        f"#{triage['team']}",
        text=f"New {triage['category']}: {issue['title']}",
    )

Easier to maintain than a node graph.

A canvas change is a JSON diff. A code change is a line you can read, approve, and revert. Every run is logged with what happened.

Line-level diffs

A change to a retry count, a prompt slug, or a routing rule shows up as the line that changed. In a workflow JSON diff, the same change is buried in thousands of lines of node positions and connection metadata.

Revisions and rollback

Every save writes a version with a changelog note, author, and timestamp. Open any version to see its code or toggle to a line-level diff against the previous one. Restore in one click, and the current draft is saved as a new version so nothing is lost.

Tests travel with the code

tests.py is versioned in the same revision as the task code. The diff shows whether the tests moved with the change, and tests run in a sandbox so they cannot fire a real integration or bill a model call.

tests.py
def test_bug_routes_to_engineering():
    result = triage_issue(
        title="App crashes on login",
        body="Stack trace: ...",
    )
    assert result["category"] == "bug"
    assert result["team"] == "engineering"

def test_feature_routes_to_product():
    result = triage_issue(
        title="Add dark mode",
        body="Would be nice to have...",
    )
    assert result["category"] == "feature"

Questions

Does n8n have version control?

On Business and Enterprise plans, n8n has source control that pushes workflow JSON to Git branches. Community Edition users have no built-in version control. Third-party tools and API-based backup workflows exist as workarounds.

Can you diff n8n workflows?

n8n's source control shows added, modified, and deleted nodes before a pull. The underlying diff is JSON, so what a reviewer sees is node positions, connection arrays, and parameter objects. A community-built visual diff tool renders the changes as a color-coded node graph.

Can you roll back an n8n workflow?

With source control, you can pull a previous branch state. Without it, you re-import an older JSON export. Neither is a one-click revert to a specific revision.

Do I need git to use qbash?

No. Version history is built into the platform. Every save is a version with a line-level diff, and any version restores in one click. There is no repo, CI pipeline, or deploy target to configure.

Is qbash open source?

No. The runtime is proprietary and there is no self-hosted edition. If self-hosting and source access are requirements, n8n is the better answer.

Can I import my n8n workflows into qbash?

There is no importer. Describe the workflow to the builder and it drafts the task as code you then edit. Budget time for it and start with something low-risk. See the full qbash vs n8n comparison for migration steps.

Competitor details reviewed . Vendors change plans and features without notice, so check theirs before deciding.

Ship your first task.

Open the editor, write a script against your connected accounts, and put it on a trigger. Or describe it, and the builder drafts the task as code you edit.