SKILL.md
$27
2. If new branch needed:
but branch new
3. Edit files (Edit/Write tools)
4. Refresh IDs if needed
but status -fv
5. Perform mutation with IDs from status/diff/show
but ... --status-after
## Command Patterns
- Commit: `but commit <branch> -m "<msg>" --changes <id>,<id> --status-after`
- `but commit -a` is accepted as a no-op compatibility flag; GitButler already includes unstaged changes by default.
- Commit + create branch: `but commit <branch> -c -m "<msg>" --changes <id> --status-after`
- Amend: `but amend <file-id> <commit-id> --status-after`
- Reorder commits: `but move <source-commit-id> <target-commit-id> --status-after` (**commit IDs**, not branch names)
- Stack branches: `but move <branch-name-or-id> <target-branch-name-or-id> --status-after` (**branch names or branch CLI IDs**)
- Tear off a branch: `but move <branch-name-or-id> zz --status-after` (`zz` = unassigned; branch name or branch CLI ID)
- Push: `but push` or `but push <branch-id>`
- Pull: `but pull --check` then `but pull --status-after`
## Task Recipes
### Commit files
1. `but status -fv`
2. Find the CLI ID for each file you want to commit.
3. `but commit <branch> -m "<msg>" --changes <id1>,<id2> --status-after`
Use `-c` to create the branch if it doesn't exist. Omit IDs you don't want committed.
4. **Check the `--status-after` output** for remaining uncommitted changes. If the file still appears as unassigned or assigned to another branch after commit, it may be dependency-locked. See "Stacked dependency / commit-lock recovery" below.
### Amend into existing commit
1. `but status -fv` (or `but show <branch-id>`)
2. Locate file ID and target commit ID.
3. `but amend <file-id> <commit-id> --status-after`
### Reorder commits
`but move` supports both commit reordering and branch stack operations. Use commit IDs when reordering commits.
1. `but status -fv`
2. `but move <commit-a> <commit-b> --status-after` — uses commit IDs like `c3`, `c5`
3. Refresh IDs from the returned status, then run the inverse: `but move <commit-b> <commit-a> --status-after`
### Stack existing branches
To make one existing branch depend on (stack on top of) another, use top-level `move`:
but move feature/frontend feature/backend
This moves the frontend branch on top of the backend branch in one step.
**DO NOT** use `uncommit` + `branch delete` + `branch new -a` to stack existing branches. That approach fails because git branch names persist even after `but branch delete`. Always use `but move <branch> <target-branch>`.
**To unstack** (make a stacked branch independent again):
but move feature/logging zz