Marketplace

using-git-spice

Use when working with stacked branches, managing dependent PRs/CRs, or uncertain about git-spice commands (stack vs upstack vs downstack) - provides command reference, workflow patterns, and common pitfalls for the git-spice CLI tool

$ Installer

git clone https://github.com/arittr/spectacular /tmp/spectacular && cp -r /tmp/spectacular/skills/using-git-spice ~/.claude/skills/spectacular

// tip: Run this command in your terminal to install the skill


name: using-git-spice description: Use when working with stacked branches, managing dependent PRs/CRs, or uncertain about git-spice commands (stack vs upstack vs downstack) - provides command reference, workflow patterns, and common pitfalls for the git-spice CLI tool

Using git-spice

Overview

git-spice (gs) is a CLI tool for managing stacked Git branches and their Change Requests.

Core principle: git-spice tracks branch relationships (stacks) and automates rebasing/submitting dependent branches.

Key Concepts

Stack terminology:

  • Stack: All branches connected to current branch (both upstack and downstack)
  • Upstack: Branches built on top of current branch (children and descendants)
  • Downstack: Branches below current branch down to trunk (parents and ancestors)
  • Trunk: Main integration branch (typically main or master)

Example stack:

┌── feature-c     ← upstack from feature-b
├── feature-b     ← upstack from feature-a, downstack from feature-c
├── feature-a     ← downstack from feature-b
main (trunk)

When on feature-b:

  • Upstack: feature-c
  • Downstack: feature-a, main
  • Stack: feature-a, feature-b, feature-c

Quick Reference

TaskCommandNotes
Initialize repogs repo initRequired once per repo. Sets trunk branch.
Create stacked branchgs branch create <name>Creates branch on top of current. Use gs bc shorthand.
View stackgs log shortShows current stack. Use gs ls or gs log long (gs ll) for details.
Submit stack as PRsgs stack submitSubmits entire stack. Use gs ss shorthand.
Submit upstack onlygs upstack submitCurrent branch + children. Use gs us s shorthand.
Submit downstack onlygs downstack submitCurrent branch + parents to trunk. Use gs ds s shorthand.
Rebase entire stackgs repo restackRebases all tracked branches on their bases.
Rebase current stackgs stack restackRebases current branch's stack. Use gs sr shorthand.
Rebase upstackgs upstack restackCurrent branch + children. Use gs us r shorthand.
Move branch to new basegs upstack onto <base>Moves current + upstack to new base.
Sync with remotegs repo syncPulls latest, deletes merged branches.
Track existing branchgs branch track [branch]Adds branch to git-spice tracking.
Delete branchgs branch delete [branch]Deletes branch, restacks children. Use gs bd shorthand.

Command shortcuts: Most commands have short aliases. Use gs --help to see all aliases.

Common Workflows

Workflow 1: Create and Submit Stack

# One-time setup
gs repo init
# Prompt asks for trunk branch (usually 'main')

# Create stacked branches
gs branch create feature-a
# Make changes, commit with git
git add . && git commit -m "Implement A"

gs branch create feature-b  # Stacks on feature-a
# Make changes, commit
git add . && git commit -m "Implement B"

gs branch create feature-c  # Stacks on feature-b
# Make changes, commit
git add . && git commit -m "Implement C"

# View the stack
gs log short

# Submit entire stack as PRs
gs stack submit
# Creates/updates PRs for all branches in stack

Workflow 2: Update Branch After Review

# You have feature-a → feature-b → feature-c
# Reviewer requested changes on feature-b

git checkout feature-b
# Make changes, commit
git add . && git commit -m "Address review feedback"

# Rebase upstack (feature-c) on updated feature-b
gs upstack restack

# Submit changes to update PRs
gs upstack submit
# Note: restack only rebases locally, submit pushes and updates PRs

CRITICAL: Don't manually rebase feature-c! Use gs upstack restack to maintain stack relationships.

Workflow 3: Sync After Upstream Merge

# feature-a was merged to main
# Need to update feature-b and feature-c

# Sync with remote (pulls main, deletes merged branches)
gs repo sync

# Restack everything on new main
gs repo restack

# Verify stack looks correct
gs log short

# Push updated branches
gs stack submit

CRITICAL: Don't rebase feature-c onto main! After feature-a merges:

  • feature-b rebases onto main (its new base)
  • feature-c rebases onto feature-b (maintains dependency)

When to Use Git vs git-spice

Use git-spice for:

  • Creating branches in a stack: gs branch create
  • Rebasing stacks: gs upstack restack, gs repo restack
  • Submitting PRs: gs stack submit, gs upstack submit
  • Viewing stack structure: gs log short
  • Deleting branches: gs branch delete (restacks children)

Use git for:

  • Making changes: git add, git commit
  • Checking status: git status, git diff
  • Viewing commit history: git log
  • Individual branch operations: git checkout, git switch

Never use git rebase directly on stacked branches - use git-spice restack commands to maintain relationships.

Common Mistakes

MistakeWhy It's WrongCorrect Approach
Rebasing child onto trunk after parent mergesBreaks stack relationships, creates conflictsUse gs repo sync && gs repo restack
Using git push --force after changesBypasses git-spice trackingUse gs upstack submit or gs stack submit
Manually rebasing with git rebasegit-spice doesn't track the rebaseUse gs upstack restack or gs stack restack
Running gs stack submit on wrong branchMight submit unintended branchesCheck gs log short first to see what's in stack
Forgetting gs repo initCommands fail with unclear errorsRun gs repo init once per repository
Using stack when you mean upstackSubmits downstack branches too (parents)Use upstack to submit only current + children
Assuming restack runs automaticallyAfter commits, stack can driftExplicitly run gs upstack restack after changes

Red Flags - Check Documentation

  • Confused about stack/upstack/downstack scope
  • About to run git rebase on a tracked branch
  • Unsure which submit command to use
  • Getting "not tracked" errors

When uncertain, run gs <command> --help for detailed usage.

Authentication and Setup

First time setup:

# Authenticate with GitHub/GitLab
gs auth login
# Follow prompts for OAuth or token auth

# Initialize repository
gs repo init
# Sets trunk branch and remote

# Verify setup
gs auth status

Handling Conflicts

If gs upstack restack or gs repo restack encounters conflicts:

  1. Resolve conflicts using standard git workflow (git status, edit files, git add)
  2. Continue with git rebase --continue
  3. git-spice will resume restacking remaining branches
  4. After resolution, run gs upstack submit to push changes

If you need to abort a restack, check gs --help for recovery options.

Additional Resources