gitbutler-virtual-branches

GitButler Virtual Branches

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "gitbutler-virtual-branches" with this command: npx skills add outfitter-dev/agents/outfitter-dev-agents-gitbutler-virtual-branches

GitButler Virtual Branches

Virtual branches → parallel development → post-hoc organization.

<when_to_use>

  • Multiple unrelated features in same workspace simultaneously

  • Multi-agent concurrent development (agents in same repo)

  • Exploratory coding where organization comes after writing

  • Post-hoc commit reorganization needed

  • Visual organization preferred (GUI + CLI)

NOT for: projects using Graphite (incompatible models), simple linear workflows (use plain git)

</when_to_use>

This, Not That

Task This Not That

Initialize workspace but setup

manual setup

Create branch but branch new name

git checkout -b name

View changes but status

git status

Assign file to branch but rub <file-id> <branch>

manual staging

Commit to branch but commit <branch> -m "msg"

git commit -m "msg"

Move commit but rub <sha> <branch>

git cherry-pick

Squash commits but squash <branch>

git rebase -i

Undo operation but undo

git reset

Switch context Create new branch git checkout

Key difference from Git: All branches visible at once. Organize files to branches after editing. No checkout.

Core Concepts

Concept Description

Virtual branches Multiple branches applied simultaneously to working directory

Integration branch gitbutler/workspace tracks virtual branch state — never touch directly

Target branch Base branch (e.g., origin/main ) all work diverges from

File assignment Assign file hunks to branches with but rub

Oplog Operations log for undo/restore — your safety net

Quick Start

Initialize (one time)

but setup

Create branch

but branch new feature-auth

Make changes, check status for file IDs

but status

╭┄00 [Unassigned Changes]

│ m6 A src/auth.ts

Assign file to branch using ID

but rub m6 feature-auth

Commit

but commit feature-auth -m "feat: add authentication"

Core Loop

  • Create: but branch new <name>

  • Edit: Make changes in working directory

  • Check: but status to see file IDs

  • Assign: but rub <file-id> <branch-name>

  • Commit: but commit <branch> -m "message"

  • Repeat: Continue with other features in parallel

The Power of but rub

Swiss Army knife — combines entities to perform operations:

Source Target Operation

File ID Branch Assign file to branch

File ID Commit Amend commit with file

Commit SHA Branch Move commit between branches

Commit SHA Commit SHA Squash (newer into older)

Essential Commands

Command Purpose

but setup

Initialize GitButler in repository

but status

View changes and file IDs

but branch new <name>

Create virtual branch

but branch new <name> --anchor <parent>

Create stacked branch

but rub <source> <target>

Assign/move/squash/amend

but commit <branch> -m "msg"

Commit to branch

but commit <branch> -o -m "msg"

Commit only assigned files

but absorb

Auto-amend uncommitted changes to appropriate commits

but squash <commits>

Squash commits (by IDs, range, or branch)

but show <id>

Inspect a commit or branch in detail

but resolve <commit>

Enter conflict resolution mode

but push

Push branches to remote

but pr new

Create/update PRs on forge

but config forge auth

Authenticate with GitHub (OAuth)

but mark <branch>

Auto-assign new changes to branch

but unmark

Remove all mark rules from workspace

but oplog

Show operation history

but undo

Undo last operation

but oplog snapshot --message "msg"

Create manual snapshot

but pull

Update workspace with latest base

but gui

Open GitButler GUI for current repo

JSON output: Use --json or -j flag on any command: but status --json

Parallel Development

Create two independent features

but branch new feature-a but branch new feature-b

Edit files for both (same workspace!)

echo "Feature A" > feature-a.ts echo "Feature B" > feature-b.ts

Assign to respective branches

but rub <id-a> feature-a but rub <id-b> feature-b

Commit independently

but commit feature-a -m "feat: implement feature A" but commit feature-b -m "feat: implement feature B"

Both branches exist, zero conflicts, same directory

Conflict Handling

GitButler handles conflicts per-commit during rebase/update (unlike Git's all-or-nothing model):

  • Rebase continues even when some commits conflict

  • Conflicted commits marked in UI/status

  • Use but resolve to enter resolution mode per commit

  • Partial resolution can be saved for later

Update base (may cause conflicts)

but pull

Check which commits have conflicts

but status

Enter resolution mode for a specific commit

but resolve <commit-id>

Fix conflicts in your editor, then check remaining

but resolve status

Finalize when done (or cancel to abort)

but resolve finish

For detailed conflict resolution workflows, see references/reference.md#conflict-resolution .

Auto-Assignment with Marks

Set up workspace rules to auto-assign files to branches:

Auto-assign new changes to auth-feature branch

but mark auth-feature

Remove all rules

but unmark

Useful for multi-agent workflows where changes should route to a specific branch.

ALWAYS:

  • Use but for all work within virtual branches

  • Use git only for integrating completed work into main

  • Return to gitbutler/workspace after git operations: git checkout gitbutler/workspace

  • Snapshot before risky operations: but oplog snapshot --message "..."

  • Assign files immediately after creating: but rub <id> <branch>

  • Check file IDs with but status before using but rub

NEVER:

Use git commit on virtual branches — breaks GitButler state

Use git add — GitButler manages index

Use git checkout on virtual branches — no checkout needed

Push gitbutler/integration to remote — it's local-only

Mix Graphite and GitButler in same repo — incompatible models

Pipe but status directly — causes panic; capture output first:

status_output=$(but status) echo "$status_output" | head -5

Troubleshooting

Symptom Solution

Files not committing Assign first: but rub <file-id> <branch>

Broken pipe panic Capture output: output=$(but status)

Mixed git/but broke state but pull or but setup

Lost work but undo or but oplog restore <snapshot-id>

For detailed troubleshooting (branch tracking, conflicts, filename issues), see references/reference.md#troubleshooting-guide .

Recovery

Quick undo: but undo | Full restore: but oplog restore <snapshot-id> | View history: but oplog

For recovery from lost work or corrupted state, see references/reference.md#recovery-scenarios .

Reference Files

  • references/reference.md — Complete CLI reference, JSON schemas, troubleshooting

  • references/examples.md — Real-world workflow patterns with commands

  • references/ai-integration.md — Hooks, MCP server, agent lifecycle

Related Skills

  • gitbutler-multi-agent — Multi-agent coordination

  • gitbutler-stacks — Stacked branches

  • gitbutler-complete-branch — Merging to main

External

  • GitButler Docs — Official documentation

  • GitButler AI Integration — Hooks and MCP

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

codebase-recon

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

graphite-stacks

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

code-review

No summary provided by upstream source.

Repository SourceNeeds Review