Agent skill
gitbutler-virtual-branches
This skill should be used when the user asks to "create a virtual branch", "assign file to branch", "work on multiple features simultaneously", "organize commits after coding", "use but commands", or mentions GitButler, virtual branches, parallel development without checkout, post-hoc commit organization, multi-agent concurrent development, or `--gitbutler`/`--but` flags.
Install this agent skill to your Project
npx add-skill https://github.com/outfitter-dev/agents/tree/main/plugins/but/skills/virtual-branches
Metadata
Additional technical details for this skill
- author
- outfitter
- version
- 1.0.0
- category
- version-control
- related skills
-
[ "gitbutler-multi-agent", "gitbutler-stacks", "gitbutler-complete-branch" ]
SKILL.md
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 statusto 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 resolveto 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
butfor all work within virtual branches - Use
gitonly for integrating completed work into main - Return to
gitbutler/workspaceafter 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 statusbefore usingbut rub
NEVER:
-
Use
git commiton virtual branches — breaks GitButler state -
Use
git add— GitButler manages index -
Use
git checkouton virtual branches — no checkout needed -
Push
gitbutler/integrationto remote — it's local-only -
Mix Graphite and GitButler in same repo — incompatible models
-
Pipe
but statusdirectly — causes panic; capture output first:bashstatus_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, troubleshootingreferences/examples.md— Real-world workflow patterns with commandsreferences/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
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
stack-feedback
Creates GitHub issues for problems discovered while using @outfitter/* packages. Use when finding bugs, missing features, unclear documentation, or improvement opportunities.
stack-architecture
Design stack-based systems using @outfitter/* packages. Use when planning new projects, choosing packages, designing handler architecture, or when "architecture", "design", "structure", "plan handlers", or "error taxonomy" are mentioned.
stack-templates
Templates for creating handlers, CLI commands, MCP tools, and daemon services following Outfitter Stack conventions. Use when scaffolding new components, creating handlers, adding commands, or when "create handler", "new command", "add tool", "scaffold", "template", or "daemon service" are mentioned.
stack-audit
Scan codebase for Outfitter Stack adoption candidates. Identifies throw statements, console usage, hardcoded paths, and custom errors. Use when assessing adoption scope or checking readiness.
stack-review
Audits code for Outfitter Stack compliance including Result types, error handling, logging patterns, and path safety. Use for pre-commit reviews, code quality checks, migration validation, or when "audit", "check compliance", "review stack", or "stack patterns" are mentioned.
stack-patterns
Reference for Outfitter Stack patterns including Result types, Handler contract, Error taxonomy, and @outfitter/* package conventions. Use when learning the stack, looking up patterns, understanding packages, or when "Result", "Handler", "error taxonomy", "OutfitterError", "CLI output", "pagination", "MCP server", "MCP tool", "structured logging", "redaction", "test handler", "daemon", "IPC", or "@outfitter/*" are mentioned.
Didn't find tool you were looking for?